<?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/</link><description>Recent content in 漏洞 on Codexer</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 07 Sep 2026 09:00:00 +0800</lastBuildDate><atom:link href="https://codexer.com/tags/%E6%BC%8F%E6%B4%9E/index.xml" rel="self" type="application/rss+xml"/><item><title>GitSpawn：一个 .git/config，就能让 AI 编程助手在你授权之前执行任意代码</title><link>https://codexer.com/posts/2026-09-07-gitspawn-git-config-hijack/</link><pubDate>Mon, 07 Sep 2026 09:00:00 +0800</pubDate><guid>https://codexer.com/posts/2026-09-07-gitspawn-git-config-hijack/</guid><description>&lt;p&gt;想象一个很常见的场景。同事把一个项目打包成 .zip 发给你，你解压，打开 AI 编程助手，把文件夹拖进去。你还没来得及敲一个字，也还没点那个「是否信任此工作区」的确认框，程序的后台已经跑起来了。它做的第一件事，是调用 git 去了解自己身处何方。&lt;/p&gt;
&lt;p&gt;而如果那个 .zip 里藏了一点手脚，你的电脑此刻可能已经被攻破了。&lt;/p&gt;
&lt;p&gt;这是安全团队 Manifold 在 2026 年 9 月 1 日公开的一批发现。他们给它起了个名字叫 GitSpawn，核心结论相当惊悚：包括 Claude Code、Codex、Cursor 在内的多家主流编程 agent，都存在同一个漏洞，只要仓库的 .git/config 里写上一行恶意配置，agent 在启动时自己调用的 git 命令，就会替你执行任意代码。&lt;/p&gt;
&lt;h2 id="一切要从agent-一打开就偷偷跑-git说起"&gt;一切要从「agent 一打开就偷偷跑 git」说起&lt;/h2&gt;
&lt;p&gt;Manifold 最初的问题特别简单：一个命令行的 AI agent，启动的那一刻到底在后台做什么？&lt;/p&gt;
&lt;p&gt;他们观察了好几个 agent，发现了一件共同的事：agent 会先收集「自己刚被打开的这个项目」的上下文，而收集上下文的手段，很大一部分就是调用 git。有的在启动时调，有的在会话开始后调。要当前分支、要改动列表、要暂存区状态，五花八门。比如这两个再普通不过的命令：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;git status --porcelain=2 --branch
git diff --name-only HEAD
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这两条命令没有任何异常，你自己也会这么写。问题在于，几乎所有会触碰工作区的 git 命令，都会先刷新一遍索引。而刷新的过程里，藏着一个致命的执行点。&lt;/p&gt;
&lt;h2 id="corefsmonitor一个设计如此的命令执行口子"&gt;core.fsmonitor：一个「设计如此」的命令执行口子&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;core.fsmonitor&lt;/code&gt; 是 git 针对大型仓库的一个性能优化：与其逐个检查磁盘上的文件，git 会让一个「助手程序」来告诉它哪些文件变了，并在刷新索引时运行这个程序。这是官方文档里写明的、有意为之的行为。&lt;/p&gt;
&lt;p&gt;关键在这里：git 是从仓库自己的 &lt;code&gt;.git/config&lt;/code&gt; 里读取这个设置的。于是，一个仓库完全可以自带这样的内容：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[core]
 fsmonitor = &amp;lt;任意命令&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;只要 agent 用 git 刷新了索引，无论它跑的是 &lt;code&gt;git status&lt;/code&gt; 还是 &lt;code&gt;git diff&lt;/code&gt;，这条命令都会被触发。而且 &lt;code&gt;core.fsmonitor&lt;/code&gt; 并不是唯一一个这种性质的设置，Manifold 在下文里披露的其中一个案例，走的就是另一个完全不同的配置项。&lt;/p&gt;</description></item></channel></rss>