Codex 源码解析 · 第 22 讲
Codex 源码解析系列 第 22 讲:Linux bwrap 沙箱 基于 OpenAI Codex 源码 · 2026-10-15 💡 本讲一句话: Codex 的 Linux 沙箱是"两阶段"的——外层用 bubblewrap(bwrap)搭一个只读文件系统视图 + 命名空间隔离,内层再进同一个二进制、验证能力已清零后套上 seccomp。读完你能看懂 bwrap.rs / linux_run_main.rs 如何把权限声明变成挂载参数,以及 WSL1 为什么被拒之门外。 一、定位:sandboxing crate 的 Linux 后端实现 上一讲(第 21 讲)拆完 Sandbox Manager 的决策与分发,Linux 分支最终落到一个辅助二进制 codex-linux-sandbox 。本讲进入它的内部—— linux-sandbox crate (约 7.6K LOC),核心两个文件: 🔹 bwrap.rs(2783 行) :把权限画像翻译成 bubblewrap 的挂载参数——只读根、可写根、受保护子路径、网络模式; 🔹 linux_run_main.rs(1599 行) :辅助二进制的入口,编排"两阶段执行"——外层 bwrap 搭视图,内层套 seccomp。 先看模块头部的官方注释(linux-sandbox/src/bwrap.rs 第 1-11 行),它把整个 Linux 沙箱的组成说得很清楚: 📄 codex-rs/linux-sandbox/src/bwrap.rs (第 1-11 行) //! Bubblewrap-based filesystem sandboxing for Linux. // 模块定位:基于 bubblewrap 的 Linux 文件系统沙箱 //! This module mirrors the semantics used by the macOS Seatbelt sandbox: // 语义对齐 macOS Seatbelt——跨平台行为一致是设计目标 //! - the filesystem is read-only by default, // 默认只读:白名单式放行,而非黑名单拦截 //! - explicit writable roots are layered on top, // 可写根目录逐层叠加上去 //! - sensitive subpaths such as `.git`, `.agents`, and `.codex` remain // 敏感子路径(.git/.agents/.codex)即使父目录可写也保持只读 //! read-only even when their parent root is writable. // ——防止模型误改仓库元数据或 Codex 自身配置 //! The overall Linux sandbox is composed of: // Linux 沙箱由两部分组成: //! - seccomp + `PR_SET_NO_NEW_PRIVS` applied in-process, // seccomp + no_new_privs:进程内施加,限制系统调用与提权 //! - bubblewrap used to construct the filesystem view before exec. // bwrap:exec 前构建文件系统视图(命名空间隔离) 为什么这样设计: "默认只读 + 白名单叠加"是安全沙箱的经典范式——比"全盘可写 + 黑名单拦截"可靠得多,因为漏掉一个危险路径的代价完全不同。而 .git / .agents / .codex 三个受保护子路径单独点名,是因为它们承载了 仓库历史、智能体状态和 Codex 自身配置 ——模型即使被授权写项目目录,也不应该能篡改这些"元数据"。这是把产品级安全语义直接编码进了沙箱层。 控制 bwrap 行为的选项结构体(第 60-109 行): 📄 codex-rs/linux-sandbox/src/bwrap.rs (第 60-109 行) /// Options that control how bubblewrap is invoked. //…
阅读全文:Codex 源码解析 第 22 讲