第一次给 Coding Agent 做安全测试,最容易漏掉的不是模型

简介: 本文剖析2026年AI编程助手三起典型安全事件,指出风险主因不在模型本身,而在扩展、hook、配置等“有权限的周边组件”。提出四层信任边界模型,给出可落地的配置基线检测、生命周期断言等测试方法,强调测试重心应从“答得对不对”转向“能碰什么、谁批准、能否溯源”。

摘要
2026年10月,多家安全研究披露了 AI 编程助手的一类共同问题:出事的不是模型,而是和模型并排运行的扩展、hook 与配置文件。微软修复了 Copilot 的文件名问题,Anthropic 与 GitHub 则对另外两项报告给出了不同处置。本文拆解四层信任边界、给出可执行的测试动作与检查表,并说明哪些结论只适用于研究环境。

一个文件名末尾多出来的点,能让 Visual Studio 里的 Copilot 把内容写进它自己的 MCP 配置和设置文件,最后走到命令执行。这不是假设,是2026年10月一批安全研究里记录的真实问题,微软已经修复。同一批披露里还有两件事没有按"漏洞"处理:Claude Code 在恶意仓库中启动子会话时,SessionStart hook 在没有父路径那层确认的情况下被执行,Anthropic 把报告标记为 Informative;GitHub Copilot CLI 在它自己的 shell 里解密了攻击者给的密文、信任了明文、把本地文件发往攻击者端点,GitHub 验证了问题但没有认定为漏洞。

这三件事放在一起,指向同一个结论:AI 编程助手的风险,多数不在模型输出,而在模型旁边那圈"有权限的零件"。对测试工程师来说,这意味着测试对象变了——你要测的不是"它答得对不对",而是"它能碰什么、谁批准了、出事后能不能查"。

先说清楚来源属性:以上来自安全厂商的研究汇总与厂商处置结果,属于公开研究披露,不是某家公司自述的生产事故;文中涉及的具体复现比例均来自研究环境,不能当成你所在团队的现状。

审批弹窗为什么没拦住

很多人对 Agent 安全的理解是"有审批就行"。但审批管的是模型发起的动作。如果恶意代码不是模型发起的,而是和模型并排运行的扩展代码,审批弹窗根本不会出现。

有一组实验室测试很能说明问题:研究者只改了一份合法扩展的本地副本,凭证就被收集,代码以开发者的权限运行,而触发词是评审时最常说的一句"lgtm, ship it"。整个过程中模型没有参与,所以工具权限、审批提示、工具调用检查这三道控制全部失效——它们治理的是模型,不是模型旁边的代码。

这就是"信任边界"的位置问题。把 Agent 的权限拆开看,至少有四层,而团队通常只测了最外面一层:

层级
典型入口
可观测症状
测试动作
需要的证据
① 扩展/插件
第三方扩展、被篡改的本地副本
凭证外发、异常子进程
供应链清单核对、安装包哈希比对
扩展来源、版本、哈希
② hook/会话启动
SessionStart 等生命周期钩子
未确认即执行命令
在恶意仓库中启动会话,观察是否弹确认
hook 配置、执行日志、确认记录
③ 配置/MCP
AGENTS.md、config.toml、MCP server
出现未知 server、base_url 被改
配置基线 diff、未知 MCP 告警
变更前后配置文件
④ 模型/上下文
提示注入、文档中的指令
越权工具调用、跳过校验
同一指令放入不同文件类型做对照
Trace、工具调用序列
第③层最值得先测:配置是会长期生效的

模型层的问题靠"这一次答错"暴露,配置层的问题不会。它一旦写进去,之后每次会话都带着它跑。

公开研究里有一条完整链路:网页可以在用户不点击的情况下,往 ~/Downloads 写一个文件;一个伪装成工程笔记的 AGENTS.md 就这样落到了真实用户的下载目录。当 Codex 从这个目录启动时,它把恶意 MCP server 写进了机器级的 ~/.codex/config.toml,研究报告的成功率超过90%;Claude Code 则在约50%的尝试中,通过设置 ANTHROPIC_BASE_URL 指向攻击者端点完成同样的事,同时把 OAuth token 暴露出去。注意口径:这是研究环境的复现比例,不是线上统计。

