<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>漏洞分析 on Codexer</title><link>https://codexer.com/tags/%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90/</link><description>Recent content in 漏洞分析 on Codexer</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 19 May 2026 09:00:00 +0800</lastBuildDate><atom:link href="https://codexer.com/tags/%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90/index.xml" rel="self" type="application/rss+xml"/><item><title>你的终端在骗你：Codex CLI 的 ANSI 注入漏洞如何演变成远程代码执行</title><link>https://codexer.com/posts/2026-05-19-codex-ansi-injection-rce/</link><pubDate>Tue, 19 May 2026 09:00:00 +0800</pubDate><guid>https://codexer.com/posts/2026-05-19-codex-ansi-injection-rce/</guid><description>&lt;h2 id="当你的终端在对你说谎"&gt;当你的终端在对你说谎&lt;/h2&gt;
&lt;p&gt;你每天打开终端，输入命令，看着屏幕上输出的文字。你信任它。你信任那些绿色的 &amp;ldquo;✓ Security policy enforced&amp;rdquo;，信任那些显示在屏幕上的 sandbox 设置和 approval 级别。&lt;/p&gt;
&lt;p&gt;但如果有人能让终端显示假的信息呢？如果你看到的 &amp;ldquo;安全策略已生效&amp;rdquo; 其实是攻击者注入的，而真正的设置是 &amp;ldquo;完全不设防&amp;rdquo; 呢？&lt;/p&gt;
&lt;p&gt;这不是假设场景。2026 年 2 月，安全研究员 Dimitar Ganev 在 OpenAI 的 Codex CLI（v0.91.0）中发现了这样一个漏洞。他不仅实现了终端显示欺骗，还将其升级为跨平台的远程代码执行（RCE）。&lt;/p&gt;
&lt;p&gt;这篇文章就来拆解这个漏洞的技术细节、攻击链路，以及它给所有 AI 编程工具敲响的安全警钟。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="漏洞起点一个没被清洗的参数"&gt;漏洞起点：一个没被清洗的参数&lt;/h2&gt;
&lt;p&gt;故事的起点很简单。Ganev 在用 Codex CLI 的 &lt;code&gt;codex exec&lt;/code&gt; 模式尝试生成多个子代理（sub-agent）时，注意到一个细节：通过 &lt;code&gt;--model&lt;/code&gt; 参数传入的模型名称，会被直接打印到终端输出里，没有任何过滤或转义。&lt;/p&gt;
&lt;p&gt;正常情况下，&lt;code&gt;codex exec&lt;/code&gt; 的输出是这样的：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;OpenAI Codex v0.91.0 (research preview)
--------
workdir: /home/user/project
model: o4-mini
approval: never
sandbox: workspace-write [workdir, /tmp, $TMPDIR]
reasoning effort: high
--------
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这些信息是安全配置的关键展示：sandbox 模式是什么，审批策略是什么，工作目录在哪里。用户根据这些信息来判断当前 Codex 的运行是否安全。&lt;/p&gt;
&lt;p&gt;问题在于，&lt;code&gt;--model&lt;/code&gt; 参数的值是&lt;strong&gt;用户可控输入&lt;/strong&gt;，而且它被直接反射到了终端输出中，没有任何 ANSI 转义字符的清洗。&lt;/p&gt;</description></item></channel></rss>