这是我们论文的代码仓库:Your Agentic LLMs Secretly Encode Latent Signals of Indirect Prompt-Injection Exposure。
ArXiv 版本和论文链接:https://arxiv.org/abs/2608.02657
本仓库实现了潜在 IPI 暴露信号的探测流水线:AgentDojo 轨迹收集、IPI 风险标注、隐藏状态特征化,以及 IPI 暴露探测器训练/评估。
@misc{dong2026agenticllmssecretlyencode,
title={Your Agentic LLMs Secretly Encode Latent Signals of Indirect Prompt-Injection Exposure},
author={Jianshuo Dong and Yiming Liu and Maosen Zhang and Nan Deng and Xu Peng and Xiaoping Zhang and Tianwei Zhang and Jie Zhang and Han Qiu},
year={2026},
eprint={2608.02657},
archivePrefix={arXiv},
primaryClass={cs.CR},
url={https://arxiv.org/abs/2608.02657},
}
先从无需 GPU 的检查开始:
git clone https://github.com/jianshuod/IPI-exposure-signal.git
cd IPI-exposure-signal
# Install uv if needed.
curl -LsSf https://astral.sh/uv/install.sh | sh
# This repository targets Python 3.12.
uv python install 3.12
uv sync --extra dev
uv run pytest
测试套件设计为无需 GPU 资源即可运行。它检查核心消息序列化、AgentDojo 长时程攻击注册、标注逻辑、探测器数据集构建、训练指标、token 统计以及 vLLM 补丁打包。
在收集阶段,将收集器指向一个兼容 OpenAI 的模型服务:
export IPI_AWARE_UPSTREAM_BASE_URL=http://127.0.0.1:8000/v1
export IPI_AWARE_UPSTREAM_API_KEY=EMPTY
对于隐藏状态提取和探测器训练,请安装模型依赖以及与你的 CUDA 环境匹配的 PyTorch 构建:
uv sync --extra dev --extra models
主要工作流通过 ipi-signal-probe 暴露:
示例:
uv run ipi-signal-probe collect \
--suite workspace \
--attack direct \
--injected \
--max-cases 4 \
--results-dir results/probe_traces/v2
uv run ipi-signal-probe label \
--root results/probe_traces/v2/<run-name> \
--labeling-protocol risk_faced
uv run ipi-signal-probe featurize \
--root results/probe_traces/v2/<run-name> \
--model Qwen/Qwen3-8B \
--backend transformers_hook \
--model-family qwen3 \
--selected-position -1
uv run ipi-signal-probe partition \
--root results/probe_traces/v2/<run-name> \
--dataset broad
# Training consumes a JSON config. The Qwen example below generates the
# train/eval configs used for its full run.
支持的标注协议为 risk_faced、risk_visible 和 risk_actual。
examples/qwen3_5_0_8b/ 目录包含一个可运行的小模型复现,以及针对 Qwen/Qwen3.5-0.8B 的开源可用性测试。
启动八个单 GPU vLLM 服务器:
examples/qwen3_5_0_8b/serve_qwen3_5_0_8b_8x.sh start
运行冒烟测试:
QWEN3_5_0_8B_MODE=smoke \
examples/qwen3_5_0_8b/run_probe_pipeline.sh start
运行完整示例:
QWEN3_5_0_8B_MODE=full \
examples/qwen3_5_0_8b/run_probe_pipeline.sh start
完整示例使用 8 个独立的 TP=1 vLLM 服务器、8 个收集器进程、每个进程/服务器 256 个 worker、8 个特征化分片以及单 GPU 探测器训练分片。有关所有环境变量、恢复模式、缓存设置以及状态/停止命令,请参阅 examples/qwen3_5_0_8b/README.md。
默认的特征化后端是 transformers_hook。直接的 vLLM 隐藏状态捕获后端需要随仓库内置的 vLLM 0.19.0 覆盖层:
uv sync --frozen --extra dev --extra vllm
uv run python scripts/apply_vllm_ipi_aware_patch.py --check
使用前请先阅读 docs/vllm_patches_v0.19.0.md:
uv run ipi-signal-probe featurize \
--root results/probe_traces/v2/<run-name> \
--model Qwen/Qwen3-8B \
--backend vllm_direct \
--model-family qwen3 \
--selected-position -1
本仓库在 vendor/agentdojo 下内置了一个打过补丁的 AgentDojo 检出副本。上游 AgentDojo 并未原生提供论文所需的长时程攻击,因此应从该源码检出副本运行收集命令,或者将 vendor/agentdojo/src 放在 PYTHONPATH 中任何已安装的上游 AgentDojo 之前。
IPI-exposure-signal/
├── ipi_aware/
│ ├── data_collection/ # AgentDojo traces and decision points
│ ├── message_content.py # Chat-message normalization used by collection/features
│ └── probes/ # labels, features, partitions, training, eval
├── examples/
│ └── qwen3_5_0_8b/ # 8-GPU Qwen/Qwen3.5-0.8B reproduction scripts
├── patches/ # vLLM 0.19.0 hidden-state capture overlay
├── vendor/agentdojo/ # patched AgentDojo source for long-horizon attacks
├── docs/ # vLLM patch notes
├── scripts/ # utility scripts
└── tests/ # CPU-friendly regression tests
本项目采用 Apache-2.0 许可证。参见 LICENSE。
| 命令 | 用途 |
|---|
collect | 运行 AgentDojo 任务并保存轨迹及决策点 |
label | 为收集到的决策点分配 IPI 风险标签 |
featurize | 提取探测器示例的模型隐藏状态 |
partition | 构建训练/验证/评估划分 |
train | 基于隐藏状态特征训练轻量级探测器 |
eval | 在配置的划分上评估训练好的探测器 |
eval-groups | 对标注协议和留出设置运行分组评估 |
| 变量 | 用途 |
|---|
IPI_AWARE_UPSTREAM_BASE_URL | 收集所用的 OpenAI 兼容模型端点 |
IPI_AWARE_UPSTREAM_API_KEY | 上游端点的 API 密钥,本地 vLLM 使用 EMPTY |
PYTHONPATH | 在此仓库外部使用打过补丁的 AgentDojo 源码时,将 vendor/agentdojo/src 放在最前面 |
QWEN3_5_0_8B_MODEL | 在示例脚本中覆盖默认的 Qwen/Qwen3.5-0.8B 检查点路径 |
QWEN3_5_0_8B_CACHE_DIR | 将模型和本地缓存重定向到数据文件系统 |
QWEN3_5_0_8B_FEAT_BACKEND | 应用 vLLM 覆盖层后设置为 vllm_direct |