十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Friendly Fire 投毒 README 触发 RCE?TaoToken 这样配 AI 编码 Agent 的模型通道,再照清单改 config.json

Friendly Fire 投毒 README 触发 RCE?TaoToken 这样配 AI 编码 Agent 的模型通道,再照清单改 config.json Friendly Fire 投毒 README 触发 RCETaoToken 这样配 AI 编码 Agent 的模型通道再照清单改 config.json这篇从friendly_fire_check.py报出的 HIGH 项、以及.claude/config.json里几个布尔值写起。先解决前置通道问题让 Claude Code、Codex 这类 AI 编码 Agent 的模型请求统一走 TaoToken官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后在控制台创建一个 KeyBase URL 填https://taotoken.net/api注意不带/v1、不加 UTM 参数。通道打通之后再回到 Friendly Fire 研究给出的那套加固清单auto_mode关掉、CLAUDE_CODE_DISABLE_AUTO_EXEC设上、命令执行交给外部独立校验代理。边界也要先说清TaoToken 在这里只负责 Key 和 Base URL 这一段模型通道不接管沙箱、不接管命令代理、也不承担 RCE 加固职责安全侧的动作仍然落在 Agent 自身的配置文件和流水线里。一、现象复盘投毒 README 为什么能让审计 Agent 直接 RCEFriendly Fire 这类攻击的入口非常日常一段写进 README、代码注释或者项目说明 md 里的文字。开发者让 AI 编码 Agent 去审计一个第三方仓库Agent 会主动读取仓库内的全部文件这些文件内容会进入它的上下文当文档里埋着看起来像安装步骤的指令时模型有可能把它当成任务的一部分执行。真正值得关注的是执行链路里的那段盲区。Claude Code 的 auto-mode 在输出侧用 transcript classifier 对工具调用做安全判定但这类分类器不读文件读取工具返回的文档内容也不读 Agent 内部的推理过程它只看到最终那条工具调用。结果是驱动这条 shell 的源头在 README 里分类器看到的是一个看起来正常的命令于是放行主机侧就出现了远程代码执行。Codex 开启 auto-review 自动评审时逻辑上面对的是同一类问题。对照一下风险场景就更清楚高风险开了 auto-mode 或 auto-review直接把不受信任的 git 仓库路径丢给 Agent 做扫描CI/CD 流水线里用 Agent 自动扫第三方依赖而流水线里挂着仓库 token、发布凭证。低风险关闭自动模式、逐条人工确认只处理自己写的可信代码Agent 跑在一次性销毁沙箱里沙箱内没有任何业务凭证。原文给出的检测脚本friendly_fire_check.py做的事情很朴素扫 shell 历史里有没有auto-mode、有没有--dangerously-skip-permissions扫.github/workflows下的 yaml 里有没有auto-review、有没有高危跳过参数再看环境变量CLAUDE_CODE_ARGS/CODEX_ARGS。它不触发攻击只报配置风险。这份脚本和后面的.claude/config.json加固参数就是本文要落地的两条线一条是模型通道一条是执行权限。二、TaoToken 前置注册、建 Key、把 Base URL 固定为 https://taotoken.net/api这一步不长但错一处后面全报错所以单独拆开。打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册并登录。进入控制台创建 API Key得到YOUR_API_KEY这个字符串后面所有配置里都替换成它。记住 Base URL 只有一个写法https://taotoken.net/api。不要拼/v1不要带任何查询参数。为什么强调不拼/v1Anthropic 风格的客户端在调用时会自己补/v1/messages你在 Base URL 末尾再写一次/v1实际请求路径就变成/v1/v1/messages表现是 404 或者路径不匹配带了 UTM 之类的查询串则可能被某些客户端当成路径的一部分出现签名或路由异常。所以配置项里只写到/api为止。如果习惯用命令行统一管理也可以走 CLInpm i -g taotoken/taotoken taotoken cc -k YOUR_API_KEY -u https://taotoken.net/api -m MODEL_ID这里-k是 Key-u是 Base URL-m是模型 ID。CLI 只解决写配置这件事不会替你把 auto-mode 关掉也不会替你加沙箱别把两件事混在一起。三、可复制配置settings.json、config.toml 与 .claude/config.json 一起改这一步是全文的核心。模型通道和权限加固是两份配置建议一次性改完再验证。3.1 Claude Codesettings.json 里走 ANTHROPIC_* 变量Claude Code 读取~/.claude/settings.json把模型通道指向 TaoToken{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: MODEL_ID, CLAUDE_CODE_DISABLE_AUTO_EXEC: true }, permissions: { allow: [], deny: [ Bash(curl:*), Bash(wget:*), Bash(ssh:*), Bash(scp:*) ] } }两个细节值得说明。第一ANTHROPIC_AUTH_TOKEN和ANTHROPIC_API_KEY不要同时写两份不同的值混用最常见的结果就是 401。第二CLAUDE_CODE_DISABLE_AUTO_EXEC放在env里是为了让它在会话启动时就生效而不是靠某条命令临时 export。3.2 Codexconfig.toml 里配 model_providerCodex 走~/.codex/config.tomlmodel MODEL_ID model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEYenv_key指的是去环境变量里读哪个名字不是把 Key 明文写进 toml。把TAOTOKEN_API_KEY通过 shell 或者 CI 的 secret 注入文件本身可以放心进版本库Key 不进。3.3 项目侧.claude/config.json 按清单收紧原文的加固清单落在项目根的.claude/config.json。这份文件决定的是 Agent 在项目里的自治程度{ auto_mode: false, allow_shell_exec: false, require_manual_confirmation: true, block_untrusted_context_hint: true, max_tool_iteration: 20 }auto_mode必须为false这是 Friendly Fire 攻击面能不能被打开的总开关require_manual_confirmation为true让系统调用回到人工确认allow_shell_exec建议直接设false需要执行时再单独放行而不是默认开一个口子block_untrusted_context_hint打开后来自不受信任来源的上下文提示会被标记max_tool_iteration限制工具调用轮次避免 Agent 在一条被劫持的链路上反复尝试。3.4 CI 侧只输出报告不执行 shell流水线里的改法和本地不同。把CLAUDE_CODE_DISABLE_AUTO_EXECtrue写到 job 级别的env容器不挂载生产凭证扫描任务用一次性容器name: ai-security-scan-hardened on: [pull_request] jobs: scan: runs-on: ubuntu-latest container: image: ubuntu:24.04 env: ANTHROPIC_BASE_URL: https://taotoken.net/api ANTHROPIC_AUTH_TOKEN: ${{ secrets.TAOTOKEN_KEY }} CLAUDE_CODE_DISABLE_AUTO_EXEC: true steps: - uses: actions/checkoutv4 - name: run security review, report only run: claude-code scan . --no-exec关键不在写法花哨而在三件事Agent 容器里没有仓库写权限 tokenauto-mode / auto-review 不出现Agent 的输出是报告文本而不是被直接送进 shell。四、验证请求用 TaoToken 通道跑一次 friendly_fire_check.py 只输出报告配置改完不要急着扫第三方仓库先做两级验证。第一级纯通道连通性。用最小请求打一次消息接口确认 Key 和 Base URL 都对curl -sS https://taotoken.net/api/v1/messages \ -H x-api-key: YOUR_API_KEY \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d {model:MODEL_ID,max_tokens:64,messages:[{role:user,content:只回复 ok}]}成功的结果是返回体里带content数组文本内容为ok。如果这里就报 401先别动 Agent 配置回到第二章查 Key如果报 404八成是 Base URL 末尾多写了/v1。第二级用 TaoToken 通道跑一次只出报告的 Friendly Fire 扫描。注意是让 Agent 读配置、读 CI yaml、输出风险清单不执行任何命令CLAUDE_CODE_DISABLE_AUTO_EXECtrue \ claude -p 读取 .claude/config.json 与 .github/workflows 下的 yaml列出 auto-mode、auto-review、--dangerously-skip-permissions 相关的风险项只输出清单不执行任何 shell 命令再把检测脚本本身跑一遍作为独立对照python3 friendly_fire_check.py预期的成功状态是两条都成立TaoToken 通道返回正常内容说明 Key 调用成功、模型通道可用friendly_fire_check.py输出里不再出现以HIGH开头的条目或者即使出现也能对应到你已经改掉的那一项。如果脚本仍报HIGH: shell历史检测到claude-code开启auto-mode自动自治模式说明你的依赖历史配置还在需要连同~/.bash_history里那条习惯用法一起停用。五、本篇常见错排查auto_mode、CLAUDE_CODE_DISABLE_AUTO_EXEC 与 Base URL 三类坑按报错现象对照下面几类基本能覆盖大部分情况。报 401 或鉴权失败。检查三点ANTHROPIC_AUTH_TOKEN与ANTHROPIC_API_KEY是否只保留一份Key 是否是当前控制台里有效的那一个Codex 侧env_key指向的环境变量是否真的在会话里存在。CI 里最常见的是 secret 名写错容器内读到一个空字符串。报 404 或提示路径不存在。检查 Base URL 是否为https://taotoken.net/api。写成/api/v1、写成带 UTM 的长链接、末尾多一个斜杠都可能让客户端拼出错误路径。注意配置里不带/v1但实际请求路径仍然是/v1/messages这两件事不矛盾。改完 settings.json 没生效。已经启动的会话不会自动重读文件重启 CLI 或 IDE 之后再验证另外确认你改的是~/.claude/settings.json而不是别处同名文件。脚本仍报 auto-mode。说明配置分散在多个位置项目.claude/config.json、环境变量CLAUDE_CODE_ARGS、shell 历史里的启动习惯都要一起清掉。只改其中一个friendly_fire_check.py依旧会判定为高风险。CI 里CLAUDE_CODE_DISABLE_AUTO_EXEC不生效。常见原因是只写在了 shell 脚本里而 Agent 进程不在同一层环境把它提到 job 或 step 的env下更稳。另外确认容器内确实读到了这个变量可以用一条env | grep CLAUDE打印确认。关掉 auto_mode 仍然出现异常行为。这时问题不在自治模式而在输入本身。投毒 README 的载荷进入上下文后即使逐条人工确认只要有人在疲劳状态下点了放行链路一样成立。这也是为什么加固清单里还要加沙箱和独立命令校验代理而不是只依赖一个开关。Key 被提交进版本库。.claude/config.json里不要写 Keytoken 只出现在环境变量或本地未纳入版本控制的文件里。如果已经提交过按控制台流程轮换 Key。六、加固清单与接入入口把上面的动作收成一份可勾选的清单.claude/config.json中auto_mode为false、require_manual_confirmation为truesettings.json中ANTHROPIC_BASE_URL为https://taotoken.net/api且CLAUDE_CODE_DISABLE_AUTO_EXEC设为trueCI 侧 Agent 只输出报告、容器不挂生产凭证扫描不受信任仓库时先下载隔离、再送进一次性沙箱所有 shell 调用经过外部独立校验代理代理不与 Agent 共享上下文只审工具调用本身。模型通道这一段收尾很快去控制台创建 Key把 Base URL 填成https://taotoken.net/apiClaude Code 走ANTHROPIC_*三个变量Codex 走config.toml里的model_provider两侧都验证过再继续。需要建 Key 的话从这里进https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 配置项写法、变量名对照和路径细节对照接入文档逐条核一遍https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。通道通了只是第一步真正的风险收口在权限、沙箱和命令校验这三处。
返回列表