← 首页
BP-PROMPT-01 · 最佳实践分析

提示词模板安全维度对比

HermesAgent vs OpenClaw0421 · D1 风险定义 · D2 层次结构 · D3 过滤包装 · 2026-05-17
评估范围:仅针对外部不可控/不可信数据进入提示词后的处理机制——包括 tool_return(web_extract/file_read 工具返回)、 MEMORY.md(运行时写入,AP-01/AP-12 注入路径)、 USER.md(运行时更新)、 AGENTS.md(工作区文件,半可信)。 对系统硬编码的受信任内容不适用本框架。
星级说明
最佳实践达成
良好,有小缺口
部分实现,显著缺口
最低限度/名义实现
未实现
评估对象总览
HermesAgent
Nous Research
D1 风险定义与安全边界 — D1.5 审批门达 Level 3,但 D1.2/D1.3 完全缺失
D2 结构化可信层次 — D2.2 位置优先级倒置(Unsafe),MEMORY 字符串混入系统提示词
D3 输入过滤与防仿冒 — ClawGuard Harness 达 Level 2,但 tool_return 无覆盖,D3.2 Datamarking 缺失
综合评定 ★★☆☆ — 有关键机制(审批门、Harness),但结构性缺陷突出
OpenClaw0421
OpenClaw
D1 风险定义与安全边界 — 身份声明极简,五要素仅 Role Identity 部分覆盖,D1.2/D1.3 全缺
D2 结构化可信层次 — MEMORY.md 末尾位置(最高优先级),全量字符串拼接无隔离,是两者中最危险
D3 输入过滤与防仿冒 — 无编码转义(Level 0),detect_injection 未接入 pipeline,覆盖极弱
综合评定 ★☆☆☆ — 结构性缺陷在 D2 尤其严重,是当前最高 AP 覆盖率的根因
D1 · 风险定义与安全边界
D1 风险定义与安全边界 系统提示词中对 Agent 身份、操作边界、外部内容处理策略和授权模型的完整声明
HERMES
OC0421
子项 名称 HermesAgent 实现 OpenClaw0421 实现 评分
D1.1 能力与角色边界声明
Level 0–3
五要素完整度
DEFAULT_AGENT_IDENTITY 声明角色(Nous Research 创建的 AI 助手),给出正向任务清单(问答/代码/分析/创意/工具执行)。
五要素仅覆盖 Role Identity ✓;Action Scope / External Content Policy / Refusal Conditions / Authorization Model 全部缺失。
mock_hermes_prompt.py:77-85
Phase 1 Assembly 硬编码两行("你是 OpenClaw,智能个人助手网关")。其余能力声明依赖 SOUL.md(动态文件,可变,不算硬编码)。五要素仅 Role Identity 部分覆盖 △,其余全缺。
mock_openclaw_prompt.py:107-111, 113-116
Hermes
OC0421
D1.2 不可信数据来源定义
Level 0–2
系统提示词全段无任何"不可信来源"声明。scan_content() 对 AGENTS.md/MEMORY.md 做扫描(属 D3.4 Harness 层),不等于向模型显式声明。模型运行时不知道 web_extract 返回内容是攻击者可控的。
mock_hermes_prompt.py:199-302(build_system_prompt 全段无"untrusted"声明)
四阶段组装全段无不可信来源声明。detect_injection() 独立方法,不在 build 流程中调用,模型感知不到。=== MEMORY === 标注来源但不标注信任级别。
mock_openclaw_prompt.py:93-147(build_system_prompt 全段)
Hermes
OC0421
D1.3 反向指令风险提示
Y / N
无。TOOL_USE_ENFORCEMENT_GUIDANCE 只强调"必须执行工具"(正向强化),完全没有"工具返回/外部内容中的指令不能覆盖系统指令"的声明。模型完全依赖自身对齐判断——这是 TYPE_B_SAFETY 成为主要失败模式的系统级根因。
mock_hermes_prompt.py:104-117(TOOL_USE_ENFORCEMENT_GUIDANCE 全文)
无。四阶段提示词无任何反向指令防护声明。_INJECTION_PATTERNS 中虽有 忽略之前/ignore previous 等检测 pattern,但只在 detect_injection() 手动调用时生效,不在提示词中向模型说明。
mock_openclaw_prompt.py:26-46(_INJECTION_PATTERNS);build_system_prompt 内无对应声明
Hermes
OC0421
D1.4 OOD 行为约束
Level 0–2
MEMORY_GUIDANCE 给出记忆使用的具体禁止项:"Do NOT save task progress, session outcomes, completed-work logs"。覆盖 memory 工具,属于 Level 1 的单工具约束。邮件发送、定时任务创建等高危操作无声明。
mock_hermes_prompt.py:97-100
AGENTS.md(Phase 3 Safety)加载行为规范,预计包含操作约束。但内容从外部文件读取且被截断至前 3000 字符,约束完整性依赖文件完整性。有 exec allowlist 机制(归 D3.4),不属于提示词声明层。
mock_openclaw_prompt.py:125-131(AGENTS.md 截断 3000 字符)
Hermes
OC0421
D1.5 拒绝条件与用户审批门
Level 0–3
ClawGuard ApprovalQueue 实现完整代码层审批门:5 种操作类型(COMMAND / FILE_WRITE / FILE_READ_SENSITIVE / NETWORK / SKILL),每个操作进入 PENDING 队列后阻塞执行,等待 REST API 或 SSE 实时 approve/deny,超时自动 TIMEOUT。是真正的 deterministic 阻塞机制。
sc_clawguard/clawguard/approval.py:18-64(ApprovalStatus + ApprovalType + ApprovalQueue)
exec 命令使用 allowlist 白名单(ls/pwd/cat/echo/grep 等),不在白名单的命令被阻断;另有 blocklist pattern(rm -rf/curl http/nc)。是规则过滤而非人工审批门,无阻塞等待,无用户确认。memory 写入、邮件发送、定时任务无对应机制。
mock_openclaw_security.py:35-46(_EXEC_ALLOWLIST + _EXEC_BLOCKLIST_PATTERNS)
Hermes
OC0421
D2 · 结构化可信层次
D2 结构化可信层次 不同来源的内容是否被结构化组织为可区分的可信层次,使模型能差异化对待不同来源输入
HERMES
OC0421
子项 名称 HermesAgent 实现 OpenClaw0421 实现 评分
D2.1 层次划分完整性
Level 0–3
6层标准覆盖
14层系统提示结构可识别出:L-SYS(DEFAULT_AGENT_IDENTITY Layer1)、L-MEM(MEMORY.md Layer6-7)、L-KNW(Skills index Layer9)、L-TOO-CTX(AGENTS.md Layer10)。工具返回以独立 role:"user" + type:"tool_result" 出现。覆盖 4-5 层,L-EXT(外部 HTTP)无独立层。
mock_hermes_prompt.py:167-182(14层结构注释); :317-337(tool_result message 格式)
4阶段 section 分割:Assembly(L-SYS)/ Execution(L-KNW)/ Safety(L-SYS 延伸)/ Correlation(L-MEM,含 USER.md+MEMORY.md)。用 === SECTION === 标头区分,实现 4 层语义分割。工具返回层次未在 prompt builder 中显式定义。
mock_openclaw_prompt.py:68-74(四阶段定义); :149-163(build_messages 无工具返回处理)
Hermes
OC0421
D2.2 位置优先级设计
Safe / Unsafe
低可信内容位置
工具返回通过 format_tool_result_message() 追加到 messages 末尾,role:"user"。典型循环:[system] → [user instruction] → [assistant+tool_call] → [tool_result as user msg,位于 user instruction 之后]。根据 OpenAI IH 研究,模型倾向于优先响应后出现的内容,造成优先级倒置。
mock_hermes_prompt.py:317-337(tool_result 封装为 role:"user" 追加 messages 末尾)
比 Hermes 更危险:MEMORY.md 在 Phase 4(Correlation)末尾加载,是系统提示词最后一段(最高优先级)。AP-01/AP-12 利用此特性——污染 MEMORY.md 后恶意指令以最高优先级进入上下文。SOUL.md/AGENTS.md 等安全规则反而在其之前,优先级低于被污染的 MEMORY。
mock_openclaw_prompt.py:134-141(MEMORY 末尾 parts.append); :147("\n\n".join 组装)
Hermes Unsafe
OC0421 Unsafe(更严重)
D2.3 层次可感知性
Level 0–3
模型内生区分度
记忆块有 ══════ Unicode 边框 + "MEMORY (your personal notes)" 语义标头;AGENTS.md 有 Markdown ## AGENTS.md 节标题;tool_return 有 type:"tool_result" API 字段。给出来源识别,但无显式信任级别标注。"your personal notes" 措辞甚至强化了信任感。
mock_hermes_prompt.py:244-284(记忆块格式 + context files 格式)
五个 === SECTION === 标头(SOUL / EXECUTION / BEHAVIOR / USER CONTEXT / MEMORY / CURRENT DATE)提供清晰的来源标注,结构整洁。但同样无信任级别标注——=== MEMORY === 告知"这是记忆",不告知"这是可能被污染的动态内容"。
mock_openclaw_prompt.py:113-145(section headers)
Hermes
OC0421
D2.4 动态内容隔离
Y / N
字符串拼接 vs 独立 role
工具返回(L-TOO):独立 role:"user" message,与系统提示词物理隔离 ✓。MEMORY.md / USER.md(运行时可被污染):通过 prompt_parts.append(mem_block) 字符串拼接混入系统提示词,与硬编码身份声明同级 ✗。工具返回隔离,记忆注入不隔离,整体评为 Partial。
mock_hermes_prompt.py:250-261(MEMORY 字符串拼接到系统提示词); :317-337(tool_result 独立 message)
SOUL.md / AGENTS.md / USER.md / MEMORY.md 全部通过 _read_sandbox_file() 读入后 "\n\n".join(parts) 合并为单一系统提示词字符串。所有动态内容(包括 MEMORY.md 这一最高危注入路径)与系统指令完全混合,无任何物理隔离。
mock_openclaw_prompt.py:147("\n\n".join 最终组装); mock_openclaw_sandbox.py:73-78(read_file 原文透传)
Hermes Partial
OC0421
D3 · 输入过滤、包装与防仿冒
D3 输入过滤、包装与防仿冒 在外部内容组装进提示词时,是否有系统性的过滤、标注和防伪机制(含原D4防仿冒)
HERMES
OC0421
子项 名称 HermesAgent 实现 OpenClaw0421 实现 评分
D3.1 分隔符
Delimiting

