<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>工程实践 on 搬砖程序员带你飞</title>
        <link>https://lpflpf.cn/tags/%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5/</link>
        <description>Recent content in 工程实践 on 搬砖程序员带你飞</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-CN</language>
        <managingEditor>lipengfei634626165@163.com (lpflpf)</managingEditor>
        <webMaster>lipengfei634626165@163.com (lpflpf)</webMaster>
        <lastBuildDate>Sun, 20 Sep 2026 09:00:00 +0800</lastBuildDate><atom:link href="https://lpflpf.cn/tags/%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>Codex 沙箱这版补了四个洞——你抄的那份 workspace-write 配置，可能正压在其中一条上</title>
            <link>https://lpflpf.cn/posts/codex-sandbox-boundaries-2026-09-20/</link>
            <pubDate>Sun, 20 Sep 2026 09:00:00 +0800</pubDate><author>lipengfei634626165@163.com (lpflpf)</author>
            <guid>https://lpflpf.cn/posts/codex-sandbox-boundaries-2026-09-20/</guid>
            <description>&lt;img src=&#34;https://cdn.lpflpf.cn/covers/codex-sandbox-boundaries-2026-09-20-plain.jpg&#34; alt=&#34;Featured image of post Codex 沙箱这版补了四个洞——你抄的那份 workspace-write 配置，可能正压在其中一条上&#34; /&gt;&lt;p&gt;你按教程把 &lt;code&gt;workspace-write&lt;/code&gt; 配好了，以为边界稳了。但去翻 &lt;code&gt;openai/codex&lt;/code&gt; 这个月的 commit，会发现沙箱在补的不是功能，是洞：WSL 上借 &lt;code&gt;wsl.exe&lt;/code&gt; 以 root 重进发行版、shell 快照把 broker 替换掉的假凭证还原成真的、macOS Seatbelt 里一条通配拒绝。&lt;strong&gt;给 macOS/WSL 上重度用 Codex 的人：旋钮之外，你得知道沙箱在防谁。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;先说清楚一件事，因为这决定了你该不该动：&lt;strong&gt;这几个洞不在同一个发布里&lt;/strong&gt;。其中两个已经进了 9 月 17 日的稳定版 &lt;code&gt;rust-v0.155.0&lt;/code&gt;，另外三个还只存在于 &lt;code&gt;0.156.0-alpha.*&lt;/code&gt;。很多人看到「alpha 修了安全问题」就想去升 alpha——方向反了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;审批是问不问人沙箱是批准之后还能碰什么两层的失败模式完全不同&#34;&gt;审批是「问不问人」，沙箱是「批准之后还能碰什么」——两层的失败模式完全不同&#xA;&lt;/h2&gt;&lt;p&gt;这两层经常被当成一回事，但它们坏掉的样子差很远。&lt;/p&gt;&#xA;&lt;p&gt;审批策略（&lt;code&gt;approval_policy&lt;/code&gt;）决定的是：这一步要不要停下来问人。它失败的样子是&lt;strong&gt;你误批了一次危险操作&lt;/strong&gt;——你走神了、你按了 y、你没细看那条命令。人看错了，但至少有人在看。&lt;/p&gt;&#xA;&lt;p&gt;沙箱（&lt;code&gt;sandbox_mode&lt;/code&gt; + 平台后端）决定的是：批准之后，这个进程在操作系统层面还能碰什么。它失败的样子是&lt;strong&gt;批准之后进程仍然越界&lt;/strong&gt;——没人看得到，因为审批已经过了。Seatbelt、Landlock+seccomp、Restricted Token 在做的就是这个。&lt;/p&gt;&#xA;&lt;p&gt;这个区别为什么重要？因为它解释了为什么「我审批很谨慎」不能替代读沙箱变更。你审批得再细，也审不出「&lt;code&gt;workspace-write&lt;/code&gt; 在 WSL 上开网络时，interop 能起一个沙箱外的 Windows 进程」这种事——那不是一条命令长什么样的问题，是内核边界在哪的问题。本文接下来拆的四个洞，全部属于第二层。&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;一句话分界：审批是&lt;strong&gt;人&lt;/strong&gt;的边界，沙箱是&lt;strong&gt;内核&lt;/strong&gt;的边界。人会被说服，内核不会——前提是策略写对了。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;wsl-上开网络曾经不等于文件边界还在&#34;&gt;WSL 上「开网络」曾经不等于「文件边界还在」&#xA;&lt;/h2&gt;&lt;p&gt;这是四个里已经进稳定版的两个之一，也是 WSL 用户最该回头看一眼的。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;workspace-write&lt;/code&gt; 默认不开网络。为了跑 &lt;code&gt;npm install&lt;/code&gt;、&lt;code&gt;go mod download&lt;/code&gt; 这类活，几乎所有人都会在配置里打开它：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sandbox_workspace_write&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;network_access&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;打开之后，你可能默认「文件边界还是 &lt;code&gt;workspace-write&lt;/code&gt; 那套，只是多了一条网线」。PR &lt;code&gt;#44286&lt;/code&gt;（&lt;code&gt;Block WSL interop escapes from restricted filesystem sandboxes&lt;/code&gt;）的 Why 段说的不是这样：&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;With network access enabled, WSL interop can launch Windows processes outside the Linux filesystem sandbox, including using &lt;code&gt;wsl.exe&lt;/code&gt; to reenter the distribution as root.&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;翻译成工程语言：网络一开，WSL 的 interop 机制能让你&lt;strong&gt;从 Linux 文件沙箱里跳出去，起一个 Windows 进程&lt;/strong&gt;；而这个 Windows 进程可以用 &lt;code&gt;wsl.exe&lt;/code&gt; 重新进入发行版——&lt;strong&gt;以 root&lt;/strong&gt;。绕的不是 Codex 的规则，是 Linux 沙箱这一层根本管不到 Windows 侧。&lt;/p&gt;&#xA;&lt;p&gt;修法有三条，每条都值得看一眼，因为它暴露了边界的真实形状：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;在 bubblewrap 里遮蔽 WSL interop socket&lt;/strong&gt;（仅当文件写入受限时）——把逃逸通道本身挡掉。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;在受限文件策略下拒绝 &lt;code&gt;AF_VSOCK&lt;/code&gt; socket 与 &lt;code&gt;io_uring&lt;/code&gt;&lt;/strong&gt;，&lt;strong&gt;即使普通网络访问是允许的&lt;/strong&gt;——&lt;code&gt;AF_VSOCK&lt;/code&gt; 是 VM 与宿主通信的通道，这条堵的是「经 VM socket 够到宿主服务」。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;拒绝「受限文件系统 + 不受限网络」的旧版 Landlock 配置&lt;/strong&gt;——当 WSL interop 目录存在时，这种组合直接不接受。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;注意第二条的措辞：&lt;strong&gt;开了网络，不等于所有 socket 类型都放行&lt;/strong&gt;。这是很多人对「网络访问」的隐含假设，而它不是事实。&lt;/p&gt;&#xA;&lt;p&gt;落到决策上：如果你在 WSL 上、&lt;code&gt;workspace-write&lt;/code&gt;、且开了 &lt;code&gt;network_access = true&lt;/code&gt;，那么在这个修复落地之前，你的文件边界不是你以为的那条线。修复已经在 &lt;strong&gt;&lt;code&gt;rust-v0.155.0&lt;/code&gt;（2026-09-17 发布）&lt;/strong&gt; 里了，Release Notes 的 Bug Fixes 明确列着：&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Blocked Windows-process escapes from restricted WSL sandboxes and hardened brokered shell snapshots against credential exposure. (#44286, #43909, #44040)&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;所以 WSL 用户的动作很简单：&lt;strong&gt;确认你的版本 ≥ 0.155.0&lt;/strong&gt;。不用碰 alpha。&lt;/p&gt;&#xA;&lt;h2 id=&#34;macos-的-seatbelt-这版收得比你以为的紧一条通配拒绝和一条被删掉的默认放行&#34;&gt;macOS 的 Seatbelt 这版收得比你以为的紧：一条通配拒绝，和一条被删掉的默认放行&#xA;&lt;/h2&gt;&lt;p&gt;这一节的两个改动&lt;strong&gt;还只在 alpha&lt;/strong&gt;，稳定版没有。我先说清这个前提，再讲它紧在哪。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第一条：&lt;code&gt;#46583 Deny XPC service lookups in macOS Seatbelt profiles&lt;/code&gt;。&lt;/strong&gt; 这个 PR 的 diff 只有一行，加在 &lt;code&gt;codex-rs/sandboxing/src/seatbelt.rs&lt;/code&gt; 里：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;deny&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mach-lookup&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;xpc-service-name-prefix&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;&lt;code&gt;mach-lookup&lt;/code&gt; 是查 Mach 服务的动作，XPC 是 macOS 上进程间通信的主要方式。这里的关键是 &lt;code&gt;xpc-service-name-prefix &amp;quot;&amp;quot;&lt;/code&gt;——&lt;strong&gt;空前缀匹配所有 XPC 服务名&lt;/strong&gt;。不是封某个服务，是一刀切。&lt;/p&gt;&#xA;&lt;p&gt;这一行的语义是「不许查任何 XPC 服务」。我把它写成语义直读，不写成结论：&lt;strong&gt;它在 alpha 里会不会拦坏某个依赖 XPC 的工具，需要你自己在 alpha 上实测&lt;/strong&gt;，我没跑，不下断言。但如果你在 alpha 上遇到某个工具链报奇怪的错，这是第一个该看的地方。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第二条：&lt;code&gt;#46532 Remove com.apple.runningboard from Seatbelt platform defaults&lt;/code&gt;。&lt;/strong&gt; diff 同样是一行删除，从 &lt;code&gt;seatbelt_read_only_platform_defaults.sbpl&lt;/code&gt; 里拿掉：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;global-name&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;com.apple.runningboard&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;&lt;code&gt;runningboard&lt;/code&gt; 是 macOS 管进程生命周期和调度的服务。它原本躺在「平台默认放行」清单里——那份清单的作用是：在只读受限模式下，附一段 macOS 平台策略来保住常见工具链的兼容性（官方文档把这件事描述为「append a curated macOS platform policy instead of broadly allowing &lt;code&gt;/System&lt;/code&gt;」）。&lt;strong&gt;现在它从默认放行里被拿掉了&lt;/strong&gt;，意味着依赖 runningboard 的工具链在收紧后的策略下可能不再被默认许可。&lt;/p&gt;&#xA;&lt;p&gt;两条合起来看，Seatbelt 这版的走向是：&lt;strong&gt;把「平台默认」这份宽容清单往回收，同时把 XPC 整类查询关掉。&lt;/strong&gt; 这不是小修补，是策略姿态的变化。&lt;/p&gt;&#xA;&lt;p&gt;排查顺序给你：如果你在 macOS 上、跑的是 alpha、升级后工具链报错——&lt;strong&gt;先查 XPC 通配拒绝（&lt;code&gt;#46583&lt;/code&gt;），再查 runningboard（&lt;code&gt;#46532&lt;/code&gt;）&lt;/strong&gt;，因为前者是一刀切、影响面更宽。稳定版用户不用动，这两个改动还没落地，等它进了稳定版再评估。&lt;/p&gt;&#xA;&lt;h2 id=&#34;凭证与补丁两个看不见的扩权面正在被收口&#34;&gt;凭证与补丁：两个「看不见的扩权面」正在被收口&#xA;&lt;/h2&gt;&lt;p&gt;前两节讲的是「能碰到什么」，这节讲的是「以什么身份碰」和「权限被谁悄悄放大」。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第一个扩权面：shell 快照的凭证回灌。&lt;/strong&gt; &lt;code&gt;#44040 Harden credential handling in shell snapshots and replay&lt;/code&gt; 的 Why 段写得很直白：&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Shell quoting can hide credentials from raw-text checks, and startup files can restore real credentials after the broker replaces them with dummy values.&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;两层问题。第一层，&lt;strong&gt;shell 引用能把凭证藏过纯文本检查&lt;/strong&gt;——你的密钥 &lt;code&gt;export SECRET=&amp;quot;abc&amp;quot;&lt;/code&gt;，换个引法、转义一下，字符串扫描就看不见了。第二层更微妙：Codex 的 broker 会把凭证换成假值再交给沙箱里的进程，但&lt;strong&gt;启动文件（比如 &lt;code&gt;.zshrc&lt;/code&gt;）能在替换之后把真凭证恢复回来&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;修法是「不解值地解码 shell 字面量」——只解析字面量形态，不执行它，这样引号花招藏不住；并「拒绝含凭证的可执行源码，包括 alias、function、heredoc」。另外还补了：快照回放时防住经启动文件恢复凭证、以及 &lt;code&gt;ENV&lt;/code&gt; 里的无关设置要保留（不能为了安全把环境搞坏）。&lt;/p&gt;&#xA;&lt;p&gt;对你的影响：这是安全加固，正常用法透明。&lt;strong&gt;但如果你的 shell 启动文件里有 &lt;code&gt;export&lt;/code&gt; 凭证的习惯，值得知道这条路径曾经存在&lt;/strong&gt;。这个修复同样已经在 &lt;strong&gt;&lt;code&gt;rust-v0.155.0&lt;/code&gt;&lt;/strong&gt; 里（见上节引用的 Release Notes 同一行 &lt;code&gt;#44040&lt;/code&gt;）。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第二个扩权面：&lt;code&gt;apply_patch&lt;/code&gt; 会顺手扩父目录权限。&lt;/strong&gt; &lt;code&gt;#39614 Prevent apply_patch from widening write permissions&lt;/code&gt;（merged 2026-08-20）的 Why 段：&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Deriving permissions from the parent of an already-writable patch target can unnecessarily grant write access outside the intended workspace.&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;逻辑是：补丁工具在写一个文件前会去推导它需要的目录权限。如果目标本身已经在可写范围内，&lt;strong&gt;它还是去推了父目录权限&lt;/strong&gt;——而父目录可能在工作区之外。修法是「对已被当前沙箱策略覆盖的目标，跳过推导额外父目录权限」，工作区之外的目标才继续请求父目录访问。&lt;/p&gt;&#xA;&lt;p&gt;测试覆盖里有一条值得注意：&lt;strong&gt;「symlink 逃逸出工作区」的回归测试&lt;/strong&gt;。符号链接把工作区内的路径指到外面，是这类权限推导最经典的绕过方式。&lt;/p&gt;&#xA;&lt;p&gt;对你的影响：如果你自定义过 &lt;code&gt;apply_patch&lt;/code&gt; 相关的写权限范围，值得复查一遍。这个修复 merged 于 8 月 20 日，早于 0.155.0。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;顺带一个还没进稳定版的信任变化：&lt;code&gt;codex-network-proxy&lt;/code&gt; 独立成二进制了。&lt;/strong&gt; &lt;code&gt;#46573&lt;/code&gt; 新增了 &lt;code&gt;codex-rs/network-proxy/src/main.rs&lt;/code&gt;，可以单独跑（&lt;code&gt;codex-network-proxy --config &amp;lt;PATH&amp;gt;&lt;/code&gt;），默认起 HTTP 代理 &lt;code&gt;127.0.0.1:3128&lt;/code&gt; 和 SOCKS5 &lt;code&gt;127.0.0.1:8081&lt;/code&gt;。README 里有一段要读仔细：&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;HTTPS MITM is enabled automatically when &lt;code&gt;mode = &amp;quot;limited&amp;quot;&lt;/code&gt; or when MITM hooks are configured. The CA private key remains in proxy memory.&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;开 &lt;code&gt;limited&lt;/code&gt; 模式就会自动启用 HTTPS 中间人&lt;/strong&gt;，CA 私钥留在代理内存里，公开的 CA 文件放到 &lt;code&gt;$CODEX_HOME/proxy/&lt;/code&gt; 供子进程信任。这不是漏洞——它是本地策略执行的必然代价，你要做域名白名单就得能看见明文。但你得知道自己开了什么：&lt;strong&gt;开了 &lt;code&gt;limited&lt;/code&gt;，你就是在信任一个跑在本机的中间人。&lt;/strong&gt; 另一个细节，&lt;code&gt;allow_local_binding&lt;/code&gt; 省略时「MXC 为 true，其它为 false」（&lt;code&gt;#46523&lt;/code&gt;），即托管环境默认放行本地绑定，这个默认值是在 alpha 里翻的。&lt;/p&gt;&#xA;&lt;h2 id=&#34;你是哪类用户这四处里该在意哪个&#34;&gt;你是哪类用户，这四处里该在意哪个&#xA;&lt;/h2&gt;&lt;p&gt;四个洞拆完，回到最开始那个分界：&lt;strong&gt;这些全是沙箱层的边界变更，审批层看不见它们。&lt;/strong&gt; 所以你的动作不是「把审批调严一点」，而是按平台对着查。&lt;/p&gt;&#xA;&lt;p&gt;先说最容易被带偏的一点：&lt;strong&gt;不要为了这几个修复去升 alpha。&lt;/strong&gt; alpha 一天发好几个 tag（9 月 19 日一天就有 alpha.5/6/7/8 四个），跟着它追安全修复，等于把 alpha 的回归风险一起买进来。这不是假设——稳定版 &lt;code&gt;rust-v0.155.1&lt;/code&gt;（9 月 18 日）修的就是 alpha 里带出来的回归：&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;New local TUI sessions now leave reasoning summaries disabled by default, fixing request rejection by providers that do not support them. (#46467)&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;一个默认值改动就能让请求被拒。正确姿势是&lt;strong&gt;在稳定版里等这些修复落地&lt;/strong&gt;，而不是为了几个洞去用 alpha。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;按平台对号入座：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Codex 沙箱这个月补的边界：绿色两行（#44286 WSL interop 逃逸、#44040 凭证快照回灌）已进稳定版 rust-v0.155.0；橙色四行（#46583 Seatbelt XPC 通配拒绝、#46532 移除 runningboard 默认放行、#46573 网络代理独立化与 MITM、#46523 本地绑定默认翻 true）仅在 0.156.0-alpha。每行给出改动文件、适用平台与该查的配置项。&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://cdn.lpflpf.cn/images/posts/codex-sandbox-boundaries-2026-09-20.png&#34;&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;图注：按 PR 号、改动文件、适用平台与发布状态对照六处边界变更（正文按主题归为四类：WSL interop、凭证快照、macOS Seatbelt 两条、网络代理）；绿色为已进稳定版，橙色为仅 alpha。数据来源：openai/codex 各 PR/commit 与 network-proxy README，核验日 2026-09-20。&lt;/em&gt;&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;你的情况&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;该在意哪个&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;动作&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;WSL + &lt;code&gt;workspace-write&lt;/code&gt; + 开了网络&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;#44286&lt;/code&gt;（interop 逃逸）&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;确认版本 ≥ 0.155.0，已修，不用动配置&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;macOS，跑稳定版&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;#46583&lt;/code&gt; / &lt;code&gt;#46532&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;还只在 alpha，&lt;strong&gt;不用动&lt;/strong&gt;，等落地&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;macOS，已在 alpha&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;#46583&lt;/code&gt;（XPC 通配拒绝，影响面最宽）&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;工具链报错先查这条，再查 &lt;code&gt;#46532&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;启动文件里 export 凭证&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;#44040&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;已进 0.155.0；考虑改用 broker/密钥管理，别长期写在 &lt;code&gt;.zshrc&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;自定义过 &lt;code&gt;apply_patch&lt;/code&gt; 写权限&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;#39614&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;复查权限范围，注意 symlink 指向工作区外的场景&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;只用只读分析、不开网络、不在 WSL&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;四个里三个与你无关&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;读一眼即可，别为此改配置&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;&lt;strong&gt;一份 alpha 升级判断清单&lt;/strong&gt;（真要动的时候用）：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;锁版本号。&lt;/strong&gt; 一天多个 tag，别追 latest。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;看 &lt;code&gt;prerelease&lt;/code&gt; 字段。&lt;/strong&gt; &lt;code&gt;0.156.0-alpha.8&lt;/code&gt; 是 &lt;code&gt;prerelease: true&lt;/code&gt;，API 里就能查，不用猜。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;body 为空时改看 commit 列表。&lt;/strong&gt; 这个 tag 的 release body 只有一行 &lt;code&gt;Release 0.156.0-alpha.8&lt;/code&gt;，真实内容全在 commit 里。对比范围是 &lt;code&gt;rust-v0.155.0...rust-v0.156.0-alpha.8&lt;/code&gt;（434 commits、300 个文件）——注意这是从上一个稳定版起的&lt;strong&gt;全量&lt;/strong&gt;，不是「本版新增功能」，别把 commit 数当功能量。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;只 grep 边界相关的目录&lt;/strong&gt;，别通读：&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git log --oneline rust-v0.155.0..rust-v0.156.0-alpha.8 -- codex-rs/sandboxing codex-rs/linux-sandbox&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;关键词锁定：&lt;code&gt;sandbox&lt;/code&gt; / &lt;code&gt;seatbelt&lt;/code&gt; / &lt;code&gt;landlock&lt;/code&gt; / &lt;code&gt;bwrap&lt;/code&gt; / &lt;code&gt;credential&lt;/code&gt; / &lt;code&gt;escape&lt;/code&gt;。这四个洞全是这么捞出来的。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;配置复查三问&lt;/strong&gt;，今天就能答：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;我在 WSL 上开了网络吗？版本是不是 ≥ 0.155.0？&lt;/li&gt;&#xA;&lt;li&gt;我的 shell 启动文件里有没有 &lt;code&gt;export&lt;/code&gt; 凭证？&lt;/li&gt;&#xA;&lt;li&gt;我有没有自定义过 &lt;code&gt;apply_patch&lt;/code&gt; 的写权限范围？&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;最后说清本文的边界。&lt;/strong&gt; 上面所有断言来自 commit message 与源码 diff，&lt;strong&gt;没有做运行时验证&lt;/strong&gt;——我没在 alpha 上跑过 Seatbelt 那两条改动，所以「会不会拦坏某个工具」我不断言，只给排查顺序。&lt;code&gt;434 commits&lt;/code&gt; 是从 &lt;code&gt;0.155.0&lt;/code&gt; 到 &lt;code&gt;alpha.8&lt;/code&gt; 的全量，不代表本版功能量。还有一类人本文基本不适用：只做只读分析、从不开网络、也不在 WSL 上跑的——这四个洞三个跟你无关，读完知道有这么回事就行。&lt;/p&gt;&#xA;&lt;p&gt;真正的动作只有一个：&lt;strong&gt;去 &lt;code&gt;codex --version&lt;/code&gt; 看一眼，WSL 用户确认 ≥ 0.155.0，其他人别动。&lt;/strong&gt; 至于「沙箱这一版在防谁」，把这几个目录的 commit log 加进你的季度巡检，比读任何一篇教程都管用。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;每条断言对应哪个-commit&#34;&gt;每条断言对应哪个 commit&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;openai/codex&lt;/code&gt; Release &lt;code&gt;rust-v0.156.0-alpha.8&lt;/code&gt;（&lt;code&gt;prerelease: true&lt;/code&gt;，published 2026-09-19T17:20:24Z，body 仅一行）— &lt;a class=&#34;link&#34; href=&#34;https://github.com/openai/codex/releases/tag/rust-v0.156.0-alpha.8&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/openai/codex/releases/tag/rust-v0.156.0-alpha.8&lt;/a&gt; ，访问 2026-09-20&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;openai/codex&lt;/code&gt; Release &lt;code&gt;rust-v0.155.0&lt;/code&gt;（published 2026-09-17T23:14:43Z；Bug Fixes 含 &lt;code&gt;#44286, #43909, #44040&lt;/code&gt;）— &lt;a class=&#34;link&#34; href=&#34;https://github.com/openai/codex/releases/tag/rust-v0.155.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/openai/codex/releases/tag/rust-v0.155.0&lt;/a&gt; ，访问 2026-09-20&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;openai/codex&lt;/code&gt; Release &lt;code&gt;rust-v0.155.1&lt;/code&gt;（published 2026-09-18T20:03:04Z；&lt;code&gt;#46467&lt;/code&gt; reasoning summary 默认值回归热修）— &lt;a class=&#34;link&#34; href=&#34;https://github.com/openai/codex/releases/tag/rust-v0.155.1&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/openai/codex/releases/tag/rust-v0.155.1&lt;/a&gt; ，访问 2026-09-20&lt;/li&gt;&#xA;&lt;li&gt;PR &lt;code&gt;#44286 Block WSL interop escapes from restricted filesystem sandboxes&lt;/code&gt;（merged 2026-09-09T19:43:56Z，改 5 文件）— &lt;a class=&#34;link&#34; href=&#34;https://github.com/openai/codex/pull/44286&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/openai/codex/pull/44286&lt;/a&gt; ，访问 2026-09-20&lt;/li&gt;&#xA;&lt;li&gt;PR &lt;code&gt;#46583 Deny XPC service lookups in macOS Seatbelt profiles&lt;/code&gt;（merged 2026-09-19T03:03:54Z；diff 新增 &lt;code&gt;(deny mach-lookup (xpc-service-name-prefix &amp;quot;&amp;quot;))&lt;/code&gt; 于 &lt;code&gt;codex-rs/sandboxing/src/seatbelt.rs&lt;/code&gt;）— &lt;a class=&#34;link&#34; href=&#34;https://github.com/openai/codex/pull/46583&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/openai/codex/pull/46583&lt;/a&gt; ，访问 2026-09-20&lt;/li&gt;&#xA;&lt;li&gt;PR &lt;code&gt;#46532 Remove com.apple.runningboard from Seatbelt platform defaults&lt;/code&gt;（merged 2026-09-19T00:20:16Z；从 &lt;code&gt;seatbelt_read_only_platform_defaults.sbpl&lt;/code&gt; 删除该行）— &lt;a class=&#34;link&#34; href=&#34;https://github.com/openai/codex/pull/46532&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/openai/codex/pull/46532&lt;/a&gt; ，访问 2026-09-20&lt;/li&gt;&#xA;&lt;li&gt;PR &lt;code&gt;#44040 Harden credential handling in shell snapshots and replay&lt;/code&gt;（merged 2026-09-09T04:00:23Z，改 21 文件）— &lt;a class=&#34;link&#34; href=&#34;https://github.com/openai/codex/pull/44040&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/openai/codex/pull/44040&lt;/a&gt; ，访问 2026-09-20&lt;/li&gt;&#xA;&lt;li&gt;PR &lt;code&gt;#39614 Prevent apply_patch from widening write permissions&lt;/code&gt;（merged 2026-08-20T06:23:27Z，改 3 文件）— &lt;a class=&#34;link&#34; href=&#34;https://github.com/openai/codex/pull/39614&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/openai/codex/pull/39614&lt;/a&gt; ，访问 2026-09-20&lt;/li&gt;&#xA;&lt;li&gt;PR &lt;code&gt;#46573 Add a standalone network proxy binary with JSON configuration&lt;/code&gt;（merged 2026-09-19T02:09:19Z）— &lt;a class=&#34;link&#34; href=&#34;https://github.com/openai/codex/pull/46573&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/openai/codex/pull/46573&lt;/a&gt; ，访问 2026-09-20&lt;/li&gt;&#xA;&lt;li&gt;PR &lt;code&gt;#46523 Default local binding to true for MXC managed networking&lt;/code&gt;（merged 2026-09-19T00:00:15Z）— &lt;a class=&#34;link&#34; href=&#34;https://github.com/openai/codex/pull/46523&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/openai/codex/pull/46523&lt;/a&gt; ，访问 2026-09-20&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;codex-rs/network-proxy/README.md&lt;/code&gt;（MITM 自动启用、CA 私钥驻内存、端口默认值、&lt;code&gt;allow_local_binding&lt;/code&gt; 默认）— &lt;a class=&#34;link&#34; href=&#34;https://github.com/openai/codex/blob/main/codex-rs/network-proxy/README.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/openai/codex/blob/main/codex-rs/network-proxy/README.md&lt;/a&gt; ，访问 2026-09-20&lt;/li&gt;&#xA;&lt;li&gt;仓库数据：star 125,307 / fork 19,449，Apache-2.0，描述 &lt;code&gt;Lightweight coding agent that runs in your terminal&lt;/code&gt;（GitHub API 核验，2026-09-20）&lt;/li&gt;&#xA;&lt;li&gt;对比范围：&lt;code&gt;compare/rust-v0.155.0...rust-v0.156.0-alpha.8&lt;/code&gt; = 434 commits / 300 files（GitHub API 核验，2026-09-20）&lt;/li&gt;&#xA;&lt;li&gt;官方权限文档（Seatbelt 平台策略的 &lt;code&gt;curated platform policy&lt;/code&gt; 描述、&lt;code&gt;codex debug&lt;/code&gt; / &lt;code&gt;codex sandbox&lt;/code&gt; 入口）— &lt;a class=&#34;link&#34; href=&#34;https://www.codex-docs.com/en/docs/agent-approvals-security&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.codex-docs.com/en/docs/agent-approvals-security&lt;/a&gt; ，访问 2026-09-20&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item></channel>
</rss>
