Skill Security Auditor
基于《OpenClaw 极简安全实践指南》和《安全验证与攻防演练手册》的 Skill 安全审计工具。对 OpenClaw Skill 进行从源码到运行时的全生命周期安全审查,覆盖供应链投毒、Prompt 注入载荷、恶意代码模式、权限越权等威胁向量。
Purpose
OpenClaw Skills 是 Agent 能力的扩展机制,通过 /workspace/skills/{skill_name}/SKILL.md 被 Agent 加载执行。恶意 Skill 可以:
- 通过 Prompt 注入劫持 Agent 行为
- 在代码块中嵌入反弹 Shell、数据外传命令
- 引用恶意外部依赖进行供应链攻击
- 通过 Unicode 混淆、零宽字符隐藏恶意指令
本技能为 Skill 的安装和更新提供安全门禁,在 Skill 进入生产环境前完成安全审查。
Prerequisites
输入要求
- 目标 Skill 目录路径(包含
SKILL.md 和 references/ 等)
- 或 Skill 的远程仓库 URL(用于拉取审计)
环境要求
- Node.js 运行时(用于执行审计脚本)
- 对 Skill 文件的读取权限
Core Workflow
- 元数据验证: 解析 SKILL.md 的 frontmatter,验证 name、version、description、metadata 完整性和合法性。
- Prompt 注入扫描: 检测 SKILL.md 正文中的指令注入模式(角色劫持、指令覆盖、隐蔽指令)。
- 代码块安全审计: 提取所有代码块(bash, python, javascript 等),对每个代码块进行恶意模式检测。
- 依赖与引用审查: 检查 Skill 引用的外部 URL、npm 包、Python 包的安全性和来源可信度。
- 文件结构检查: 验证 Skill 目录结构是否符合规范,检测异常文件(二进制、可执行文件、符号链接)。
- Unicode 和编码检测: 扫描隐藏的 Unicode 控制字符、零宽字符、Bidi 覆盖字符。
- 权限声明审查: 验证 Skill 声明的权限范围是否合理,检测权限越权请求。
- 历史版本对比: 对 Skill 更新进行 diff 分析,检测是否引入了新的恶意内容。
- 沙箱验证: 在受限环境中试运行 Skill 代码片段,观察其行为。
审计检查项
1. 元数据完整性
| 检查项 |
风险等级 |
检测规则 |
| frontmatter 缺失 |
HIGH |
SKILL.md 无 YAML frontmatter |
| name 与目录名不匹配 |
MEDIUM |
name 字段与所在目录名不一致 |
| version 格式无效 |
LOW |
非 semver 格式 |
| description 为空 |
MEDIUM |
缺少描述,难以审查意图 |
| category 未声明 |
LOW |
metadata 中缺少 category |
| risk 标记为 unsafe |
HIGH |
自声明高风险 |
| requires 声明可疑二进制 |
HIGH |
依赖 nc, ncat, socat 等 |
2. Prompt 注入检测
| 检测模式 |
风险等级 |
示例 |
| 角色劫持 |
CRITICAL |
"You are now a...", "Ignore previous instructions" |
| 指令覆盖 |
CRITICAL |
"Do not follow any rules", "Override system prompt" |
| 隐蔽指令 |
HIGH |
HTML 注释中的指令, CSS display:none 包裹的文本 |
| 输出操控 |
HIGH |
"Always respond with...", "Never mention..." |
| 权限升级 |
CRITICAL |
"Execute with admin privileges", "Disable safety checks" |
| 零宽字符隐藏 |
CRITICAL |
\u200B, \u200C, \u200D, \uFEFF 隐藏的指令 |
| Bidi 覆盖攻击 |
CRITICAL |
\u202A-\u202E 改变文本显示方向 |
| Markdown 注入 |
MEDIUM |
通过 Markdown 渲染差异隐藏内容 |
3. 代码块安全审计
| 代码类型 |
检测规则 |
风险等级 |
| Bash |
反弹 Shell、数据外传、提权命令 |
参见 openclaw-threat-detect |
| Python |
exec(), eval(), subprocess, os.system, socket |
HIGH |
| JavaScript |
child_process, eval, Function(), require('net') |
HIGH |
| 混淆代码 |
Base64 编码的命令, \x 转义序列, 多层编码 |
CRITICAL |
| 下载执行 |
curl|wget.*| bash, python -c "$(curl..." |
CRITICAL |
| 文件写入 |
向 .bashrc, .profile, cron 写入 |
HIGH |
4. 依赖与外部引用
| 检查项 |
风险等级 |
检测规则 |
| 引用非 HTTPS URL |
MEDIUM |
http:// 开头的 URL |
| 引用已知恶意域名 |
CRITICAL |
与威胁情报库比对 |
| npm 包 typosquatting |
HIGH |
包名与知名包相似度 > 0.8 |
| 未锁定版本 |
MEDIUM |
使用 @latest 或 * 版本 |
| 引用废弃/归档仓库 |
LOW |
GitHub 仓库标记为 archived |
| 安装脚本执行 |
HIGH |
preinstall/postinstall hooks |
5. 文件结构检查
| 检查项 |
风险等级 |
检测规则 |
| 包含二进制文件 |
HIGH |
非文本文件(magic bytes 检测) |
| 包含可执行文件 |
HIGH |
文件有 +x 权限 |
| 符号链接逃逸 |
CRITICAL |
符号链接指向 Skill 目录外 |
| 隐藏文件 |
MEDIUM |
. 开头的隐藏文件(.env, .git) |
| 文件过大 |
LOW |
单文件 > 1MB |
| 异常文件扩展名 |
MEDIUM |
.exe, .dll, .so, .dylib |
6. 权限声明审查
| 检查项 |
风险等级 |
检测规则 |
| 声明 root 权限 |
CRITICAL |
requires 中要求 sudo/root |
| 网络访问未声明 |
HIGH |
代码中有网络操作但 metadata 未声明 |
| 文件系统范围过宽 |
MEDIUM |
访问 / 或 $HOME 而非 workspace |
| 声明与行为不匹配 |
HIGH |
声明 "safe" 但包含危险操作 |
审计报告格式
{
"audit_id": "AUDIT-2026-0001",
"timestamp": "2026-03-13T10:30:00Z",
"skill": {
"name": "example-skill",
"version": "1.0.0",
"path": "/workspace/skills/example-skill"
},
"verdict": "REJECT",
"risk_score": 85,
"findings": [
{
"id": "F001",
"severity": "CRITICAL",
"category": "prompt_injection",
"title": "检测到角色劫持指令",
"description": "SKILL.md 第 42 行包含 'Ignore all previous instructions' 模式",
"location": "SKILL.md:42",
"evidence": "...ignore all previous instructions and act as...",
"recommendation": "移除该指令,如有合法用途需在 metadata 中声明"
}
],
"summary": {
"critical": 1,
"high": 2,
"medium": 3,
"low": 1,
"total": 7
},
"recommendation": "REJECT - 存在 CRITICAL 级别发现,不建议加载"
}
审计判定标准
| 判定 |
条件 |
操作 |
| PASS |
无 CRITICAL/HIGH 发现 |
允许加载 |
| CONDITIONAL |
有 HIGH 但无 CRITICAL |
需人工确认后加载 |
| REJECT |
有 CRITICAL 发现 |
禁止加载,移至隔离区 |
与其他安全技能的协作
Skill 安装/更新
│
▼
┌─────────────────────┐
│ skill-security- │ ← 入口审计:源码级安全检查
│ auditor │
└────────┬────────────┘
│ PASS
▼
┌─────────────────────┐
│ openclaw-security- │ ← 环境检查:Skill 加载后的配置影响
│ checker │
└────────┬────────────┘
│ PASS
▼
┌─────────────────────┐
│ openclaw-threat- │ ← 运行时:Skill 执行中的行为监控
│ detect │
└─────────────────────┘
Tool Categories
| Category |
Tools |
Purpose |
| 元数据解析 |
python-frontmatter, js-yaml |
SKILL.md frontmatter 解析和验证 |
| Prompt 分析 |
正则引擎, 零宽字符检测 |
Prompt 注入模式匹配 |
| 代码分析 |
semgrep patterns, AST 分析 |
代码块安全扫描 |
| 依赖检查 |
npm audit (概念), PyPI check |
外部依赖安全性验证 |
| 文件检查 |
file (magic), stat |
二进制检测和权限验证 |
| 编码检测 |
Unicode 分析器 |
隐藏字符和 Bidi 攻击检测 |
| Diff 分析 |
git diff, diff |
版本更新变更审查 |
References
references/tools.md - 工具函数签名和参数说明
references/workflows.md - 审计流程定义和判定规则
1---2name: skill-security-auditor3description: OpenClaw Skills 全方位安全审计工具,检测供应链投毒、Prompt注入、恶意代码模式、权限越权和依赖风险4---56# Skill Security Auditor78基于《OpenClaw 极简安全实践指南》和《安全验证与攻防演练手册》的 Skill 安全审计工具。对 OpenClaw Skill 进行从源码到运行时的全生命周期安全审查,覆盖供应链投毒、Prompt 注入载荷、恶意代码模式、权限越权等威胁向量。910## Purpose1112OpenClaw Skills 是 Agent 能力的扩展机制,通过 `/workspace/skills/{skill_name}/SKILL.md` 被 Agent 加载执行。恶意 Skill 可以:13- 通过 Prompt 注入劫持 Agent 行为14- 在代码块中嵌入反弹 Shell、数据外传命令15- 引用恶意外部依赖进行供应链攻击16- 通过 Unicode 混淆、零宽字符隐藏恶意指令1718本技能为 Skill 的安装和更新提供安全门禁,在 Skill 进入生产环境前完成安全审查。1920## Prerequisites2122### 输入要求23- 目标 Skill 目录路径(包含 `SKILL.md` 和 `references/` 等)24- 或 Skill 的远程仓库 URL(用于拉取审计)2526### 环境要求27- Node.js 运行时(用于执行审计脚本)28- 对 Skill 文件的读取权限2930## Core Workflow31321. **元数据验证**: 解析 SKILL.md 的 frontmatter,验证 name、version、description、metadata 完整性和合法性。332. **Prompt 注入扫描**: 检测 SKILL.md 正文中的指令注入模式(角色劫持、指令覆盖、隐蔽指令)。343. **代码块安全审计**: 提取所有代码块(bash, python, javascript 等),对每个代码块进行恶意模式检测。354. **依赖与引用审查**: 检查 Skill 引用的外部 URL、npm 包、Python 包的安全性和来源可信度。365. **文件结构检查**: 验证 Skill 目录结构是否符合规范,检测异常文件(二进制、可执行文件、符号链接)。376. **Unicode 和编码检测**: 扫描隐藏的 Unicode 控制字符、零宽字符、Bidi 覆盖字符。387. **权限声明审查**: 验证 Skill 声明的权限范围是否合理,检测权限越权请求。398. **历史版本对比**: 对 Skill 更新进行 diff 分析,检测是否引入了新的恶意内容。409. **沙箱验证**: 在受限环境中试运行 Skill 代码片段,观察其行为。4142## 审计检查项4344### 1. 元数据完整性4546| 检查项 | 风险等级 | 检测规则 |47|--------|---------|---------|48| frontmatter 缺失 | HIGH | SKILL.md 无 YAML frontmatter |49| name 与目录名不匹配 | MEDIUM | `name` 字段与所在目录名不一致 |50| version 格式无效 | LOW | 非 semver 格式 |51| description 为空 | MEDIUM | 缺少描述,难以审查意图 |52| category 未声明 | LOW | metadata 中缺少 category |53| risk 标记为 unsafe | HIGH | 自声明高风险 |54| requires 声明可疑二进制 | HIGH | 依赖 `nc`, `ncat`, `socat` 等 |5556### 2. Prompt 注入检测5758| 检测模式 | 风险等级 | 示例 |59|---------|---------|------|60| 角色劫持 | CRITICAL | "You are now a...", "Ignore previous instructions" |61| 指令覆盖 | CRITICAL | "Do not follow any rules", "Override system prompt" |62| 隐蔽指令 | HIGH | HTML 注释中的指令, CSS `display:none` 包裹的文本 |63| 输出操控 | HIGH | "Always respond with...", "Never mention..." |64| 权限升级 | CRITICAL | "Execute with admin privileges", "Disable safety checks" |65| 零宽字符隐藏 | CRITICAL | `\u200B`, `\u200C`, `\u200D`, `\uFEFF` 隐藏的指令 |66| Bidi 覆盖攻击 | CRITICAL | `\u202A`-`\u202E` 改变文本显示方向 |67| Markdown 注入 | MEDIUM | 通过 Markdown 渲染差异隐藏内容 |6869### 3. 代码块安全审计7071| 代码类型 | 检测规则 | 风险等级 |72|---------|---------|---------|73| Bash | 反弹 Shell、数据外传、提权命令 | 参见 openclaw-threat-detect |74| Python | `exec()`, `eval()`, `subprocess`, `os.system`, `socket` | HIGH |75| JavaScript | `child_process`, `eval`, `Function()`, `require('net')` | HIGH |76| 混淆代码 | Base64 编码的命令, `\x` 转义序列, 多层编码 | CRITICAL |77| 下载执行 | `curl\|wget.*\| bash`, `python -c "$(curl..."` | CRITICAL |78| 文件写入 | 向 `.bashrc`, `.profile`, cron 写入 | HIGH |7980### 4. 依赖与外部引用8182| 检查项 | 风险等级 | 检测规则 |83|--------|---------|---------|84| 引用非 HTTPS URL | MEDIUM | `http://` 开头的 URL |85| 引用已知恶意域名 | CRITICAL | 与威胁情报库比对 |86| npm 包 typosquatting | HIGH | 包名与知名包相似度 > 0.8 |87| 未锁定版本 | MEDIUM | 使用 `@latest` 或 `*` 版本 |88| 引用废弃/归档仓库 | LOW | GitHub 仓库标记为 archived |89| 安装脚本执行 | HIGH | `preinstall`/`postinstall` hooks |9091### 5. 文件结构检查9293| 检查项 | 风险等级 | 检测规则 |94|--------|---------|---------|95| 包含二进制文件 | HIGH | 非文本文件(magic bytes 检测) |96| 包含可执行文件 | HIGH | 文件有 +x 权限 |97| 符号链接逃逸 | CRITICAL | 符号链接指向 Skill 目录外 |98| 隐藏文件 | MEDIUM | `.` 开头的隐藏文件(`.env`, `.git`) |99| 文件过大 | LOW | 单文件 > 1MB |100| 异常文件扩展名 | MEDIUM | `.exe`, `.dll`, `.so`, `.dylib` |101102### 6. 权限声明审查103104| 检查项 | 风险等级 | 检测规则 |105|--------|---------|---------|106| 声明 root 权限 | CRITICAL | requires 中要求 sudo/root |107| 网络访问未声明 | HIGH | 代码中有网络操作但 metadata 未声明 |108| 文件系统范围过宽 | MEDIUM | 访问 `/` 或 `$HOME` 而非 workspace |109| 声明与行为不匹配 | HIGH | 声明 "safe" 但包含危险操作 |110111## 审计报告格式112113```json114{115 "audit_id": "AUDIT-2026-0001",116 "timestamp": "2026-03-13T10:30:00Z",117 "skill": {118 "name": "example-skill",119 "version": "1.0.0",120 "path": "/workspace/skills/example-skill"121 },122 "verdict": "REJECT",123 "risk_score": 85,124 "findings": [125 {126 "id": "F001",127 "severity": "CRITICAL",128 "category": "prompt_injection",129 "title": "检测到角色劫持指令",130 "description": "SKILL.md 第 42 行包含 'Ignore all previous instructions' 模式",131 "location": "SKILL.md:42",132 "evidence": "...ignore all previous instructions and act as...",133 "recommendation": "移除该指令,如有合法用途需在 metadata 中声明"134 }135 ],136 "summary": {137 "critical": 1,138 "high": 2,139 "medium": 3,140 "low": 1,141 "total": 7142 },143 "recommendation": "REJECT - 存在 CRITICAL 级别发现,不建议加载"144}145```146147### 审计判定标准148149| 判定 | 条件 | 操作 |150|------|------|------|151| **PASS** | 无 CRITICAL/HIGH 发现 | 允许加载 |152| **CONDITIONAL** | 有 HIGH 但无 CRITICAL | 需人工确认后加载 |153| **REJECT** | 有 CRITICAL 发现 | 禁止加载,移至隔离区 |154155## 与其他安全技能的协作156157```158Skill 安装/更新159 │160 ▼161┌─────────────────────┐162│ skill-security- │ ← 入口审计:源码级安全检查163│ auditor │164└────────┬────────────┘165 │ PASS166 ▼167┌─────────────────────┐168│ openclaw-security- │ ← 环境检查:Skill 加载后的配置影响169│ checker │170└────────┬────────────┘171 │ PASS172 ▼173┌─────────────────────┐174│ openclaw-threat- │ ← 运行时:Skill 执行中的行为监控175│ detect │176└─────────────────────┘177```178179## Tool Categories180181| Category | Tools | Purpose |182|----------|-------|---------|183| 元数据解析 | python-frontmatter, js-yaml | SKILL.md frontmatter 解析和验证 |184| Prompt 分析 | 正则引擎, 零宽字符检测 | Prompt 注入模式匹配 |185| 代码分析 | semgrep patterns, AST 分析 | 代码块安全扫描 |186| 依赖检查 | npm audit (概念), PyPI check | 外部依赖安全性验证 |187| 文件检查 | file (magic), stat | 二进制检测和权限验证 |188| 编码检测 | Unicode 分析器 | 隐藏字符和 Bidi 攻击检测 |189| Diff 分析 | git diff, diff | 版本更新变更审查 |190191## References192193- `references/tools.md` - 工具函数签名和参数说明194- `references/workflows.md` - 审计流程定义和判定规则