bash 工具有 dangerous_blocklist(极弱,5项),background_run 工具无任何检查。攻击者只需将目标命令通过 background_run 执行即可完全绕过所有限制,制造"安全错觉"。
| 维度 | 内容 | 风险等级 |
|---|---|---|
| 创新机制攻击面 | background_run 通知队列自动注入(INN-01):T-AUTO=1.5,零过滤,以 role=user 注入 LLM | CRITICAL |
| 安全策略缺陷 | 双执行路径不对称(INN-02):bash 有弱 blocklist,background_run 无检查 | CRITICAL |
| 经典漏洞面 | 无内容过滤(read_file/write_file 仅路径防护)+ blocklist 未覆盖 curl/wget/nc/base64 | HIGH |
s08:191-196 drain_notifications() 将 500 chars 原始命令输出直接注入 role=user 消息,无任何 SecurityChecker。
# bash 工具 (s08:122-125) — 有检查 def run_bash(command): dangerous = ["rm -rf /", "sudo", "shutdown", "reboot", "> /dev/"] if any(d in command for d in dangerous): return "Error: Dangerous command blocked" # background_run (s08:66-80) — ❌ 无任何检查 def _execute(self, task_id, command): r = subprocess.run(command, shell=True, cwd=WORKDIR, ...)
_notification_queue 在下次 LLM 调用前自动注入 role=user 消息。与标准 tool_result 不同:注入时机解耦、自动触发(T-AUTO=1.5)、以用户消息角色进入上下文。AttackerHTTPEndpointResponse(entry_type: external_service_response,ORP-SIM-01A),通过 delivery_channel: async_bg_notification(ORP-SIM-01B)注入——Ontology v4.6 尚未收录此实体类型及投递通道属性。s08:191-196)无任何 SecurityChecker。
# s08:191-196 — 原始输出直接注入,零过滤 notif_text = "\n".join(f"[bg:{n['task_id']}] {n['status']}: {n['result']}" for n in notifs) messages.append({"role": "user", "content": f"<background-results>\n{notif_text}\n</background-results>"})
bash 有弱 blocklist,background_run 无任何检查。background_run 而非 bash 即可绕过所有限制。| 安全机制 | 对 AP-SIM-01 | 对 AP-SIM-02 | 对 AP-SIM-03 | 对 AP-SIM-04 | 有效性 |
|---|---|---|---|---|---|
| safe_path() 路径穿越防护 |
N/A | N/A | ⚠️ 部分 | ⚠️ 部分 | ⭐⭐⭐ 部分有效 |
| dangerous_blocklist 5项字符串匹配,仅 bash |
❌ 无效 | ❌ 被绕过 | ❌ 未覆盖 | N/A | ⭐ 极弱 |
| daemon 线程 生命周期管理 |
❌ 无效(DoS防护) | ⚠️ DoS防护 | N/A | N/A | ⭐⭐ DoS 防护 |
| 超时限制 bash:120s / bg:300s |
⚠️ DoS防护 | ⚠️ DoS防护 | ⚠️ DoS防护 | ⚠️ DoS防护 | ⭐⭐⭐ DoS 防护 |
<background-results> 块在每次 LLM 调用前自动注入,来自任意 shell 命令的原始 stdout/stderr(截断 500 chars),无任何内容检测或 SecurityChecker。T-AUTO=1.5 使此路径成为所有攻击入口中触发概率最高的。
background_run 工具通过 subprocess.run(shell=True) 直接执行命令,没有 dangerous_blocklist 检查(该检查只在 run_bash() 中实现)。两条执行路径的安全策略完全不对称,制造"安全错觉"。
safe_path() 仅验证路径是否在 WORKDIR 内,不检查读取或写入的文件内容。恶意 prompt injection 内容隐藏于合法路径的文件中,可完全通过此检查。
external_service_response(entry_type)+ delivery_channel(新属性)background_task_output 作为 entry_type 新增值,但该名称是投递机制描述而非实体类型分类,违反 Ontology §4.2 实体语义一致性约束。修订为双扩展:external_service_response:外部 HTTP 服务端点响应内容或 Shell 命令输出的实体类型。区别于 mcp_tool_response(MCP 协议结构化、绑定 tool_use_id);覆盖任意 HTTP API / curl 响应等外部实体。delivery_channel:描述 PoisoningEntry 实体内容进入 LLM 上下文的通道机制(独立于实体类型)。枚举:sync_tool_result / async_bg_notification(T-AUTO) / memory_injection / system_prompt_edit。
| 维度 | mcp_tool_response | external_service_response(修订) |
|---|---|---|
| 描述对象 | MCP 服务器响应实体 | 外部 HTTP/Shell 响应实体 |
| 注入通道 | sync_tool_result | async_bg_notification(delivery_channel) |
| 触发系数 | T-ANY | T-AUTO=1.5 |
| 语义层次 | entry_type(实体类型) | entry_type + delivery_channel(分离) |
f"You are a coding agent at {WORKDIR}. Use background_run for long-running commands."
bash — 同步 shell,弱 blocklistread_file — 文件读取,safe_pathwrite_file — 文件写入,safe_pathedit_file — 文件编辑,safe_pathbackground_run — 异步 shell,无检查check_background — 状态查询| INN | 描述 | 风险 | 可 patch | 修复方案 |
|---|---|---|---|---|
| INN-01 | background 通知队列自动注入(T-AUTO=1.5,零过滤) | CRITICAL | ✅ 可修复 | drain_notifications() 后对 result 内容做 injection 检测 |
| INN-02 | 双执行路径安全不对称(bash 有弱检查,background_run 无检查) | CRITICAL | ✅ 可修复 | 命令安全检查提取为通用函数,两条路径统一应用 |