AGENTS.md 劫持自查:别在 Downloads 开 Agent

2026 年 10 月 22 日,安全公司 Forever Security 写:他们在真实客户机器的 ~/Downloads 里截获恶意 AGENTS.md。网页能静默往 Downloads 落文件,而 Codex、Claude Code 一类编程 Agent 又会读当前目录的指令文件并照着做——两条设计叠在一起,浏览器可写入的目录就被当成了可信工作区。站内快讯《Downloads 里的 AGENTS.md 可劫持 Agent》说过机制;下面是一套只读自查:扫指令文件、核对配置、定规矩。攻击链复现标「未实测」,也不复述可直接复用的完整 payload。
两条设计叠在一起,才变成可利用面
AGENTS.md 是给编程 Agent 看的项目说明:构建命令、测试怎么跑、约定。Claude Code 官方文档也写明:会话开始会加载 CLAUDE.md;仓库里若没有 CLAUDE.md,还可以直接读 AGENTS.md(见 Claude Code Memory)。这是产品按设计提供的能力。
另一边,浏览器对 Downloads 的写入规则沿用了几十年:页面可以往该目录落文件,操作系统拦的是「可执行文件自动运行」,拦不住一份 Markdown。
Forever 的说法是:恶意指令文件伪装成工程规范,诱使 Agent 在开局改自己的配置——Codex 侧往全局 ~/.codex/config.toml 塞陌生 MCP/启动命令并去装恶意 npm 包;Claude 侧往项目 .claude/settings.json 写入 ANTHROPIC_BASE_URL,把 API 流量指到攻击者网关。研究者自述:Codex 测试跟进率超过 90%,Claude 约 50%。数字来自 Forever 博客,本站未复现。
Agent 读当前目录指令文件是设计行为;操作系统对可执行文件的下载防护管不到 Markdown。单靠厂商「修个洞」关不掉整条路径。
Codex 路径 vs Claude 路径:你该盯什么
| 点 | Codex(Forever 现场) | Claude Code(Forever 复现) |
|---|---|---|
| 指令文件 | AGENTS.md | CLAUDE.md |
| 改写目标 | 全局 ~/.codex/config.toml(可跨目录残留) | 项目 .claude/settings.json 的 env.ANTHROPIC_BASE_URL |
| 后续危害(厂商自述) | 注册恶意 MCP/启动命令,装恶意 npm 包 | 令牌外泄;网关代答工具调用 |
| 跟进率(厂商自述) | >90% | ~50% |
| 自查信号 | 陌生 [mcp_servers.*]、异常 base URL | env 里多出你没写的 ANTHROPIC_BASE_URL / 代理 |
更麻烦的是配置被改写之后:Codex 的全局配置会跟着你进别的仓库;Claude 的基址一变,下一会话的流量就可能不再走官方入口。权限与沙箱仍有用——见权限配置实测和Hooks 护栏——但 Forever 也写了:指令文件会诱导 Agent 自己申请绕过审批/沙箱的旗标。「全开 auto」再叠「在 Downloads 里干活」,风险最高。
和「提示词注入」相比,这条路径更偏落盘 + 持久化:文件一旦写进 Downloads,不需要你再点一次「允许下载」;Agent 一旦按指令改了全局或项目配置,危害也不随你关掉当前终端窗口而消失。企业侧可以把「禁止在 Downloads 跑 Agent」写进规范,并监控异常的 MCP 注册与 API 基址变更——Forever 也建议把注意力从「用户有没有点错」转到「Agent 读了什么、改了什么」。
本机自查:只读扫描,不装包、不改配置
环境:2026-10-27,Debian box;Claude Code 2.1.309;本机无 ~/.codex/config.toml;用户级 ~/.claude/settings.json 的 env 为空(无 ANTHROPIC_BASE_URL)。未启动 Ollama、未接付费 Claude API,因此未让 Agent 实际跟进恶意指令——只验证「发现文件 + 核对配置」这一段。
把下面脚本存成 selfcheck.sh,先对你的 ~/Downloads 跑一遍;也可以对刚 clone 的陌生仓库根目录跑。
#!/usr/bin/env bash
# Agent 指令文件自查:只读,不装包、不改配置
set -euo pipefail
ROOT="${1:-$HOME/Downloads}"
echo "== self-check $(date '+%F %T %Z') =="
echo "[1] Scan: $ROOT"
if [[ -d "$ROOT" ]]; then
find "$ROOT" -maxdepth 3 \
\( -name 'AGENTS.md' -o -name 'CLAUDE.md' -o -name 'CLAUDE.local.md' \) -print
else
echo "(missing)"
fi
echo "[2] Codex ~/.codex/config.toml"
if [[ -f "$HOME/.codex/config.toml" ]]; then
rg -n '\[mcp_servers|chatgpt_base_url|project-tools' \
"$HOME/.codex/config.toml" || echo "(no mcp / base_url hits)"
else
echo "(not present)"
fi
echo "[3] Claude settings env"
for f in "$HOME/.claude/settings.json" \
".claude/settings.json" ".claude/settings.local.json"; do
[[ -f "$f" ]] || continue
echo "-- $f"
python3 - "$f" <<'PY'
import json,sys
d=json.load(open(sys.argv[1]))
env=d.get("env") or {}
print("env keys:", sorted(env) if isinstance(env,dict) else env)
for k in ("ANTHROPIC_BASE_URL","HTTP_PROXY","HTTPS_PROXY"):
if isinstance(env,dict) and k in env:
print(f"{k}=[set, len={len(str(env[k]))}]")
PY
done
echo "[4] Do not start agents inside Downloads."