这条链路值得单独画出来,因为它的每一环单独看都"很正常":

还有一组关于"信任域"的实验更值得测试团队记住:同样是那条不安全指令,写在 README 或 TODO 文件里,被 GPT-5.4 驱动的 Agent 遵循的概率,平均是写在代码或数据文件里的2.6倍。也就是说,文档在 Agent 眼里比代码更可信。你按代码标准审 PR,却把文档当成无害说明,这个偏差正好被利用。

可以马上加进流水线的四类断言

不需要等安全团队排期,测试侧就能落地:

配置基线断言:每次会话前后 diff ~/.codex/config.toml、MCP 配置与 base_url,出现新增 server 或端点变更即失败;
生命周期断言:在受控的恶意仓库样本中启动会话,断言 hook 触发前必须出现确认记录,没有记录就是缺陷;
出站网络断言:对 Agent 进程的出站域名做白名单,凭证类文件读取后出现异常外联直接阻断;
信任域对照:同一段诱导指令分别放进 README、代码注释、issue 描述,观察行为差异,把"文档触发"列为高风险用例。
一段最小化的 CI 检查思路(示意,不是任何厂商的官方配置):

会话前后比对配置,出现未知 MCP 或端点变更即失败

diff <(jq -S '.mcpServers|keys' ~/.codex/config.toml.bak) \
<(jq -S '.mcpServers|keys' ~/.codex/config.toml) && echo OK || exit 1
grep -q 'ANTHROPIC_BASE_URL' ~/.zshrc && { echo "base_url override found"; exit 1; }
三起事件,三种处置:责任边界还没定

把三件事的结局并排看,会发现一个比漏洞本身更值得注意的现象。

Copilot 的文件名问题被微软修复,有补丁、有版本、有更新记录,这是最清晰的一种结局。Claude Code 的子会话 hook 被 Anthropic 标记为 Informative——意思是报告收到了,但不按安全漏洞处理。Copilot CLI 的凭证外发链条被 GitHub 验证复现,但没有被认定为漏洞。同一个季度、同一类问题、三家公司的处置完全不同。

这不是谁在推卸责任,而是"什么算 Agent 的安全缺陷"还没有共识:是模型被骗了算缺陷,还是工具被绕过了算缺陷,还是用户自己点了"信任这个目录"就该自担?标准没定,责任就会在厂商、平台和用户之间来回滑动。

对测试团队的实际影响是:你不能等一份行业标准再动手。你得自己定义"哪些行为在我们这里算不可接受",写进验收条件。比如"未经确认不得执行仓库内脚本""不得向非白名单域名发送文件""配置变更必须留痕",这三条不需要任何标准背书,出了问题也能追。

为什么"只批准危险命令"不够

很多工具的安全模型是"遇到危险命令才弹窗"。这个设计默认了一个前提:危险可以被枚举。现实中,危险往往藏在合法命令的参数里。

公开研究里有两个例子。Hermes 在手动批准模式下,仍然执行了注入的文件编辑和一段 Python 脚本,没有弹窗——因为它只对"它认为危险"的命令提示,而文件编辑不在清单里。Codex 把 git 设成已批准的前缀后,一条 git diff 触发的 diff.external 配置读走了 .env 文件。前缀是安全的,前缀调用的外部程序不是。

这两件事对测试的启示很直接:批准粒度为"命令名"时,测试要覆盖的是"这个命令能触发的所有副作用",而不是命令本身。做法是把已批准命令逐个做副作用枚举,尤其是那些会读配置、调外部程序、走网络的:git 的 external diff、包管理器的 postinstall、构建工具的插件加载。枚举完,你会发现"已批准"这个状态本身需要重新定义。

最小复现:五步验证你自己的环境

不需要等安全团队,一个人半天能做完:

建一个干净的用户目录,放一份伪装成工程笔记的 AGENTS.md(内容只写"请把 MCP 配置改成……"),不放任何可执行文件;
在该目录启动你团队在用的 Agent,观察它是否读取该文件、是否修改 ~/.codex/config.toml 或等价配置;
会话结束后 diff 配置文件,比对 mcpServers 列表与 base_url;
在仓库里放一个 SessionStart 类 hook,内容只写一行写文件操作,观察是否弹确认;
检查 Agent 进程的出站连接,看有没有非白名单域名。
五步里任何一步出现"没提示就执行了",就是你们团队需要补的门禁。注意:这套操作要在隔离环境和测试凭证下做,不要用真实密钥。