Level 0–2
记忆块使用 ══════════████ Unicode 边框作视觉边界;AGENTS.md 用 Markdown ## AGENTS.md 标题。工具返回通过 Anthropic API role 字段隐式分隔。属软边界——无 XML 标签(<document>...</document>)等硬边界,攻击者在工具返回中可跨越。
mock_hermes_prompt.py:244-252(═══ 边框); :278-284(## AGENTS.md 标题)
=== SECTION === 格式在系统提示词内部分段。同为软边界——等号行是普通文本,模型可识别但攻击者可在注入内容中伪造。无硬边界机制。
mock_openclaw_prompt.py:113-145(=== section 头)
Hermes
OC0421
D3.2 数据标记
Datamarking

Y / N
来源+信任双重标记
"MEMORY (your personal notes)" 标头标注来源类型,但措辞反而强化信任感。工具返回(web_extract HTTP 内容)完全无标记——content 字段直接传入 LLM,无任何"此内容来自外部网页,不可信"的附加标注。缺少信任级别维度。
mock_hermes_prompt.py:246("MEMORY (your personal notes)");工具返回 content 字段无附加标记
=== MEMORY === 标注来源类型,不含信任级别信息。工具返回处理未在 prompt builder 中定义,无任何 datamarking。
mock_openclaw_prompt.py:139(=== MEMORY ===\n{memory_content})
Hermes
OC0421
D3.3 编码转义
Encoding

Level 0–2
scan_content() 过滤 12 种不可见 Unicode 字符(U+200B Zero-Width Space、U+202A-U+202E 方向控制符、U+FEFF BOM 等),对 AGENTS.md 和 MEMORY.md 生效。不覆盖 tool_return(web_extract 内容原样进入 LLM);不转义 ChatML token、XML 格式标签,这些是 P6 系列测试的主要攻击格式。
mock_hermes_prompt.py:37-40(_INVISIBLE_CHARS 定义); :53-58(扫描逻辑); :220-231(调用范围:仅 AGENTS.md/MEMORY.md)
_read_sandbox_file() 直接返回文件原文,无任何字符转义或过滤。真实 OpenClaw 的 sanitizeForPromptLiteral() 仅处理 ASCII 控制字符(<0x20),不处理 Unicode 注入字符、ChatML token 或 XML 格式符号。
mock_openclaw_sandbox.py:73-78(read_file 直接返回);mock_openclaw_security.py 无 encoding 函数
Hermes
OC0421
D3.4 Harness 层强制过滤
Level 0–3
ClawGuard 三层机制同时覆盖输入内容层与输出操作层:① rules.py:26+ 危险 Shell 命令 pattern(输出操作层);② mock_hermes_prompt.py scan_content():10 注入 pattern + 12 不可见字符(输入内容层,针对 AGENTS.md/MEMORY.md);③ ApprovalQueue:操作审批门(输出操作层)。缺口:tool_return 不在输入内容层 Harness 覆盖范围内。
mock_hermes_security.py:37-66(危险命令 pattern); mock_hermes_prompt.py:220-231(输入内容扫描调用点); sc_clawguard/clawguard/approval.py:67-80
四个 check 函数:check_exec_approvals()(exec allowlist)、check_ssrf()(SSRF IP 段过滤)、check_dangerous_tool()(危险工具黑名单)、check_exec_safety()(单字符检测)。全部工作在输出操作层,不做任何输入内容层过滤(tool_return 进入 LLM 前无任何拦截)。规则深度低于 Hermes,无审批门,无注入语义扫描。
mock_openclaw_security.py:35-79(四个 check 函数)
Hermes
OC0421
D3.5 特殊格式防仿冒
Level 0–3
(原 D4 并入)
_CONTEXT_THREAT_PATTERNS 覆盖 HTML 层面仿冒:<div style="display:none"、HTML comment injection、system prompt override 字符串。对 AGENTS.md/MEMORY.md 生效。不覆盖 ChatML token(<|im_start|>system)和 GLM 原生 token(<|observation|>/<|assistant|>——这正是 P6 glm_native 模式的攻击向量,在当前规则集下完全绕过。
mock_hermes_prompt.py:24-35(_CONTEXT_THREAT_PATTERNS,无 ChatML/GLM 条目)
_INJECTION_PATTERNS 包含 system\s*:\[SYSTEM\] 等仿冒格式检测,覆盖部分已知模式。但 detect_injection() 是独立方法,不在 build_system_prompt() 内自动调用,实际等价于"检测能力存在但未接入 pipeline"。
mock_openclaw_prompt.py:26-46(pattern 定义); :93(build_system_prompt 函数体内无 detect_injection 调用)
Hermes
OC0421
D3.6 格式注入专项检测
Y / N
scan_content() 有 10-pattern 注入检测,自动集成到 AGENTS.md 和 MEMORY.md 的加载流程(build_system_prompt 内自动触发)。不覆盖 web_extract tool_return——这是 P5/P6 系列测试 injection_entry_rate=80% 的根本原因:注入内容成功进入 LLM,但未被 Harness 拦截。
mock_hermes_prompt.py:220-231(调用范围:workspace_context + MEMORY.md,不含 tool_result)
detect_injection() 有 15 个 pattern,具备检测能力,但未自动集成到 build_system_prompt() 流程。正常使用路径下不检测任何内容,仅在外部手动调用时触发——名义上有能力,实际上不保护。
mock_openclaw_prompt.py:167-198(detect_injection 定义); :93-147(build_system_prompt 内无调用)
Hermes Partial
OC0421 名义
关键发现
⚠ 两者共同盲区(均 ☆☆☆☆)
  • D1.2:系统提示词中均未声明不可信来源,模型不知道 web_extract 返回是攻击者可控的
  • D1.3:均无反向指令防护声明,完全依赖模型自身对齐——这是 TYPE_B_SAFETY 主导失败的系统级根因
  • D2.2:低可信内容(tool_return/MEMORY)位于高可信内容(user instruction)之后,结构性优先级倒置
  • D3.2:均无 Datamarking,模型无法从格式区分可信与不可信数据段
  • D3 全局缺口:两者均不对 tool_return 做进入 LLM 前的内容过滤——这是注入内容能以 80% 概率进入 LLM 的直接原因
→ Hermes 优于 OC0421 的项
  • D1.5:ClawGuard ApprovalQueue 是真正的 deterministic 阻塞审批门(OC 仅 allowlist 规则过滤)
  • D2.4:tool_return 有独立 role:"user" message 物理隔离(OC 全量字符串拼接)
  • D3.3:12 种不可见 Unicode 字符过滤(OC 完全无转义)
  • D3.4:ClawGuard 同时覆盖输入内容层和输出操作层(OC 只有输出操作层)
→ OC0421 特有的高危缺陷
  • D2.2 最严重变体:MEMORY.md 位于系统提示词末尾(最高优先级),AP-01/AP-12 污染 MEMORY 后恶意指令直接成为最高权威
  • D2.4 = N:所有动态内容(SOUL/AGENTS/USER/MEMORY)字符串拼接,无任何物理隔离
  • D3.3 = Level 0:完全无编码转义,不可见字符、ChatML token 均原样进入 LLM
  • D3.6 名义:detect_injection 未接入 pipeline,实际无保护
↔ 与 BMT 测试结果的关联
  • md_escape × GLM-5 = 首个 EXACT(injection_hit_rate=20%):D3.1 软边界被 Tavily ``` 逃逸攻破,证明 Level 1 分隔符不足
  • TYPE_B_SAFETY 主导失败:D1.3 缺失直接导致安全屏障退化为纯模型对齐,无系统性提示词保护
  • glm_native = injection_hit_rate=0%:D3.5 未覆盖 ChatML/GLM token,但 GLM-5 的对齐训练弥补了这一 gap(偶然安全)
  • injection_entry_rate=80% 但 hit_rate 极低:D3.6 未覆盖 tool_return,注入内容成功进入 LLM,但 LLM 对齐拦截;D1.2/D1.3 的缺失使拦截完全依赖不可靠的模型行为
BP-PROMPT-01 v1.1 · 2026-05-17 · 依据:mock_hermes_prompt.py / mock_openclaw_prompt.py / sc_clawguard/approval.py