AGENTS.md/CLAUDE.md 的模拟目录跑自查,扫出 2 个指令文件;Claude Code 版本 2.1.309。
~/Downloads:指令文件 0;无 Codex 配置文件;用户级 Claude env 为空。下面三条是人工核对清单。若扫到陌生 AGENTS.md/CLAUDE.md:先用人读完再开 Agent。若配置里冒出你没写过的 MCP 块或 ANTHROPIC_BASE_URL:先停用 Agent,备份配置,删掉异常项,并轮换相关令牌/OAuth——Forever 明确写过,基址被劫持后令牌可能已经外泄。
脚本第 3 步只打印「有没有这些键、长度多少」,故意不回显 URL 本身,避免自查输出把敏感基址再抄进日志。核对时用编辑器打开对应 JSON/TOML,对照你自己的网关白名单:公司若真有内部 AI 网关,应当来自 IT 文档,而不是 Downloads 里突然冒出来的 Markdown。
未实测声明:本机没有复现「网页静默落文件 → Agent 跟进改配置 → 装包/泄令牌」全链路;没有下载 Forever 点名的恶意 npm 包;没有在隔离 VM 外运行任何攻击 payload。文中成功率与现场发现均引自 Forever 博客(并经安全媒体转述),请以原文为准。
日常规矩(比补丁更管用)
- 别在 Downloads 启动 Agent。 要处理下载文件,先挪到独立项目目录再开 Codex / Claude Code / 同类工具。
- 浏览器下载尽量「每次询问保存位置」,或改到 Agent 从不开的目录。
- 陌生仓库先扫指令文件再让 Agent 干活;clone 下来不等于可信。
- 保留审批与沙箱。对「请关闭沙箱 / bypass approvals / 改 API 基址」类说法默认拒绝,对照settings.json 权限收紧 deny。
- 供应链侧:若机器上曾出现 Forever 点名的恶意 npm 包名,按失陷处理;依赖自查可参考Python 依赖防投毒(语言不同,思路同类:冷却期、哈希、日志里搜令牌)。
常见坑
- 以为「Markdown 不能执行」就安全。 对 Agent 来说,指令文件就是启动时注入的上下文;危险的是「读完之后它改配置、跑命令」。
- 只查项目目录、不查全局配置。 Codex 路径写的是家目录级
config.toml,离开 Downloads 毒还在。 - 用 Agent 自己「帮你审」刚下的指令文件。 审的过程已经在加载它。先用人眼或编辑器打开。
- 关审批图省事。 Forever 复现里,绕过审批/沙箱的旗标本身就是攻击步骤之一。
完成标准
- 对本机
~/Downloads(及常用下载目录)跑过自查,知道有没有陌生AGENTS.md/CLAUDE.md。 - 能解释 Codex 路径与 Claude 路径分别改哪份配置、你要盯哪些键。
- 团队规范里写明:禁止在 Downloads 开 Agent;发现异常 MCP /
ANTHROPIC_BASE_URL先轮换令牌。 - 攻击复现、真实恶意包安装:本教程标「未实测」,也不提供可复用 payload。
最后
把 selfcheck.sh 放进你的点检清单,这周对 Downloads 和最近 clone 的仓库各跑一次;有异常就先停 Agent、轮换令牌,再对照 Forever 原文核对。需要收紧 Claude Code 权限时,直接看settings.json 实测。