Skip to content

Plattformübergreifende Sandbox (sandbox)

源码版本rust-v0.145.0

codex isoliert die Befehlsausführung in eine plattformspezifische native Sandbox: macOS nutzt sandbox-exec (seatbelt), Linux bubblewrap + seccomp, Windows restricted token. Der sandboxing-Crate abstrahiert einheitlich; linux-sandbox/, bwrap/, windows-sandbox-rs/, process-hardening/ sind die Plattformimplementierungen. core berechnet vor jedem exec den SandboxType und übergibt ihn an SandboxManager::transform, das das tatsächlich zu spawnende argv zusammenstellt.

Verantwortlichkeiten

  1. Nach PermissionProfile entscheiden, ob Sandbox aktiviert wird und welcher Backend-Typ: codex-rs/sandboxing/src/manager.rs:273-319
  2. Auf macOS seatbelt-Policy und argv für sandbox-exec zusammenstellen: codex-rs/sandboxing/src/seatbelt.rs:21-30
  3. Auf Linux den codex-linux-sandbox-Helper aufrufen: erst no_new_privs + seccomp, dann bubblewrap exec: codex-rs/linux-sandbox/src/lib.rs:1-30
  4. Auf Windows per restricted token / elevated backend Dateisystem und Netzwerk isolieren: codex-rs/windows-sandbox-rs/src/lib.rs:13-50
  5. Vor main prozessweite Hardening vornehmen (core dumps aus, ptrace verweigern, LD_PRELOAD/DYLD_* entfernen): codex-rs/process-hardening/src/lib.rs:12-25

Entwurfsbeweggründe

Warum nicht einfach den Block von execpolicy vertrauen? Weil das Modell beliebige Shell konstruieren kann und eine Regelengine immer Randfälle hat. Jeden Befehl in die OS-native Sandbox zu zwingen, ist der Rückfall „selbst wenn das Modell ausbricht, hält der Kernel". SandboxablePreference::Auto lässt policy-basierte Profile wie workspace-write / read-only die Sandbox aktivieren; das full-access-Profil fällt direkt auf SandboxType::None zurück, um unnötige Prozessverpackung zu vermeiden.

Die Backends unterscheiden sich pro Plattform, weil es keinen plattformübergreifend einheitlichen Sandbox-Primitiv gibt: macOS' seatbelt ist eine deklarative .sbpl, Linux' bubblewrap basiert auf user namespace + bind mount, Windows' restricted token auf token + ACL. Die SandboxType-Enum vereinheitlicht diese drei Backends plus None in einem einzigen Label; core/exec-server sehen nur das Label, nicht die Plattformdetails.

Wichtige Dateien

SandboxType vereinheitlicht die drei Plattform-Backends und „keine Sandbox" in einem Label; core sieht nur das Label.

rust
pub enum SandboxType {
    None,
    MacosSeatbelt,
    LinuxSeccomp,
    WindowsRestrictedToken,
}

In select_initial entscheidet erst should_sandbox, ob überhaupt eine Sandbox aktiv sein soll; dann wird die Plattform nach dem Backend gefragt:

rust
pub fn select_initial(
    &self,
    file_system_policy: &FileSystemSandboxPolicy,
    network_policy: NetworkSandboxPolicy,
    pref: SandboxablePreference,
    windows_sandbox_level: WindowsSandboxLevel,
    has_managed_network_requirements: bool,
) -> SandboxType {
    if self.should_sandbox(
        file_system_policy,
        network_policy,
        pref,
        has_managed_network_requirements,
    ) {
        get_platform_sandbox(windows_sandbox_level != WindowsSandboxLevel::Disabled)
            .unwrap_or(SandboxType::None)
    } else {
        SandboxType::None
    }
}

Der Linux-Launcher wählt zwischen System-bwrap und bundled bwrap; findet er nichts, panic — ohne bubblewrap ist die gesamte Linux-Sandbox-Kette unterbrochen.

rust
pub(crate) fn exec_bwrap(argv: Vec<String>, preserved_files: Vec<File>) -> ! {
    match preferred_bwrap_launcher() {
        BubblewrapLauncher::System(launcher) => {
            exec_system_bwrap(&launcher.program, argv, preserved_files)
        }
        BubblewrapLauncher::Bundled(launcher) => launcher.exec(argv, preserved_files),
        BubblewrapLauncher::Unavailable => {
            panic!(
                "bubblewrap is unavailable: no system bwrap was found on PATH and no bundled \
                 codex-resources/bwrap binary was found next to the Codex executable"
            )
        }
    }
}

Datenfluss

Grenzen und Fehler

Zusammenfassung

SandboxManager ist der einheitliche Einstieg der plattformübergreifenden Sandbox von codex; er übersetzt PermissionProfile in SandboxType und in ein argv mit Wrapper. Die Plattform-Backends isolieren je einzeln, leiten sich aber alle aus derselben FileSystemSandboxPolicy / NetworkSandboxPolicy ab. Um „warum wurde dieser Befehl abgelehnt" zu verfolgen, siehe Befehlsklassifikation execpolicy und Befehlsausführung exec-server.