Skip to content

Commit a6ca39c

Browse files
authored
permissions: derive legacy exec policies at boundaries (#19737)
## Why After config and requirements store canonical profiles, exec requests should not cache a derived `SandboxPolicy`. The cached legacy value can drift from the richer profile state, and most execution paths already have the filesystem and network runtime policies they need. ## What Changed - Removes `sandbox_policy` from `codex_sandboxing::SandboxExecRequest` and `codex_core::sandboxing::ExecRequest`. - Adds an on-demand `ExecRequest::compatibility_sandbox_policy()` helper for the Windows and legacy call sites that still need a `SandboxPolicy` projection. - Updates Windows filesystem override setup and unified exec policy serialization to derive that compatibility policy at the boundary. - Updates Unix escalation reruns and direct shell requests to reconstruct exec requests from `PermissionProfile` plus runtime filesystem/network policy, without carrying a cached legacy policy. - Adjusts sandboxing manager tests to assert the effective profile rather than the removed legacy field. ## Verification - `cargo check -p codex-config -p codex-core -p codex-sandboxing -p codex-app-server -p codex-cli -p codex-tui` - `cargo test -p codex-sandboxing manager` - `cargo test -p codex-core exec_server_params_use_env_policy_overlay_contract` - `cargo test -p codex-core unix_escalation` - `cargo test -p codex-core exec::tests` - `cargo test -p codex-core sandboxing::tests`
1 parent 523e4aa commit a6ca39c

8 files changed

Lines changed: 18 additions & 31 deletions

File tree

codex-rs/core/src/exec.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -321,10 +321,11 @@ pub fn build_exec_request(
321321
exec_req.windows_sandbox_level,
322322
exec_req.network.is_some(),
323323
);
324+
let sandbox_policy = exec_req.compatibility_sandbox_policy();
324325
exec_req.windows_sandbox_filesystem_overrides = if use_windows_elevated_backend {
325326
resolve_windows_elevated_filesystem_overrides(
326327
exec_req.sandbox,
327-
&exec_req.sandbox_policy,
328+
&sandbox_policy,
328329
&exec_req.file_system_sandbox_policy,
329330
exec_req.network_sandbox_policy,
330331
sandbox_cwd,
@@ -333,7 +334,7 @@ pub fn build_exec_request(
333334
} else {
334335
resolve_windows_restricted_token_filesystem_overrides(
335336
exec_req.sandbox,
336-
&exec_req.sandbox_policy,
337+
&sandbox_policy,
337338
&exec_req.file_system_sandbox_policy,
338339
exec_req.network_sandbox_policy,
339340
sandbox_cwd,
@@ -349,6 +350,7 @@ pub(crate) async fn execute_exec_request(
349350
stdout_stream: Option<StdoutStream>,
350351
after_spawn: Option<Box<dyn FnOnce() + Send>>,
351352
) -> Result<ExecToolCallOutput> {
353+
let sandbox_policy = exec_request.compatibility_sandbox_policy();
352354
let ExecRequest {
353355
command,
354356
cwd,
@@ -362,8 +364,6 @@ pub(crate) async fn execute_exec_request(
362364
windows_sandbox_level,
363365
windows_sandbox_private_desktop,
364366
permission_profile: _,
365-
sandbox_policy,
366-
// TODO(mbolin): Use file_system_sandbox_policy instead of sandbox_policy.
367367
file_system_sandbox_policy: _,
368368
network_sandbox_policy,
369369
windows_sandbox_filesystem_overrides,

codex-rs/core/src/sandboxing/mod.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ pub struct ExecRequest {
5555
pub windows_sandbox_level: WindowsSandboxLevel,
5656
pub windows_sandbox_private_desktop: bool,
5757
pub permission_profile: PermissionProfile,
58-
pub sandbox_policy: SandboxPolicy,
5958
pub file_system_sandbox_policy: FileSystemSandboxPolicy,
6059
pub network_sandbox_policy: NetworkSandboxPolicy,
6160
pub(crate) windows_sandbox_filesystem_overrides: Option<WindowsSandboxFilesystemOverrides>,
@@ -80,12 +79,6 @@ impl ExecRequest {
8079
let windows_sandbox_policy_cwd = cwd.clone();
8180
let (file_system_sandbox_policy, network_sandbox_policy) =
8281
permission_profile.to_runtime_permissions();
83-
let sandbox_policy = compatibility_sandbox_policy_for_permission_profile(
84-
&permission_profile,
85-
&file_system_sandbox_policy,
86-
network_sandbox_policy,
87-
cwd.as_path(),
88-
);
8982
Self {
9083
command,
9184
cwd,
@@ -99,14 +92,22 @@ impl ExecRequest {
9992
windows_sandbox_level,
10093
windows_sandbox_private_desktop,
10194
permission_profile,
102-
sandbox_policy,
10395
file_system_sandbox_policy,
10496
network_sandbox_policy,
10597
windows_sandbox_filesystem_overrides: None,
10698
arg0,
10799
}
108100
}
109101

102+
pub(crate) fn compatibility_sandbox_policy(&self) -> SandboxPolicy {
103+
compatibility_sandbox_policy_for_permission_profile(
104+
&self.permission_profile,
105+
&self.file_system_sandbox_policy,
106+
self.network_sandbox_policy,
107+
self.windows_sandbox_policy_cwd.as_path(),
108+
)
109+
}
110+
110111
pub(crate) fn from_sandbox_exec_request(
111112
request: SandboxExecRequest,
112113
options: ExecOptions,
@@ -121,7 +122,6 @@ impl ExecRequest {
121122
windows_sandbox_level,
122123
windows_sandbox_private_desktop,
123124
permission_profile,
124-
sandbox_policy,
125125
file_system_sandbox_policy,
126126
network_sandbox_policy,
127127
arg0,
@@ -153,7 +153,6 @@ impl ExecRequest {
153153
windows_sandbox_level,
154154
windows_sandbox_private_desktop,
155155
permission_profile,
156-
sandbox_policy,
157156
file_system_sandbox_policy,
158157
network_sandbox_policy,
159158
windows_sandbox_filesystem_overrides: None,

codex-rs/core/src/tasks/user_shell.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ use codex_protocol::protocol::ExecCommandBeginEvent;
2929
use codex_protocol::protocol::ExecCommandEndEvent;
3030
use codex_protocol::protocol::ExecCommandSource;
3131
use codex_protocol::protocol::ExecCommandStatus;
32-
use codex_protocol::protocol::SandboxPolicy;
3332
use codex_protocol::protocol::TurnStartedEvent;
3433
use codex_sandboxing::SandboxType;
3534
use codex_shell_command::parse_command::parse_command;
@@ -195,7 +194,6 @@ pub(crate) async fn execute_user_shell_command(
195194
.permissions
196195
.windows_sandbox_private_desktop,
197196
permission_profile: permission_profile.clone(),
198-
sandbox_policy: SandboxPolicy::DangerFullAccess,
199197
file_system_sandbox_policy: permission_profile.file_system_sandbox_policy(),
200198
network_sandbox_policy: permission_profile.network_sandbox_policy(),
201199
windows_sandbox_filesystem_overrides: None,

codex-rs/core/src/tools/runtimes/shell/unix_escalation.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ use codex_protocol::protocol::AskForApproval;
4040
use codex_protocol::protocol::GuardianCommandSource;
4141
use codex_protocol::protocol::NetworkPolicyRuleAction;
4242
use codex_protocol::protocol::ReviewDecision;
43-
use codex_protocol::protocol::SandboxPolicy;
4443
use codex_sandboxing::SandboxCommand;
4544
use codex_sandboxing::SandboxManager;
4645
use codex_sandboxing::SandboxTransformRequest;
@@ -143,7 +142,6 @@ pub(super) async fn try_run_zsh_fork(
143142
windows_sandbox_level,
144143
windows_sandbox_private_desktop: _windows_sandbox_private_desktop,
145144
permission_profile,
146-
sandbox_policy,
147145
file_system_sandbox_policy,
148146
network_sandbox_policy,
149147
windows_sandbox_filesystem_overrides: _windows_sandbox_filesystem_overrides,
@@ -161,7 +159,6 @@ pub(super) async fn try_run_zsh_fork(
161159
command,
162160
cwd: sandbox_cwd,
163161
permission_profile,
164-
sandbox_policy,
165162
file_system_sandbox_policy,
166163
network_sandbox_policy,
167164
sandbox,
@@ -260,7 +257,6 @@ pub(crate) async fn prepare_unified_exec_zsh_fork(
260257
command: exec_request.command.clone(),
261258
cwd: exec_request.cwd.clone(),
262259
permission_profile: exec_request.permission_profile.clone(),
263-
sandbox_policy: exec_request.sandbox_policy.clone(),
264260
file_system_sandbox_policy: exec_request.file_system_sandbox_policy.clone(),
265261
network_sandbox_policy: exec_request.network_sandbox_policy,
266262
sandbox: exec_request.sandbox,
@@ -742,7 +738,6 @@ struct CoreShellCommandExecutor {
742738
command: Vec<String>,
743739
cwd: AbsolutePathBuf,
744740
permission_profile: PermissionProfile,
745-
sandbox_policy: SandboxPolicy,
746741
file_system_sandbox_policy: FileSystemSandboxPolicy,
747742
network_sandbox_policy: NetworkSandboxPolicy,
748743
sandbox: SandboxType,
@@ -796,7 +791,6 @@ impl ShellCommandExecutor for CoreShellCommandExecutor {
796791
windows_sandbox_level: self.windows_sandbox_level,
797792
windows_sandbox_private_desktop: false,
798793
permission_profile: self.permission_profile.clone(),
799-
sandbox_policy: self.sandbox_policy.clone(),
800794
file_system_sandbox_policy: self.file_system_sandbox_policy.clone(),
801795
network_sandbox_policy: self.network_sandbox_policy,
802796
windows_sandbox_filesystem_overrides: None,

codex-rs/core/src/unified_exec/process_manager.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -664,7 +664,8 @@ impl UnifiedExecProcessManager {
664664

665665
#[cfg(target_os = "windows")]
666666
if request.sandbox == codex_sandboxing::SandboxType::WindowsRestrictedToken {
667-
let policy_json = serde_json::to_string(&request.sandbox_policy).map_err(|err| {
667+
let sandbox_policy = request.compatibility_sandbox_policy();
668+
let policy_json = serde_json::to_string(&sandbox_policy).map_err(|err| {
668669
UnifiedExecError::create_process(format!(
669670
"failed to serialize Windows sandbox policy: {err}"
670671
))

codex-rs/core/src/unified_exec/process_manager_tests.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@ fn exec_server_params_use_env_policy_overlay_contract() {
110110
windows_sandbox_level: codex_protocol::config_types::WindowsSandboxLevel::Disabled,
111111
windows_sandbox_private_desktop: false,
112112
permission_profile,
113-
sandbox_policy,
114113
file_system_sandbox_policy,
115114
network_sandbox_policy,
116115
windows_sandbox_filesystem_overrides: None,

codex-rs/sandboxing/src/manager.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ pub struct SandboxExecRequest {
8080
pub windows_sandbox_level: WindowsSandboxLevel,
8181
pub windows_sandbox_private_desktop: bool,
8282
pub permission_profile: PermissionProfile,
83-
pub sandbox_policy: SandboxPolicy,
8483
pub file_system_sandbox_policy: FileSystemSandboxPolicy,
8584
pub network_sandbox_policy: NetworkSandboxPolicy,
8685
pub arg0: Option<String>,
@@ -262,7 +261,6 @@ impl SandboxManager {
262261
windows_sandbox_level,
263262
windows_sandbox_private_desktop,
264263
permission_profile: effective_permission_profile,
265-
sandbox_policy: effective_policy,
266264
file_system_sandbox_policy: effective_file_system_policy,
267265
network_sandbox_policy: effective_network_policy,
268266
arg0: arg0_override,

codex-rs/sandboxing/src/manager_tests.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ use codex_protocol::permissions::FileSystemSandboxEntry;
1515
use codex_protocol::permissions::FileSystemSandboxPolicy;
1616
use codex_protocol::permissions::FileSystemSpecialPath;
1717
use codex_protocol::permissions::NetworkSandboxPolicy;
18-
use codex_protocol::protocol::NetworkAccess;
19-
use codex_protocol::protocol::SandboxPolicy;
2018
use codex_utils_absolute_path::AbsolutePathBuf;
2119
use dunce::canonicalize;
2220
use pretty_assertions::assert_eq;
@@ -152,9 +150,9 @@ fn transform_additional_permissions_enable_network_for_external_sandbox() {
152150
.expect("transform");
153151

154152
assert_eq!(
155-
exec_request.sandbox_policy,
156-
SandboxPolicy::ExternalSandbox {
157-
network_access: NetworkAccess::Enabled,
153+
exec_request.permission_profile,
154+
PermissionProfile::External {
155+
network: NetworkSandboxPolicy::Enabled,
158156
}
159157
);
160158
assert_eq!(

0 commit comments

Comments
 (0)