// Copyright 2022 The ChromiumOS Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. use crate::IntegrityLevel; use crate::JobLevel; use crate::Semantics; use crate::SubSystem; use crate::TokenLevel; use crate::JOB_OBJECT_UILIMIT_DESKTOP; use crate::JOB_OBJECT_UILIMIT_DISPLAYSETTINGS; use crate::JOB_OBJECT_UILIMIT_EXITWINDOWS; use crate::JOB_OBJECT_UILIMIT_READCLIPBOARD; use crate::JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS; use crate::JOB_OBJECT_UILIMIT_WRITECLIPBOARD; /// Policy struct for describing how a sandbox `TargetPolicy` should be /// constructed for a particular process. pub struct Policy { pub initial_token_level: TokenLevel, pub lockdown_token_level: TokenLevel, pub integrity_level: IntegrityLevel, pub delayed_integrity_level: IntegrityLevel, pub job_level: JobLevel, pub ui_exceptions: u32, pub alternate_desktop: bool, pub alternate_winstation: bool, pub exceptions: Vec, pub dll_blocklist: Vec, } /// Rule struct describing a sandbox rule that should be added to the /// `TargetPolicy`. pub struct Rule { pub subsystem: SubSystem, pub semantics: Semantics, pub pattern: String, } /// Policy for the main emulator process. pub const MAIN: Policy = Policy { // Token levels and integrity levels needed for access to hypervisor APIs. initial_token_level: TokenLevel::USER_RESTRICTED_SAME_ACCESS, lockdown_token_level: TokenLevel::USER_RESTRICTED_NON_ADMIN, integrity_level: IntegrityLevel::INTEGRITY_LEVEL_MEDIUM, // Needed for access to audio APIs. delayed_integrity_level: IntegrityLevel::INTEGRITY_LEVEL_LOW, // Needed for access to UI APIs. job_level: JobLevel::JOB_LIMITED_USER, ui_exceptions: JOB_OBJECT_UILIMIT_READCLIPBOARD | JOB_OBJECT_UILIMIT_WRITECLIPBOARD, // Needed to display window on main desktop. alternate_desktop: false, alternate_winstation: false, exceptions: vec![], dll_blocklist: vec![], }; /// Policy for the metrics process. pub const METRICS: Policy = Policy { // Needed for access to WinINet. initial_token_level: TokenLevel::USER_NON_ADMIN, lockdown_token_level: TokenLevel::USER_NON_ADMIN, integrity_level: IntegrityLevel::INTEGRITY_LEVEL_LOW, delayed_integrity_level: IntegrityLevel::INTEGRITY_LEVEL_LOW, job_level: JobLevel::JOB_LOCKDOWN, ui_exceptions: 0, alternate_desktop: true, alternate_winstation: true, exceptions: vec![], dll_blocklist: vec![], }; /// Policy for a block device process. pub const BLOCK: Policy = Policy { initial_token_level: TokenLevel::USER_RESTRICTED_NON_ADMIN, lockdown_token_level: TokenLevel::USER_LOCKDOWN, // INTEGRITY_LEVEL_MEDIUM needed to open disk file. integrity_level: IntegrityLevel::INTEGRITY_LEVEL_MEDIUM, delayed_integrity_level: IntegrityLevel::INTEGRITY_LEVEL_UNTRUSTED, job_level: JobLevel::JOB_LOCKDOWN, ui_exceptions: 0, alternate_desktop: true, alternate_winstation: true, exceptions: vec![], dll_blocklist: vec![], }; /// Policy for the network process. pub const NET: Policy = Policy { // Needed to connect to crash handler. initial_token_level: TokenLevel::USER_INTERACTIVE, lockdown_token_level: TokenLevel::USER_LOCKDOWN, // Process won't start below this level as loading ntdll will fail. integrity_level: IntegrityLevel::INTEGRITY_LEVEL_LOW, delayed_integrity_level: IntegrityLevel::INTEGRITY_LEVEL_UNTRUSTED, job_level: JobLevel::JOB_LOCKDOWN, ui_exceptions: 0, alternate_desktop: true, alternate_winstation: true, exceptions: vec![], dll_blocklist: vec![], }; /// Policy for the slirp process. pub const SLIRP: Policy = Policy { // Needed to connect to crash handler. initial_token_level: TokenLevel::USER_INTERACTIVE, // Needed for access to winsock. lockdown_token_level: TokenLevel::USER_LIMITED, // Needed for access to winsock. integrity_level: IntegrityLevel::INTEGRITY_LEVEL_LOW, delayed_integrity_level: IntegrityLevel::INTEGRITY_LEVEL_UNTRUSTED, job_level: JobLevel::JOB_LOCKDOWN, ui_exceptions: 0, alternate_desktop: true, alternate_winstation: true, exceptions: vec![], dll_blocklist: vec![], }; /// Policy for the GPU process. pub const GPU: Policy = Policy { initial_token_level: TokenLevel::USER_RESTRICTED_SAME_ACCESS, lockdown_token_level: TokenLevel::USER_RESTRICTED_NON_ADMIN, integrity_level: IntegrityLevel::INTEGRITY_LEVEL_MEDIUM, delayed_integrity_level: IntegrityLevel::INTEGRITY_LEVEL_LOW, // Needed for access to UI APIs. job_level: JobLevel::JOB_LIMITED_USER, // needed for copy and paste. READ_CLIPBOARD/WRITE_CLIPBOARD are already implicit in // JOB_LIMITED_USER. It's not clear why these are needed for copy&paste, but verified that // removing any one of these UILIMITS break paste into the emulator. ui_exceptions: JOB_OBJECT_UILIMIT_DESKTOP | JOB_OBJECT_UILIMIT_DISPLAYSETTINGS | JOB_OBJECT_UILIMIT_EXITWINDOWS | JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS, // Needed to display window on main desktop. alternate_desktop: false, alternate_winstation: false, exceptions: vec![], dll_blocklist: vec![], }; /// Policy for the sound process. pub const SND: Policy = Policy { // Needed for CoInitializeEx. initial_token_level: TokenLevel::USER_RESTRICTED_SAME_ACCESS, // Needed for subsequent CoCreateInstance requests. lockdown_token_level: TokenLevel::USER_RESTRICTED_NON_ADMIN, // Needed for access to audio APIs. integrity_level: IntegrityLevel::INTEGRITY_LEVEL_LOW, delayed_integrity_level: IntegrityLevel::INTEGRITY_LEVEL_LOW, job_level: JobLevel::JOB_LOCKDOWN, ui_exceptions: 0, alternate_desktop: true, alternate_winstation: true, exceptions: vec![], dll_blocklist: vec![], };