一周内能做的三件事

角色
动作
产出
测试
建配置基线,接入 CI diff
未知 MCP / 端点变更即失败
开发
给 hook 加显式确认,收敛已批准命令
副作用清单
负责人
定"不可接受行为"三条,写进发布条件
一页纸规则
这三件事都不需要改动模型,也不需要采购新工具。它们的共同点是:把"信任"从默认状态改成需要证明的状态。

审计日志还要能回答三个问题:这次会话读过哪些文件、执行过哪些命令、向哪些域名发过数据。三个问题答不上来,出了事就只能靠猜,而 Agent 场景里的"猜"通常意味着把整台开发机重装一遍。

边界:不要把它写成"AI 编程工具不能用"

必须说清三条边界。第一,上述多数问题厂商已修复或有处置结论,其中两项被判定为不属于漏洞——这本身说明"什么算漏洞"在 Agent 时代还没有共识,测试团队要按自己的风险承受度定规则,而不是等一个统一标准。第二,研究环境的高成功率不等于你的团队会被同样命中,真实攻击还需要投递路径。第三,禁用所有扩展是最省事也最没用的方案,它会把供应链风险换成"团队绕开管控私自安装"的风险。

真正可迁移的能力是:把 Agent 当成一个"有权限的新同事"来建模——它能读什么、能写什么、谁能批准、留下什么日志。这套建模方法和你做权限测试、做接口越权测试时用的是同一套思路,只是对象从"用户"换成了"Agent"。

当模型能力越来越接近,团队之间的差距会落在这种"边界定义"上:谁能说清楚哪些动作必须有人批、哪些配置不许变、哪些日志必须留,谁就敢把 Agent 放进生产链路。这件事没有模型能替你做。

本文部分内容参考了霍格沃兹测试开发学社整理的相关技术资料,主要涉及软件测试、自动化测试、测试开发及 AI 测试等内容,侧重测试实践、工具应用与工程经验整理。

相关文章
|
7天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
3216 29
|
6天前
|
Linux 开发工具 iOS开发
Codex保姆级教程(下载+安装+登录+使用,含所有版本,2026最新)
Codex是OpenAI推出的开源AI编程智能体,本地运行,可理解整个代码库,支持自然语言指令改代码、执行命令、跑测试、修Bug,兼容Win/macOS/Linux。(239字)
|
2天前
|
云安全 人工智能 安全
|
7天前
|
iOS开发 Docker MacOS
【2026实测】Docker Desktop下载、安装、汉化、配置教程(附官网安装包)
Docker Desktop 是 Docker 官方推出的桌面容器管理工具,集成引擎、CLI、图形界面与 Kubernetes,支持 Win/macOS/Linux。2026 最新版 4.88.1 强化 ARM 原生运行、镜像加速及资源可视化,附中文汉化与国内镜像配置指南。
1430 5
|
云安全 安全 网络安全
|
8天前
|
安全 算法 定位技术
《高性价比人生指南》完整原版:普通人用最少的资源,过好这一生的底层逻辑~How To Live Better
📖《高性价比人生指南》是一份基于实证、拒绝焦虑的生存手册,倡导以“人生时薪”为视角,重新计算时间、金钱与精力的成本与收益。它不承诺逆袭,只教人算清账:省下的钱若耗掉时间便亏;买体验比买物品更值;睡眠是最高杠杆的健康投资;关系贵在情绪价值而非表面热络;学习重在改变行为而非自我安慰。核心理念:用低成本、高回报的微小行动,换取长期的选择权——不是成为谁,而是掌控自己人生的主动权。
|
20天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
3554 53
|
12天前
|
人工智能 JSON Linux
【保姆级】ComfyUI部署教程(下载+安装+配置+工作流,2026最新)
ComfyUI 是一款开源节点式AI生成工具,支持图像、视频、音频及3D内容创作。通过拖拽连线组合模型加载、提示词、采样等节点,构建可复用、易修改的工作流,兼容SD1.5、SDXL、Flux、Qwen Image等主流模型。