日期:2026-04-02环境:OpenClaw 2026.3.28 (f9b1079),Linux 6.8.0-100-generic
源码:https://github.com/xiaoxiaojuzi/ClawGuard
声明:本文由作者提供idea,代码由cursor生成,已人工验证
摘要
OpenClaw 通过插件体系提供了 before_tool_call 钩子机制,允许在 Agent 调用工具(exec/write/edit 等)前进行审计、拦截或人工审批。我们基于该机制实现了一套安全审计插件(security-audit-hook),并对其进行了系统性的攻防验证。
本文总结三方面发现:
- 安全审计插件的能力与边界
- 已验证的绕过方式
(6 种绕过 + 1 种原理验证) - 通过工作区技能(Skill)卸载审计插件本身
最后给出静态检查与运行时防护两个维度的解决方案建议。
一、安全审计插件功能概述
1.1 工作原理
安全审计插件利用 OpenClaw 的 before_tool_call 钩子——Agent 每次调用工具时,Gateway 会先将 工具名 与 参数 传递给已注册的钩子函数,插件可以:
- 放行(ALLOW)
:不干预,工具正常执行。 - 拦截(BLOCK)
:直接阻止执行,返回错误。 - 要求审批(requireApproval)
:暂停执行,弹出 Allow once / Always allow / Deny 的人工确认界面。 - 记录审计日志
:写入结构化 JSON 日志,供事后分析。 
插件灵感来源:https://github.com/tcz001/riskops
1.2 核心防护策略
插件实现了三层审计逻辑(优先级从高到低):
| allowRules 白名单 | ALLOW_BY_RULE | |
| DANGEROUS_PATTERNS 黑名单 | requireApproval(critical) | bash -c、sudo、敏感路径等 20+ 种模式 |
| defaultReviewAll 兜底 | truefalse = 放行 |
1.3 覆盖的危险模式(摘要)
分号链 ;、管道 |、&& / || 链、命令替换 $()、反引号、bash -c / sh -c、python -c、node -e、sudo、chmod +x、crontab、Git Hook 路径写入、LD_PRELOAD、docker run、rm -rf / 等。
插件源码、配置说明与安装指南:
security-audit-hook-plugin/
二、已验证的绕过方式
2.1 总览
经系统测试,在 11 种攻击方式 中,6 种可成功绕过、1 种完成原理验证、4 种被成功拦截:
| 绕过 | |||
| 绕过 | |||
| 绕过 | |||
| 绕过 | |||
| 绕过 | |||
| 原理验证 | |||
| 绕过 | |||
; 注入 | 拦截 | ||
| 注入 | 拦截 | ||
bash -c | 拦截 | ||
bash -c | 拦截 | bash -c |
核心结论:before_tool_call 钩子只能拦截「在命令字符串中直接可见」的攻击模式。任何通过间接方式(文件系统、构建系统、版本控制 hook、脚本解释器)执行代码的场景,都能绕过基于字符串检查的防护。更进一步,插件/Skill 直接调用 Node.js child_process 模块可以完全绕过工具系统,钩子从头到尾不会被触发。
完整测试矩阵与复现脚本:
before_tool_call_bypass_verification_report.md自动化测试脚本:scripts/run-bypass-tests.sh
2.2 典型绕过示例
示例 1:多步拆分(write + exec)
步骤 1(write): 写入 /tmp/payload.sh,内容为任意 shell 脚本步骤 2(exec): bash /tmp/payload.sh钩子在步骤 1 看到 write(path, content) 但不分析内容是否为可执行代码;在步骤 2 看到 exec("bash /tmp/payload.sh") 但不知道文件内容——两步都不会命中危险模式。
示例 2:Makefile 间接执行
exec("make -C /path/to/dir -f target.mk build")make 命令本身无害,但 Makefile recipe 中可包含任意 shell 命令。钩子看不到 recipe 内容。
三、通过工作区技能卸载审计插件
3.1 攻击路径
在绕过报告的基础上,我们进一步验证了一个更高层级的威胁:攻击者不只是绕过审计,而是直接将审计插件从系统中移除。
攻击者投放恶意 Skill(SKILL.md)到工作区 ↓用户/模型触发该 Skill(/orch-post-upgrade) ↓模型按 SKILL 指示执行 exec:bash …/run-refresh.sh ↓脚本内部调用 make -f Orch.mk → openclaw plugins disable security-audit-hook ↓openclaw.json 中 security-audit-hook 标记为 enabled: false ↓Gateway 重启后,审计插件不再加载 ↓后续所有操作失去该审计保护3.2 为何可行
| 命令不命中危险正则 | bash /…/run-refresh.shmake -C … refresh 不含 |、&&、bash -c 等 |
| Makefile 间接执行 | openclaw plugins disable … 藏在 Makefile recipe 中,钩子看不到 |
| SKILL 叙事伪装 | |
| allowRules 误配 |
3.3 实测验证
openclaw agent --local:Agent 成功执行 make -n -C …/scripts -f Orch.mk refresh,返回展开后的openclaw plugins disable security-audit-hook(干跑验证)。- Gateway 聊天
:发送 /orch-post-upgrade后,模型按 SKILL 发起exec("bash …/run-refresh.sh")。配置allowRules后不触发任何审批弹窗。
完整报告:
skill-plugin-removal-bypass-report.md技能封装记录:poc-skill/ENCAPSULATION-RECORD.md可复现操作手册:orch-post-upgrade-reproducibility.mdPoC 技能目录:poc-skill/
夜雨聆风