<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>V8 on 搬砖程序员带你飞</title>
        <link>https://lpflpf.cn/tags/v8/</link>
        <description>Recent content in V8 on 搬砖程序员带你飞</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-CN</language>
        <managingEditor>lipengfei634626165@163.com (lpflpf)</managingEditor>
        <webMaster>lipengfei634626165@163.com (lpflpf)</webMaster>
        <lastBuildDate>Thu, 17 Sep 2026 09:00:00 +0800</lastBuildDate><atom:link href="https://lpflpf.cn/tags/v8/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>Codex 内嵌的 V8 打了 152.2.0 的标签，代码里却还锁着 150.4.0</title>
            <link>https://lpflpf.cn/posts/codex-v8-152-2026-09-17/</link>
            <pubDate>Thu, 17 Sep 2026 09:00:00 +0800</pubDate><author>lipengfei634626165@163.com (lpflpf)</author>
            <guid>https://lpflpf.cn/posts/codex-v8-152-2026-09-17/</guid>
            <description>&lt;img src=&#34;https://cdn.lpflpf.cn/covers/codex-v8-152-2026-09-17-plain.jpg&#34; alt=&#34;Featured image of post Codex 内嵌的 V8 打了 152.2.0 的标签，代码里却还锁着 150.4.0&#34; /&gt;&lt;p&gt;9 月 16 日 12:58:44Z，openai/codex 打了一个标签：&lt;code&gt;rusty-v8-v152.2.0&lt;/code&gt;。42 个产物，release 说明栏是空的。&lt;/p&gt;&#xA;&lt;p&gt;而两天前，也就是 9 月 15 日，这个仓库合并了一个 commit（#45760），标题是&amp;quot;Disable V8 optimization paths affected by array sort bugs&amp;quot;。它干的是一件事：&lt;strong&gt;在 code-mode 运行时初始化时，把 Maglev、Turbolev 和 TurboFan 的数组内建内联全部关掉&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;把这两件事按顺序读一遍，你会发现一个比&amp;quot;又发版了&amp;quot;有意思得多的信号：&lt;strong&gt;产物已经走到 152.2.0，而仓库主线还锁在 150.4.0&lt;/strong&gt;。这个时差就是本文要拆的东西。&lt;/p&gt;&#xA;&lt;p&gt;先说清楚边界：&lt;strong&gt;官方没有就 152.2.0 发布任何说明&lt;/strong&gt;，本文不讨论这次升级有什么性能收益——仓库里查不到，我不猜。所有结论都能在下面给出的一手链接里逐条核对。&lt;/p&gt;&#xA;&lt;h2 id=&#34;先纠正一个我刚踩过的坑15220-不在-main-上&#34;&gt;先纠正一个我刚踩过的坑：152.2.0 不在 main 上&#xA;&lt;/h2&gt;&lt;p&gt;写这篇之前最容易犯的错，是看到 9 月 16 日的新标签，就顺手写下&amp;quot;&lt;code&gt;Cargo.toml&lt;/code&gt; 里 &lt;code&gt;v8 = &amp;quot;=152.2.0&amp;quot;&lt;/code&gt;&amp;quot;。&lt;/p&gt;&#xA;&lt;p&gt;不对。&lt;/p&gt;&#xA;&lt;p&gt;截至 2026-09-17 抓取的 &lt;code&gt;main&lt;/code&gt; 分支，&lt;code&gt;codex-rs/Cargo.toml&lt;/code&gt; 第 524 行写的是：&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-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;nx&#34;&gt;v8&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;=150.4.0&amp;#34;&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;Cargo.lock&lt;/code&gt; 第 16565–16568 行坐实了这一点：&lt;code&gt;name = &amp;quot;v8&amp;quot;&lt;/code&gt;、&lt;code&gt;version = &amp;quot;150.4.0&amp;quot;&lt;/code&gt;、checksum &lt;code&gt;42a978ff…3a49&lt;/code&gt;。&lt;code&gt;third_party/v8/README.md&lt;/code&gt; 里的那张表也还停在旧值：&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Current pinned versions:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Rust crate: &lt;code&gt;v8 = =150.4.0&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Embedded upstream V8 source for Bazel-produced release builds: &lt;code&gt;15.0.245.2&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;所以&lt;strong&gt;打了一个 tag ≠ 主线换了版本&lt;/strong&gt;。仓库里的 &lt;code&gt;third_party/v8/README.md&lt;/code&gt; 甚至把升版流程写成了六步，第 1 步就是&amp;quot;改 crate 版本并刷新 Cargo.lock&amp;quot;；而 9-16 那个 tag 对应的是这套流程的产物发布环节。CI 里还专门有个 &lt;code&gt;v8-canary.yml&lt;/code&gt;，在正式升版前跑金丝雀。&lt;strong&gt;一条变更要走过&amp;quot;打标签产出 42 个归档 → 改 Cargo.toml/lock → 改 MODULE.bazel → 金丝雀验证&amp;quot;好几道门，任何一道没走完，主线就不会动。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这是本文第一条可以直接搬走的判断：&lt;strong&gt;判断一个内嵌引擎的升级&amp;quot;是否真的生效&amp;quot;，看 &lt;code&gt;Cargo.toml&lt;/code&gt; 和 &lt;code&gt;Cargo.lock&lt;/code&gt;，不要看 release 列表。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;旁证在产物那一侧。这个 tag 的 42 个产物明显分成两族：&lt;code&gt;librusty_v8_release_&amp;lt;target&amp;gt;.a.gz&lt;/code&gt;（6 个）和 &lt;code&gt;librusty_v8_ptrcomp_sandbox_release_&amp;lt;target&amp;gt;.a.gz&lt;/code&gt;（24 个，Windows 上是 &lt;code&gt;.lib.gz&lt;/code&gt;），两族都配了 &lt;code&gt;src_binding_*.rs&lt;/code&gt; 和 &lt;code&gt;.sha256&lt;/code&gt;。为什么必须两族并存，第四节会算这笔账。&lt;/p&gt;&#xA;&lt;h2 id=&#34;那个真正值得看的-commit说的是排序会写坏数组&#34;&gt;那个真正值得看的 commit，说的是&amp;quot;排序会写坏数组&amp;quot;&#xA;&lt;/h2&gt;&lt;p&gt;回到 9 月 15 日。commit &lt;code&gt;aaa2cabfb&lt;/code&gt;（PR #45760，作者 Kevin Liu）的正文是这么写的：&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;The pinned V8 can inline &lt;code&gt;Array.prototype.sort&lt;/code&gt; with incompatible element kinds when a comparator mutates the array, allowing an object to be stored in an integer-elements array.&lt;/p&gt;&#xA;&lt;p&gt;Disable Maglev, Turbolev, and TurboFan array builtin inlining during code-mode runtime initialization until the V8 artifacts include the upstream fix.&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;翻成人话：&lt;strong&gt;我这版 V8 在比较函数自己改了数组的情况下，会用一个类型不对的元素把整数数组写坏。在我们的产物拿到上游修复之前，先把相关的优化通道关掉。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;落地在 &lt;code&gt;codex-rs/code-mode-runtime/src/v8_init.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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;v8&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;V8&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;set_flags_from_string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;--no-maglev --no-turbolev --no-turbo-inline-array-builtins&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&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;codex-rs/code-mode-runtime/tests/array_sort.rs&lt;/code&gt;：它故意请求顶层优化和 Maglev 优化，然后在比较函数里 &lt;code&gt;values.fill(0)&lt;/code&gt; 把数组类型换掉，最后断言&amp;quot;排序没有把对象塞进整数元素数组&amp;quot;，同时确认普通数字排序 &lt;code&gt;[3,1,2].sort((a,b)=&amp;gt;a-b)&lt;/code&gt; 仍然返回 &lt;code&gt;[1,2,3]&lt;/code&gt;。测试注释里那句话很直白：&lt;strong&gt;&amp;ldquo;Request Turbolev so initialization must also disable its Maglev frontend.&amp;rdquo;&lt;/strong&gt;——它就是要确保这两个前端真的被关掉了。&lt;/p&gt;&#xA;&lt;p&gt;这和 &lt;code&gt;Array.prototype.sort&lt;/code&gt; 的一个历史漏洞方向一致。NVD 上的 CVE-2026-85046 描述是&amp;quot;V8 中的类型混淆，Chrome 152.0.7977.82 之前，攻击者可用一个构造的 HTML 页面在沙箱内执行任意代码&amp;quot;，CVSS 3.1 由 CISA-ADP 给出 &lt;strong&gt;8.8（HIGH）&lt;/strong&gt;，向量 &lt;code&gt;AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H&lt;/code&gt;，CWE-843。它同时在 &lt;strong&gt;CISA 的 Known Exploited Vulnerabilities 目录里&lt;/strong&gt;，入库日期 2026-09-04，要求 2026-09-18 前完成缓解。&lt;/p&gt;&#xA;&lt;p&gt;但这里必须把话说准，这是初稿最容易写错的地方：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;仓库里的代码没有点名这个 CVE。&lt;/strong&gt; 没有 &lt;code&gt;CVE-2026-85046&lt;/code&gt; 这个字符串，也没有名为 &lt;code&gt;v8_array_sort_elements_kind.patch&lt;/code&gt; 的补丁文件（&lt;code&gt;patches/&lt;/code&gt; 目录下只有 &lt;code&gt;v8_module_deps.patch&lt;/code&gt;、&lt;code&gt;v8_bazel_rules.patch&lt;/code&gt;、&lt;code&gt;v8_source_portability.patch&lt;/code&gt; 等常规移植补丁）。commit 的措辞是&amp;quot;array sort bugs&amp;quot;，注释里给的是 v8 上游的修复 commit 链接 &lt;code&gt;e0562d87&lt;/code&gt;，而 NVD 页面上 CVE-2026-85046 恰好也引用了同一个 commit。&lt;/p&gt;&#xA;&lt;p&gt;所以正确的写法是：&lt;strong&gt;Codex 在关掉这些优化通道的同一天前后，V8 上游有一个被 CISA 列入已知利用目录的排序类型混淆漏洞在修，两者高度吻合；但仓库从未把它标注成 CVE-2026-85046。&lt;/strong&gt; 把引用链接放在一起是事实，说&amp;quot;他们就是为这个 CVE 打的补丁&amp;quot;是推测。&lt;/p&gt;&#xA;&lt;p&gt;而且注意版本算术：本仓库现在锁的 &lt;code&gt;crate 150.4.0&lt;/code&gt; 对应上游 V8 &lt;code&gt;15.0.245.2&lt;/code&gt;，NVD 列的受影响范围是 &lt;strong&gt;V8 &amp;lt; 15.3.48&lt;/strong&gt;——也就是说这个基座在修复范围之外，仓库里的降级标志和它自洽。顺着 rusty_v8 的版本规则（crate 大版本跟 Chrome 大版本走，&lt;code&gt;152.2.0&lt;/code&gt; 对应 &lt;code&gt;15.2.*&lt;/code&gt;，rusty_v8 README 首页标的 V8 版本就是 &lt;code&gt;15.2.124.1&lt;/code&gt;）也能推出来：&lt;strong&gt;光换成 152.2.0 这一档，仍然没跨过 15.3.48 这条线。&lt;/strong&gt; 这是&amp;quot;升个版本号就好了&amp;quot;这个直觉最容易翻车的地方。&lt;/p&gt;&#xA;&lt;p&gt;至于那三个 &lt;code&gt;--no-&lt;/code&gt; 开关本身，它是&lt;strong&gt;运行时的临时规避&lt;/strong&gt;，不是补丁：仓库没有回填任何 V8 C++ 源码改动。注释里&amp;quot;until our V8 artifacts include the upstream fix&amp;quot;已经写明了它的保质期。等产物换代，这三行就该被删掉——所以你读到时请以你自己看到的 &lt;code&gt;main&lt;/code&gt; 为准。&lt;/p&gt;&#xA;&lt;h2 id=&#34;一个等号三个数字两套构建系统&#34;&gt;一个等号、三个数字、两套构建系统&#xA;&lt;/h2&gt;&lt;p&gt;现在回到那个&amp;quot;为什么一条变更要分好几步&amp;quot;的问题。答案在依赖声明本身。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;codex-rs/Cargo.toml&lt;/code&gt; 第 524 行那个 &lt;code&gt;=150.4.0&lt;/code&gt;，前面是&lt;strong&gt;等号&lt;/strong&gt;。不是 &lt;code&gt;^&lt;/code&gt;，不是 &lt;code&gt;~&lt;/code&gt;，是精确到补丁位的锁定。整个工作区里，真正启用 V8 的只有 &lt;code&gt;code-mode-runtime&lt;/code&gt; 一个 crate：&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-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;nx&#34;&gt;v8&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;workspace&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;features&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;v8_enable_sandbox&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&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;一个做代码模式的运行时，把 JS 引擎精确锁死，还专门打开沙箱特性——这三条摆在一起说明 V8 在这里的身份&lt;strong&gt;不是&amp;quot;依赖&amp;quot;，而是&amp;quot;构建产物&amp;quot;&lt;/strong&gt;。差别很大：普通依赖你写 &lt;code&gt;^&lt;/code&gt;，上游修 bug 你自动拿到；构建产物你必须自己产、自己发、自己验，pin 死意味着升级节奏由你自己排。&lt;/p&gt;&#xA;&lt;p&gt;然后是那个最容易被忽略的事实：&lt;strong&gt;这里的 V8 有两个版本号。&lt;/strong&gt; crate 版本 &lt;code&gt;150.4.0&lt;/code&gt;，内嵌的上游 V8 源码版本 &lt;code&gt;15.0.245.2&lt;/code&gt;。这两个数不是一回事——rusty_v8 的大版本跟着 Chrome 的发布节奏走（README 原话：new major version every 4 weeks），而真正被编进二进制的 C++ 源码是那一版 V8 标号。改一个数不改另一个，链接期就出问题。&lt;/p&gt;&#xA;&lt;p&gt;为什么会这么脆？因为&lt;strong&gt;同时存在两条构建路径&lt;/strong&gt;，而它们的产物不是一回事：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;本地 Cargo 构建&lt;/strong&gt;默认走上游 denoland 预编译的 rusty_v8 归档。这是 rusty_v8 的默认行为——README 写得很清楚：&lt;code&gt;cargo build&lt;/code&gt; 会从 GitHub 下载静态库，要改成源码编译得设 &lt;code&gt;V8_FROM_SOURCE=1&lt;/code&gt;。这条路最省事，但它是&lt;strong&gt;上游原味的&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;CI 和发布构建&lt;/strong&gt;把 &lt;code&gt;RUSTY_V8_ARCHIVE&lt;/code&gt; / &lt;code&gt;RUSTY_V8_SRC_BINDING_PATH&lt;/code&gt; 两个环境变量指到 openai/codex 自己发布的产物上。README 里那句警告是硬规则：&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Do not mix artifacts across crate versions. The archive and binding must match the exact resolved &lt;code&gt;v8&lt;/code&gt; crate version in &lt;code&gt;codex-rs/Cargo.lock&lt;/code&gt;.&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;为什么绑定文件也要管？&lt;code&gt;src_binding_*.rs&lt;/code&gt; 是从那一版 V8 的 C++ 头文件生成的 FFI 声明。&lt;strong&gt;库和声明来自不同版本，链接期就会以一堆不知所云的符号错误收场&lt;/strong&gt;——这类错误对不熟的人极难查，所以它值得被写成一条禁令。&lt;/p&gt;&#xA;&lt;p&gt;还有一层更现实的成本，README 自己承认了：&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;MSVC is not part of the Bazel-produced matrix yet. The repository&amp;rsquo;s current hermetic Windows C++ platform is &lt;code&gt;windows-gnullvm&lt;/code&gt;/&lt;code&gt;x86_64-w64-windows-gnu&lt;/code&gt;, so it cannot truthfully reproduce upstream&amp;rsquo;s &lt;code&gt;*-pc-windows-msvc&lt;/code&gt; archives until we add a real MSVC-targeting C++ toolchain to the Bazel graph.&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;翻译一下：&lt;strong&gt;他们的 Bazel 能自产 Darwin / Linux GNU / Linux musl / Windows GNU 的产物，但 MSVC 那一档造不出来，只能回到上游 rusty_v8 源码单独产一份&lt;/strong&gt;，而那份没有沙箱特性。所以 README 里也直说 Windows MSVC 仍然用上游的非沙箱预编译件。&lt;/p&gt;&#xA;&lt;p&gt;再配上 &lt;code&gt;MODULE.bazel&lt;/code&gt; 第 771 行那套：&lt;code&gt;bazel_dep(name = &amp;quot;v8&amp;quot;, version = &amp;quot;15.0.245.2&amp;quot;)&lt;/code&gt; 加一个 &lt;code&gt;archive_override&lt;/code&gt;，直接指向 &lt;code&gt;v8/v8&lt;/code&gt; 仓库的 &lt;code&gt;15.0.245.2.tar.gz&lt;/code&gt; 并挂上三个移植补丁——&lt;strong&gt;Bazel 这条路是&amp;quot;拉上游源码 + 自己打移植补丁 + 自己编&amp;quot;&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&amp;ldquo;内嵌 V8&amp;quot;听起来是把一个引擎装进二进制，实际是把 Chrome 的构建矩阵装进你的 CI。&lt;/strong&gt; 两套构建系统、一条自建发布流水线、一条金丝雀流水线、一个要自己维护的校验和清单，外加一个暂时补不上的平台缺口——这是小团队基本扛不动的账。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1tb-是虚拟地址沙箱管的是内存不是-api&#34;&gt;1TB 是虚拟地址，沙箱管的是内存不是 API&#xA;&lt;/h2&gt;&lt;p&gt;最后一节说清楚最容易被误读的一点，因为整篇的主张都压在它身上：&lt;code&gt;v8_enable_sandbox&lt;/code&gt; &lt;strong&gt;不是&lt;/strong&gt;&amp;ldquo;让 JS 不能干坏事&amp;quot;的沙箱。&lt;/p&gt;&#xA;&lt;p&gt;rusty_v8 README 的定义是这样的：&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;&lt;code&gt;v8_enable_sandbox&lt;/code&gt;: Enables v8 sandbox mode. The v8 sandbox enables improved safety while executing potentially malicious JavaScript code through the use of memory cages. Note that the v8 sandbox will allocate ~1TB of virtual memory (although this should not be an issue as many operating systems allow 128-256TB of virtual memory per process). Creating isolates with the sandbox enabled comes with API limitations and may have increased overhead. Note that enabling the V8 sandbox also implies pointer compression to be enabled as well.&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;四个要点，一个都不能省：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;它是内存笼子，管的是内存安全。&lt;/strong&gt; V8 官方 sandbox 的设计目标是限制 V8 自身内存破坏漏洞的影响范围——把裸指针换成&amp;quot;相对沙箱基址的偏移&amp;quot;或&amp;quot;沙箱外指针表的索引&amp;rdquo;，让引擎一旦被攻破，也只能在进程虚拟地址空间的一个子集里动。它&lt;strong&gt;不负责&lt;/strong&gt;限制你能调哪些 API。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;那&amp;quot;1TB&amp;quot;是虚拟地址预留，不是内存占用。&lt;/strong&gt; README 自己补了一句&amp;quot;很多操作系统允许每进程 128–256TB 虚拟内存&amp;rdquo;。写成&amp;quot;吃 1TB 内存&amp;quot;是硬错误——物理内存该多少还是多少。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;它是实验性特性，而且隐含打开指针压缩。&lt;/strong&gt; README 明确把这些 feature 归到&amp;quot;Experimental Features&amp;quot;，理由是&amp;quot;not as well tested and do not undergo any sort of CI related testing or prebuilt archives&amp;quot;——所以它们&lt;strong&gt;必须&lt;/strong&gt;配合 &lt;code&gt;V8_FROM_SOURCE=1&lt;/code&gt; 或自建归档使用。这也正是上一节那 42 个产物里&amp;quot;普通族&amp;quot;和&amp;quot;ptrcomp_sandbox 族&amp;quot;必须并存的原因：&lt;strong&gt;上游默认发布的预编译件里没有沙箱版&lt;/strong&gt;，想要沙箱就得自己产。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;它只在 64 位可用。&lt;/strong&gt; 指针压缩加共享 cage 这套机制决定了这一点。&lt;/p&gt;&#xA;&lt;p&gt;那&amp;quot;限制 JS 能干什么&amp;quot;谁来做？宿主自己做。Codex 的做法不神秘，&lt;code&gt;code-mode-runtime/src/runtime/globals.rs&lt;/code&gt; 里就是两步：&lt;strong&gt;先删掉 &lt;code&gt;console&lt;/code&gt;、&lt;code&gt;Atomics&lt;/code&gt;、&lt;code&gt;SharedArrayBuffer&lt;/code&gt;、&lt;code&gt;WebAssembly&lt;/code&gt; 这些全局对象，再把受控接口装上去&lt;/strong&gt;——&lt;code&gt;tools&lt;/code&gt;、&lt;code&gt;ALL_TOOLS&lt;/code&gt;，以及 &lt;code&gt;text&lt;/code&gt; / &lt;code&gt;image&lt;/code&gt; / &lt;code&gt;audio&lt;/code&gt; / &lt;code&gt;generatedImage&lt;/code&gt; / &lt;code&gt;store&lt;/code&gt; / &lt;code&gt;load&lt;/code&gt; / &lt;code&gt;notify&lt;/code&gt; / &lt;code&gt;yield_control&lt;/code&gt; / &lt;code&gt;exit&lt;/code&gt; / &lt;code&gt;setTimeout&lt;/code&gt; / &lt;code&gt;clearTimeout&lt;/code&gt; 这些助手函数。模型写的 JS 调 &lt;code&gt;tools.xxx()&lt;/code&gt;，那是一个绑到 Rust 侧的回调（&lt;code&gt;runtime/callbacks.rs&lt;/code&gt;）。&lt;strong&gt;JS 世界里存在什么，完全由宿主说了算。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;顺带把最常被混写的一层边界讲清：&lt;strong&gt;终端命令的执行走的是 OS 级沙箱&lt;/strong&gt;（macOS Seatbelt、Linux Landlock、Windows 那套），仓库里对应 &lt;code&gt;codex-linux-sandbox&lt;/code&gt;、&lt;code&gt;windows-sandbox-rs&lt;/code&gt; 这些独立 crate，跟 V8 没有任何关系。V8 沙箱管的是&amp;quot;JS 通过引擎漏洞打到宿主进程内存&amp;quot;，OS 沙箱管的是&amp;quot;进程能碰哪些文件和网络&amp;quot;。Codex 是两层都做——&lt;strong&gt;不是二选一，是各管一段。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;还有一处克制但很说明问题的设计。&lt;code&gt;codex-rs/v8-poc/src/lib.rs&lt;/code&gt; 里有个函数直接绑定 &lt;code&gt;v8__V8__IsSandboxEnabled()&lt;/code&gt; 符号，注释写明&amp;quot;rusty_v8 exposes this symbol for its own sandbox verification tests&amp;quot;：&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;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7&#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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#[must_use]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;pub&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;fn&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;linked_v8_has_sandbox&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-&amp;gt; &lt;span class=&#34;kt&#34;&gt;bool&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;unsafe&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;extern&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;fn&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;v8__V8__IsSandboxEnabled&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-&amp;gt; &lt;span class=&#34;kt&#34;&gt;bool&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;unsafe&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;v8__V8__IsSandboxEnabled&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&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;w&#34;&gt;&#xA;&lt;/span&gt;&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;strong&gt;他们不信构建配置，直接问链接进来的那个库：你到底带没带沙箱。&lt;/strong&gt; 一个跑在别人二进制里的安全特性，值得这样验一次。&lt;/p&gt;&#xA;&lt;h2 id=&#34;换不换取决于你能不能接住-cve-的回填节奏&#34;&gt;换不换，取决于你能不能接住 CVE 的回填节奏&#xA;&lt;/h2&gt;&lt;p&gt;回到你面前那个决策：Agent 要执行模型生成的代码，三条路怎么选。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;进程外容器&lt;/strong&gt;（Docker / E2B / Daytona）——隔离最彻底，代价是冷启动和运维，你得自己管生命周期、文件系统、网络和密钥策略。TanStack AI 的文档里就有一条 Daytona 驱动器，明确写着&amp;quot;your application remains responsible for sandbox lifecycle, filesystem, network, cleanup, and secret policy&amp;quot;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;QuickJS + WASM&lt;/strong&gt;——把一个小引擎整体放到边界后面，是现在很主流的做法。LangChain 那篇讲 deep agents 的文章把机制讲得很清楚：因为 QuickJS 跑在 WASM 里，&amp;ldquo;we serialize the interpreter&amp;rsquo;s linear memory to LangGraph state, and on resume the harness restores the snapshot and feeds the result back into the call that was waiting on it&amp;rdquo;——&lt;strong&gt;能把一个跑到一半的程序整体冻结、存进状态、几天后恢复&lt;/strong&gt;，这是内嵌 V8 那类&amp;quot;贴着宿主进程&amp;quot;的方案很难做的动作。代价是性能，TanStack 的文档对这一点很诚实：&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Performance note: QuickJS interprets JavaScript rather than JIT-compiling it, so compute-heavy scripts run slower than with the Node driver. For typical LLM-generated scripts that are mostly waiting on external tool calls, this difference is not significant.&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;这句是别人家产品的文档&lt;/strong&gt;，只能说&amp;quot;解释器路线在多数场景够用&amp;quot;，不能当成我们对 Codex 的性能评价。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;内嵌真 V8&lt;/strong&gt;——你要的是真实 JS 语义（async/await、正则、Proxy、复杂对象）+ 贴近宿主 + 内存笼子，代价就是前两节那笔账。&lt;/p&gt;&#xA;&lt;p&gt;判断依据可以压成五个自问：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;一、模型生成的代码到底需要多少 JS 语义？&lt;/strong&gt; 只是顺序调几个工具，QuickJS/WASM 足够；要真的写异步编排、跑正则、用 Proxy，才轮到真 V8。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;二、你的分发平台有几个？&lt;/strong&gt; musl、aarch64、Windows MSVC 全都要的话，&lt;strong&gt;任何一个没有现成的沙箱产物，就得你自己产&lt;/strong&gt;——Codex 自己就还卡在 MSVC 这一步，而它们的 Bazel 矩阵已经是同级别里相当完整的那一档了。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;三、你能跟上上游 V8 的安全修复节奏吗？&lt;/strong&gt; 跟不上就得像他们一样 pin 住，然后等 CVE 出现时评估自己受不受影响、要不要临时关掉几个优化通道。注意这条链上的每一环都是真实的运维动作：这次 &lt;code&gt;--no-maglev --no-turbolev&lt;/code&gt; 是 &lt;strong&gt;9 月 15 日&lt;/strong&gt;合的，而 CISA 要求相关单位 &lt;strong&gt;9 月 18 日&lt;/strong&gt;前完成缓解——&lt;strong&gt;中间只隔三天&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;四、你的 CI 里塞得下第二个构建系统吗？&lt;/strong&gt; &lt;code&gt;cargo build&lt;/code&gt; 的默认行为是&lt;strong&gt;从 GitHub 下载预编译静态库&lt;/strong&gt;，离线或受限网络环境会直接失败（仓库里就有一个已关闭的 issue #16105 叫&amp;quot;nix build error - rusty_v8 download issue&amp;quot;），于是你又多一个 &lt;code&gt;RUSTY_V8_ARCHIVE&lt;/code&gt; 要维护。想省掉这一层就用 &lt;code&gt;RUSTY_V8_MIRROR&lt;/code&gt; 建本地镜像缓存，代价是又多一份要同步的东西。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;五、你的安全诉求是&amp;quot;隔离文件和网络&amp;quot;还是&amp;quot;隔离内存破坏&amp;quot;？&lt;/strong&gt; 前者是 OS 沙箱的事，后者才是 &lt;code&gt;v8_enable_sandbox&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;h2 id=&#34;这件事明天可以怎么用&#34;&gt;这件事明天可以怎么用&#xA;&lt;/h2&gt;&lt;p&gt;先给你三条&lt;strong&gt;能立刻跑&lt;/strong&gt;的自查命令，用来确认你自己的 V8 依赖处在什么状态：&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;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9&#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;&lt;span class=&#34;c1&#34;&gt;# 1. 你的 v8 crate 是精确 pin 还是区间依赖？&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;grep -n &lt;span class=&#34;s1&#34;&gt;&amp;#39;^v8&amp;#39;&lt;/span&gt; Cargo.toml &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; grep -n -A3 &lt;span class=&#34;s1&#34;&gt;&amp;#39;^name = &amp;#34;v8&amp;#34;&amp;#39;&lt;/span&gt; Cargo.lock&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&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;c1&#34;&gt;# 2. 链接进来的 V8 到底有没有开沙箱（rusty_v8 暴露了这个符号）&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;c1&#34;&gt;#    用法照抄 codex-rs/v8-poc/src/lib.rs：&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;c1&#34;&gt;#    unsafe extern &amp;#34;C&amp;#34; { fn v8__V8__IsSandboxEnabled() -&amp;gt; bool; }&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&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;c1&#34;&gt;# 3. 查有没有为了绕 bug/CVE 而加的运行期降级标志&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;grep -rn &lt;span class=&#34;s1&#34;&gt;&amp;#39;set_flags_from_string&amp;#39;&lt;/span&gt; src/&#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;strong&gt;第三条是最有价值的。一个 &lt;code&gt;--no-xxx&lt;/code&gt; 标志，通常就是一份没写进 changelog 的漏洞公告。&lt;/strong&gt; 它告诉你这个项目当前正扛着什么、在等谁的修复——而且它比 release note 早得多，因为降级往往是&amp;quot;先上规避、再等换代&amp;quot;这个顺序。&lt;/p&gt;&#xA;&lt;p&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;span class=&#34;lnt&#34;&gt;3&#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;&lt;span class=&#34;c1&#34;&gt;# 4. 你的内嵌引擎有两个版本号，关联关系要写下来，别靠记忆&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;grep -rn &lt;span class=&#34;s1&#34;&gt;&amp;#39;v8&amp;#39;&lt;/span&gt; third_party/*/README.md 2&amp;gt;/dev/null   &lt;span class=&#34;c1&#34;&gt;# crate 版本 → 上游源码版本&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;c1&#34;&gt;# 然后拿去比对漏洞库里那条&amp;#34;受影响范围&amp;#34;，确认你到底在不在里面&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;如果自查下来你确实走的是内嵌真 V8 这条路，还有两件事值得现在就做：&lt;strong&gt;一是给 &lt;code&gt;V8_FROM_SOURCE&lt;/code&gt; / &lt;code&gt;RUSTY_V8_ARCHIVE&lt;/code&gt; / &lt;code&gt;RUSTY_V8_MIRROR&lt;/code&gt; 这类变量在 CI 里留一条离线可复现的路径&lt;/strong&gt;，别让构建依赖一个随时可能拿不到的 GitHub Release；&lt;strong&gt;二是把&amp;quot;跟随上游安全修复&amp;quot;变成一个有人负责的日程&lt;/strong&gt;，而不是等出了 CVE 才有人想起来仓库里还 pin 着一个引擎。&lt;/p&gt;&#xA;&lt;p&gt;至于要不要现在就从 QuickJS/WASM 换成内嵌 V8——我的建议是&lt;strong&gt;不要因为&amp;quot;Codex 也这么干&amp;quot;就换&lt;/strong&gt;。他们这么干的收益是拿到真实 JS 语义和进程内内存笼子，代价是养一条 V8 的构建发布链路、在漏洞出现时自己权衡要不要临时关掉优化通道，并且要同时维护&amp;quot;crate 版本&amp;quot;和&amp;quot;上游源码版本&amp;quot;两套数字。这个取舍对他们成立，对大部分 Agent 项目不成立。&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;内嵌 V8 买到的是沙箱能力和真实 JS 语义，不是运行时速度；买之前先看你到底需不需要它，以及接不接得住它的安全回填节奏。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;参考与验证&#34;&gt;参考与验证&#xA;&lt;/h2&gt;&lt;p&gt;核验日期 2026-09-17（CST）。以下逐条为本文引用的原始出处。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;标签 &lt;code&gt;rusty-v8-v152.2.0&lt;/code&gt;（GitHub API 实测：published &lt;code&gt;2026-09-16T12:58:44Z&lt;/code&gt;，release body 为 &lt;code&gt;None&lt;/code&gt;，42 个产物 = 6 个 &lt;code&gt;librusty_v8_release_*&lt;/code&gt; + 24 个 &lt;code&gt;librusty_v8_ptrcomp_sandbox_release_*&lt;/code&gt; + 绑定/校验和文件；对照标签序列 146.4.0 / 147.4.0 / 149.2.0 / 150.4.0 / 152.2.0）：https://github.com/openai/codex/releases/tag/rusty-v8-v152.2.0&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;code&gt;main&lt;/code&gt; 分支 &lt;code&gt;codex-rs/Cargo.toml&lt;/code&gt; 第 524 行仍为 &lt;code&gt;v8 = &amp;quot;=150.4.0&amp;quot;&lt;/code&gt;&lt;/strong&gt;（本文关键纠正点），&lt;code&gt;codex-rs/Cargo.lock&lt;/code&gt; 第 16565–16568 行 &lt;code&gt;name = &amp;quot;v8&amp;quot;&lt;/code&gt; / &lt;code&gt;version = &amp;quot;150.4.0&amp;quot;&lt;/code&gt; / checksum &lt;code&gt;42a978ff…3a49&lt;/code&gt;：https://github.com/openai/codex/blob/main/codex-rs/Cargo.toml&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;codex-rs/code-mode-runtime/Cargo.toml&lt;/code&gt; 第 26 行（工作区唯一启用 V8 的 crate，&lt;code&gt;v8 = { workspace = true, features = [&amp;quot;v8_enable_sandbox&amp;quot;] }&lt;/code&gt;）：https://github.com/openai/codex/blob/main/codex-rs/code-mode-runtime/Cargo.toml&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;commit &lt;code&gt;aaa2cabfb&lt;/code&gt; / PR #45760 &amp;ldquo;Disable V8 optimization paths affected by array sort bugs&amp;rdquo;（作者 Kevin Liu，2026-09-15T18:40:08Z；改动仅 &lt;code&gt;v8_init.rs +5 -0&lt;/code&gt; 与新增 &lt;code&gt;tests/array_sort.rs +84 -0&lt;/code&gt;）：https://github.com/openai/codex/commit/aaa2cabfb —— 完整 commit 正文可用 GitHub API 复核：&lt;code&gt;https://api.github.com/repos/openai/codex/commits/aaa2cabfb&lt;/code&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;codex-rs/code-mode-runtime/src/v8_init.rs&lt;/code&gt;（第 49 行降级标志 &lt;code&gt;--no-maglev --no-turbolev --no-turbo-inline-array-builtins&lt;/code&gt; 及其注释；&lt;code&gt;V8JitMode::{Enabled, Disabled}&lt;/code&gt;，Disabled 走 &lt;code&gt;--jitless&lt;/code&gt;；ICU 数据 &lt;code&gt;set_common_data_77(deno_core_icudata::ICU_DATA)&lt;/code&gt;）：https://github.com/openai/codex/blob/main/codex-rs/code-mode-runtime/src/v8_init.rs&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;codex-rs/code-mode-runtime/tests/array_sort.rs&lt;/code&gt;（请求 &lt;code&gt;--allow-natives-syntax --turbolev&lt;/code&gt;，比较函数内 &lt;code&gt;values.fill(0)&lt;/code&gt; 后断言元素类型未被写坏，并确认 &lt;code&gt;[3,1,2].sort()&lt;/code&gt; 仍返回 &lt;code&gt;[1,2,3]&lt;/code&gt;）：https://github.com/openai/codex/blob/main/codex-rs/code-mode-runtime/tests/array_sort.rs&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;third_party/v8/README.md&lt;/code&gt;（pinned &lt;code&gt;v8 = =150.4.0&lt;/code&gt; / embedded upstream &lt;code&gt;15.0.245.2&lt;/code&gt;；&amp;ldquo;Do not mix artifacts across crate versions&amp;rdquo;；MSVC 不在 Bazel 矩阵内；升版六步流程；产物两族命名；&lt;code&gt;windows-gnullvm&lt;/code&gt; 平台说明）：https://github.com/openai/codex/blob/main/third_party/v8/README.md&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;MODULE.bazel&lt;/code&gt; 第 771 行（&lt;code&gt;bazel_dep(name = &amp;quot;v8&amp;quot;, version = &amp;quot;15.0.245.2&amp;quot;)&lt;/code&gt; 与 &lt;code&gt;archive_override&lt;/code&gt;，urls 指向 &lt;code&gt;v8/v8&lt;/code&gt; 的 &lt;code&gt;15.0.245.2.tar.gz&lt;/code&gt;，patches 列表为 &lt;code&gt;v8_module_deps.patch&lt;/code&gt; / &lt;code&gt;v8_bazel_rules.patch&lt;/code&gt; / &lt;code&gt;v8_source_portability.patch&lt;/code&gt;）：https://github.com/openai/codex/blob/main/MODULE.bazel —— &lt;strong&gt;注意：patch 列表中没有、仓库内也不存在名为 &lt;code&gt;v8_array_sort_elements_kind.patch&lt;/code&gt; 的文件&lt;/strong&gt;，&lt;code&gt;patches/&lt;/code&gt; 目录可核：https://github.com/openai/codex/tree/main/patches&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;.github/workflows/rusty-v8-release.yml&lt;/code&gt;（tag &lt;code&gt;rusty-v8-v*&lt;/code&gt; 触发的产物发布流水线）与 &lt;code&gt;.github/workflows/v8-canary.yml&lt;/code&gt;（升版前金丝雀）：https://github.com/openai/codex/tree/main/.github/workflows&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;codex-rs/code-mode-runtime/src/runtime/globals.rs&lt;/code&gt;（删除 &lt;code&gt;console&lt;/code&gt; / &lt;code&gt;Atomics&lt;/code&gt; / &lt;code&gt;SharedArrayBuffer&lt;/code&gt; / &lt;code&gt;WebAssembly&lt;/code&gt;；注入 &lt;code&gt;tools&lt;/code&gt; / &lt;code&gt;ALL_TOOLS&lt;/code&gt; / &lt;code&gt;text&lt;/code&gt; / &lt;code&gt;image&lt;/code&gt; / &lt;code&gt;audio&lt;/code&gt; / &lt;code&gt;generatedImage&lt;/code&gt; / &lt;code&gt;store&lt;/code&gt; / &lt;code&gt;load&lt;/code&gt; / &lt;code&gt;notify&lt;/code&gt; / &lt;code&gt;yield_control&lt;/code&gt; / &lt;code&gt;exit&lt;/code&gt; / &lt;code&gt;setTimeout&lt;/code&gt; / &lt;code&gt;clearTimeout&lt;/code&gt;）与 &lt;code&gt;src/runtime/callbacks.rs&lt;/code&gt;（工具回调绑定到 Rust 侧）：https://github.com/openai/codex/blob/main/codex-rs/code-mode-runtime/src/runtime/globals.rs&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;codex-rs/v8-poc/src/lib.rs&lt;/code&gt;（&lt;code&gt;linked_v8_has_sandbox()&lt;/code&gt; 绑定 &lt;code&gt;v8__V8__IsSandboxEnabled()&lt;/code&gt;，注释说明该符号由 rusty_v8 为自身沙箱校验测试而暴露）：https://github.com/openai/codex/blob/main/codex-rs/v8-poc/src/lib.rs&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;CVE-2026-85046（NVD：V8 类型混淆，Chrome &amp;lt; &lt;code&gt;152.0.7977.82&lt;/code&gt;，CWE-843；CISA-ADP 给出 CVSS 3.1 &lt;code&gt;8.8 HIGH&lt;/code&gt;，向量 &lt;code&gt;AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H&lt;/code&gt;；CPE 列 V8 &lt;strong&gt;&amp;lt; 15.3.48&lt;/strong&gt;；同时在 CISA KEV 目录，入库 2026-09-04、要求 2026-09-18 前缓解；NVD 引用的补丁 commit 为 v8/v8 &lt;code&gt;e0562d87&lt;/code&gt;）：https://nvd.nist.gov/vuln/detail/CVE-2026-85046&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;rusty_v8 README（实验性特性 &lt;code&gt;v8_enable_sandbox&lt;/code&gt; 原文：memory cages、~1TB 虚拟内存、128–256TB 每进程上限、API 限制与额外开销、&lt;strong&gt;隐含指针压缩&lt;/strong&gt;、需 &lt;code&gt;V8_FROM_SOURCE=1&lt;/code&gt; 或自建归档；版本规则&amp;quot;major version aligns with Chrome&amp;rsquo;s major version…new major version every 4 weeks&amp;quot;；&lt;code&gt;V8_FROM_SOURCE&lt;/code&gt; / &lt;code&gt;RUSTY_V8_ARCHIVE&lt;/code&gt; / &lt;code&gt;RUSTY_V8_MIRROR&lt;/code&gt; / &lt;code&gt;RUSTY_V8_MIRROR_TAG&lt;/code&gt; 行为；首页标注 V8 Version &lt;code&gt;15.2.124.1&lt;/code&gt;）：https://github.com/denoland/rusty_v8 （访问日期 2026-09-17）&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;LangChain「How Deep Agents Run Untrusted Code Without a Sandbox」（QuickJS 跑在 WASM 内、把解释器线性内存序列化进 LangGraph 状态并在恢复时回灌）：https://www.langchain.com/blog/running-untrusted-agent-code-without-a-sandbox （访问日期 2026-09-17）&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;TanStack AI「Code Mode Isolate Drivers」（Daytona 驱动器与&amp;quot;sandbox lifecycle, filesystem, network, cleanup, and secret policy 由应用负责&amp;quot;；性能注记原文 &amp;ldquo;QuickJS interprets JavaScript rather than JIT-compiling it, so compute-heavy scripts run slower than with the Node driver. For typical LLM-generated scripts that are mostly waiting on external tool calls, this difference is not significant.&amp;quot;）：https://tanstack.com/ai/latest/docs/code-mode/code-mode-isolates （访问日期 2026-09-17）&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;openai/codex issue #16105 &amp;ldquo;nix build error - rusty_v8 download issue&amp;rdquo;（已关闭，用于说明 &lt;code&gt;cargo build&lt;/code&gt; 默认下载预编译静态库这一行为在受限网络下的失败面）：https://github.com/openai/codex/issues/16105&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;风险与时效说明&lt;/strong&gt;：本文关于 Codex 的结论全部基于截至 &lt;strong&gt;2026-09-17&lt;/strong&gt; 的 openai/codex &lt;code&gt;main&lt;/code&gt; 分支可见的配置、源码与 GitHub API 数据。&lt;code&gt;--no-maglev --no-turbolev --no-turbo-inline-array-builtins&lt;/code&gt; 是&lt;strong&gt;当前源码状态&lt;/strong&gt;，属于针对所 pin 版本的临时规避，注释中已写明&amp;quot;until our V8 artifacts include the upstream fix&amp;rdquo;，等产物换代后应被移除，你读到时可能已经变了。&lt;code&gt;rusty-v8-v152.2.0&lt;/code&gt; 标签的存在&lt;strong&gt;不代表&lt;/strong&gt;主线已采用该版本，请以 &lt;code&gt;Cargo.toml&lt;/code&gt; / &lt;code&gt;Cargo.lock&lt;/code&gt; 现状为准。仓库内没有可引用的性能数据，本文不讨论版本升级的性能影响。&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
