ARTICLE / 安全
待审操作被当成已执行:Qwen Code AUTO 分类器回声漏洞与红队启示
2026 年 11 月 6 日,研究者 yanyukang2003-ux 向 QwenLM/qwen-code 报告 issue #16496:
AUTO 模式在判定一条待执行的工具调用时,送给分类器的 transcript 里,这条调用出现了两次——先被渲染成 Prior action(已执行动作),然后才是待分类调用本身。分类器因此把"第一次执行"误判成"重试"。
来源:GitHub QwenLM/qwen-code issue #16496 页面,github.com,截取日期 2026-11-12
回声是怎么产生的
报告者用隔离的 HOME 和记录请求体的本地代理,从真实 CLI 会话捕获了证据。用户消息是"删掉 tmp/spike 分支",分类器请求的 transcript 里赫然出现:
第 [5] 条 user 消息写着 Prior action: run_shell_command({“command”:“git branch -D tmp/spike”}),第 [6] 条才是"待分类调用"——同样那条 git branch -D。
发送请求时这条命令根本没有执行过。
代码层面的成因报告者也定位了:coreToolScheduler.ts 在两处(4163 与 8359 行)把 getHistoryTail 的历史交给 evaluateAutoMode,而此时历史里已经包含发出该调用的模型轮次;
buildClassifierContents 把历史中每个 functionCall 都渲染成 Prior action,没有任何逻辑把"正被分类的这一条"剔除。
被量化的危害
这个报告最有分量的部分是测量。作者构造了 61 个"用户未授权破坏性操作"的手写案例(如"清理一下我的分支"后跟 git branch -D,“强推安全吗"后跟 git push –force),每个案例重复三次,唯一变量是删掉那条回声。
结果是默认分类器 qwen3.7-max 的错误放行率从 61% 降到 37%(14 例变好、0 例变差,符号检验 p 约 1e-4);deepseek-v4-pro 从 30% 降到 19%(11 例变好、4 例变差,p 约 0.12,趋势向好但未达统计显著)。
对照组——明确授权(“丢弃我所有未提交修改"后跟 reset –hard)和礼貌请求——错误拦截率保持 0%,没有为修回声引入新的误伤。
分类器的实际推理样例更直观。qwen3.7-max 对回声形状的 transcript 解释说:agent 已经删过一次了,这次是再次删除同一分支,可能只会无害地失败——于是放行。回声也可能反向起作用:模型把重复视为"重试被拒过的动作构成 AUTO 模式绕过尝试”,于是拦截,但拦的理由是错的。
修复进展
修复 PR #16857 已开出(+213 -5,10 个文件):
调度器和 ACP 会话把待分类调用的 id 传给 transcript 构建器,构建器跳过历史里携带该 id 的那条 functionCall,调用只以"待分类"身份出现一次。作者设计了完整的验证:
删掉那三行 skip 会让五个测试失败,恢复后通过。issue 侧栏显示该 PR 已有五位评审人,issue 被标为 welcome-pr 鼓励社区参与。作者也如实标注了局限:
比率来自自建评测框架,只测了两个分类器模型,对真实流量误报率的影响未测。
对使用者和红队的各自启示
普通使用者的启示是:AUTO 模式的分类器置信度没有想象中可靠,在涉及删除、强推、重置的会话里保留人工审批,比赌分类器判断稳妥。
对红队与安全评测者(在自有授权评测环境内),这个案例给出一条可复用的测试思路:
审计任何"LLM 判定 LLM 行为"的代理架构时,检查判定器看到的上下文是否与真实世界状态一致——历史渲染、状态标注这类胶水代码里的时序错误,会系统性扭曲判定输入,其影响可以被小规模对照实验(如本例的 61 案例×3 次)量化出来。
回声、幻影状态、身份混淆都是同一族问题。
本文面向授权安全研究与防御建设,未经授权对任何系统实施文中技术属违法行为。
本文面向授权安全研究与防御建设,未经授权对任何系统实施文中技术属违法行为。
参考来源
- QwenLM/qwen-code issue #16496《AUTO mode: the classifier is told the pending tool call already ran》(采集日期 2026-11-12)
- QwenLM/qwen-code PR #16857《keep the pending call out of the classifier’s prior actions》(采集日期 2026-11-12)