aayushcodebook/agentscan
GitHub: aayushcodebook/agentscan
面向自托管 AI agent 的跨框架本地安全态势扫描器,通过 19 项检查并映射行业标准框架给出 A–F 评分,帮助开发者和安全团队快速发现配置缺陷、已知漏洞及恶意插件。
Stars: 0 | Forks: 0
# agentscan
**适用于自托管 AI agent 的跨 agent 安全态势扫描器。**
https://github.com/user-attachments/assets/422a90a9-3ce1-4071-8ce9-38c10cf77238
大多数 agent 安全工具只能在您安装之前扫描单个 agent 的单一 skill。
agentscan 可审计您的**整个运行中安装**——并且支持跨 **OpenClaw,
Hermes 等**通过单一工具完成。一条命令即可执行基于框架映射的
态势评估——**19 项检查加上复合风险关联**——涵盖
网络暴露、网关认证、CVE、密钥、SSRF、沙盒,*以及*恶意
skills/plugins(包含污点分析 + prompt injection 检测)。它将每个
发现映射到 CWE / OWASP LLM Top 10 / MITRE ATLAS,为您的设置评分 **A–F**,并
为 CI 输出 **SARIF**。一切都在您的本地机器上运行——绝不上传
任何数据,且**零依赖**,因此您可以在信任它之前查阅每一行代码。
已针对 **OpenClaw 和 Hermes 两者的**真实默认安装进行了验证——
每项均获得 **B** 评级,并提供具体、可操作的发现,**零误报**(包含
超过 300 个真实的内置 skills)。
```
npx @aayushcodebook/agentscan
```
```
OpenClaw ~/.openclaw F 0/100
──────────────────────────────────────────────────
● FAIL CHAIN: network-exposed AND unauthenticated gateway (RCE-class) CRIT
CWE-306,CWE-668 · LLM06:2025 · AML.T0049,AML.T0012
● FAIL Agent version vs. known security advisories (CVEs) CRIT
CWE-1395 · LLM03:2025
Installed version 3.0.0 is affected by CVE-2026-25253 (CVSS 8.8)…
● FAIL Malicious or suspicious skills & plugins CRIT
● FAIL Gateway authentication (is the local API/WebSocket protected?) CRIT
…
posture grade F 0/100
coverage: 13/15 checks ran
```
## 检查内容
每个发现都会标记其 **CWE**、**OWASP LLM Top 10 (2025)**,以及(如果适用)
**MITRE ATLAS** 技术,并带有用于评分的固有严重性。
| 检查项 | 映射到 | 为什么重要 |
|-------|---------|----------------|
| **网络暴露** | CWE-668 · ATLAS T0049 | 端口在 localhost 之外是否可访问?(63% 的公开实例是可访问的。) |
| **隧道暴露** | CWE-668 · LLM06 | 通过 Tailscale Funnel / ngrok / cloudflared 代理的 localhost 绑定 agent 实际上仍暴露在公网上——这是绑定地址的视觉盲区。 |
| **网关认证** | CWE-306/307 · LLM06 | 开放端口 + 无/弱认证 = ClawJacked/ClawBleed (CVE-2026-25253) 的前置条件。 |
| **访问策略** | CWE-284 · LLM06 | `dmPolicy: open` / `allowFrom: ["*"]` 允许频道上的任何陌生人指挥 agent。 |
| **CORS** | CWE-942 | 通配符 origin 允许您访问的任何网站调用 agent 的 API。 |
| **明文凭据** | CWE-312 · LLM02 | API 密钥/密码以明文形式存储在 config 中。 |
| **密钥脱敏** | CWE-532 · LLM02 | 如果关闭脱敏,工具输出中的密钥会泄漏到 transcripts 和磁盘上的 logs 中。 |
| **密钥文件权限** | CWE-732 | `.env` 中的密钥只有在文件对全局不可读时才是安全的。 |
| **Git 中的密钥** | CWE-540 · LLM02 | Agent 主目录是一个 repo 且密钥未被 `.gitignore` 忽略 → 被提交/推送。 |
| **版本与 CVE** | CWE-1395 · LLM03 | 运行带有已发布安全公告的构建(feed 可更新;内置 2026 年 OpenClaw CVE)。 |
| **恶意 skills & plugins** | CWE-506 · LLM01/LLM03 · ATLAS T0010 | 通过签名发现(`SKILL.md`/`openclaw.plugin.json`),与 ClawHavoc 黑名单匹配,进行**污点分析**(密钥是否真的*流入*了网络/exec sink?),在 SKILL.md *文本*中进行 **prompt injection 扫描**(隐形/双向 unicode、隐藏注释指令、角色劫持/覆盖、数据外泄 prompt),并进行**完整性验证**(“第一方” skill 只有在其字节哈希与原始匹配时才被信任;冒名顶替者将被捕获)。如果未发现任何内容则跳过(从不通过)。 |
| **MCP 供应链** | CWE-829 · LLM03 | 远程 MCP 工具服务器是位于 agent 信任边界内的第三方代码。 |
| **SSRF / 私有 URL** | CWE-918 · LLM06 | 如果开启了私有 URL 访问,中毒的链接可能会触达内部主机或 cloud-metadata endpoint (169.254.169.254)。 |
| **命令内容扫描器** | CWE-693 · LLM06 | Hermes 预先检查 shell 命令 (Tirith);标记其是否已禁用或 fail-open。 |
| **沙盒 / agency** | CWE-250 · LLM06 | 未沙盒化的工具(或以 root 身份运行)会将一条错误指令转化为完整的机器访问权限。 |
| **命令/exec 策略** | CWE-250 · LLM06 | 不受限制的 shell(`tools.exec.security="full"`,命令允许列表为空)是从 prompt injection 到 RCE 的路径。 |
| **审批 (HITL)** | CWE-250 · LLM06 | 自动批准的高影响操作移除了对抗被劫持 agent 的最后一道人工关卡。 |
| **Prompt injection 暴露** | CWE-77 · LLM01 · ATLAS T0051 | 态势:不受信任的输入 × 能力 × 弱关卡。诚实地说明静态扫描无法*证明* injection 路径。 |
| **审计日志** | CWE-778 | 没有 agent 操作记录 = 没有事件响应,不符合 SOC2/HIPAA/GDPR。 |
**复合风险关联。** 单独为黄色的发现可能构成严重的
链条。agentscan 会指出它们——例如 *暴露 + 未认证*(RCE 级别,
CVE-2026-25253)、*暴露 + 开放命令策略*、*不受信任的输入 + 实时
恶意扩展*。
**态势评分与评级。** 从 100 分开始,减去基于严重程度的扣分
(fail = 全扣,warn = 扣半,**skipped = 扣 ¼**,因此不确定性仍会产生代价),最低为 0,划分为 A–F。覆盖率会单独报告,因此低覆盖率下的高分无法伪装成安全。
## 持续监控(免费)
扫描是点状时间点操作,但风险时刻是在设置*之后*——当您安装
新 skill 或更改 config 时。按计划重新运行,仅在您的态势
变**糟**时收到警报。无需额外工具——只需 `agentscan`、调度程序和 diff。
一个 cron 单行命令可每日重新扫描,并在出现任何新发现(评级下降或
新 fail)时发出通知,并与上次运行结果进行比对:
```
# crontab -e → 每天早上 8 点进行 scan;仅在 grade/score 下降时发出 alert
0 8 * * * cur=$(npx @aayushcodebook/agentscan@latest --quiet 2>/dev/null); prev=$(cat ~/.agentscan/last 2>/dev/null); \
echo "$cur" > ~/.agentscan/last; [ "$cur" != "$prev" ] && \
printf '%s\n' "$cur" | grep -qE 'AT RISK|fail' && \
osascript -e "display notification \"$cur\" with title \"agentscan\"" 2>/dev/null || true
```
在 Linux 上,将 `osascript` 行替换为 `notify-send "agentscan" "$cur"`(或通过管道发送至
Slack/email)。在 CI 中,`examples/agentscan-scan.yml` 中的 GitHub Action 会执行相同的
定时操作并上传 SARIF。
内置的 `agentscan --watch`(文件监控 agent 的 config + skills 目录,在
发生更改时立即扫描)已列入路线图——如果您会使用它,请提交 issue。
实时行为监控(在数据外泄或 injection *发生时*进行捕获)是
一项独立且更庞大的工作,不属于此 CLI 的一部分。
### 它与原生工具的关系
agentscan 是 agent 自带审计工具的**补充**,而非替代品。
OpenClaw 内置的 `openclaw security audit --deep` 在
OpenClaw 专属的 config 加固(文件系统 ACL、hooks、Docker 沙盒
内部原理)方面要深入得多,并且可以自动修复——请运行它。agentscan 独特的价值在于**跨 agent
覆盖**(OpenClaw *和* Hermes)、**精心整理的恶意 skill 黑名单**和
**CVE 公告 feed**(内置 `doctor` 无法维护的威胁情报),以及面向安全团队和 CI 的
**框架映射、SARIF 输出**。建议两者配合使用。
干净的结果意味着未发现*这些*已知问题。这并不能
保证整体安全——值得注意的是,prompt injection 是作为
*态势*进行评估的,并未证明其不存在,而原生的 `--deep` 审计会发现
agentscan 无法检测到的 config 加固细节。
## 用法
```
npx @aayushcodebook/agentscan # scan auto-detected installs
npx @aayushcodebook/agentscan --path ~/my-agent # also scan a custom location (repeatable)
npx @aayushcodebook/agentscan --json # full findings + score + framework tags (JSON)
npx @aayushcodebook/agentscan --sarif # SARIF 2.1.0 for GitHub code scanning / CI
npx @aayushcodebook/agentscan --quiet # one-line graded verdict
npx @aayushcodebook/agentscan --update-feed # refresh blocklist + CVE advisory feeds
npx @aayushcodebook/agentscan --help
```
### 退出码
| 代码 | 含义 |
|------|---------|
| `0` | 全部正常(或未发现 agent) |
| `1` | 仅有警告 —— 建议审查 |
| `2` | 严重问题 —— 立即修复 |
| `3` | 扫描器错误 |
在 CI 中很有用:`npx @aayushcodebook/agentscan --quiet || echo "agent needs attention"`。
## 隐私
agentscan 会读取本地文件并列出本地 socket 以生成报告。它
**不发起网络调用**,也不上传任何内容。恶意 skill 黑名单
在包内离线提供。您可以通过阅读
`src/` 来确认所有这些内容——它是几百行没有任何第三方包的纯 Node 代码。
## 支持的 agent
`src/data/targets.js` 中的布局取自每个项目的官方文档:
| Agent | Config | 默认端口 | 绑定设置 | Extensions |
|-------|--------|--------------|--------------|------------|
| **OpenClaw** | `~/.openclaw/openclaw.json` (JSON5), `~/.openclaw/.env`; 旧版 `~/.clawdbot/` | `18789` | `gateway.bind`: `loopback` (安全) / `lan` / `tailnet` / `custom` | skills (`SKILL.md`) + plugins (`openclaw.plugin.json`) |
| **Hermes Agent** | `~/.hermes/config.yaml`, `~/.hermes/.env` | `8642` API, `9119` dashboard | `API_SERVER_HOST` 环境变量 (`127.0.0.1` 安全, `0.0.0.0` 暴露) | skills (`SKILL.md`, 按类别嵌套) |
添加另一个 agent 只需要在 `src/data/targets.js` 中添加一个条目(其 config 路径、
默认端口、绑定模型和 skill 目录)。
## 更新威胁 feed
内置的恶意 skill 黑名单 + CVE 公告是一个*保底基准*。无需
升级包即可刷新它们:
```
agentscan --update-feed
agentscan --update-feed --feed-url https://your-mirror/blocklist.json
```
信任保证(见 `src/feed.js`):
- **扫描器零网络调用**——它会读取内置列表或您之前
明确获取的 feed,以较新者为准。`--update-feed` 是唯一
接触网络的命令。
- 内置版本是**降级底线**:拒绝使用过期或被篡改(例如
清空)的缓存,因此检测能力不会被悄无声息地削弱。
- 获取失败会**回退到内置版本**并以非零状态退出。
## 贡献
欢迎提交 issue 和 PR——尤其是新的 agent 定义(`src/data/targets.js`)、
黑名单/CVE 条目以及误报报告。整个工具是无依赖的,
旨在方便从头到尾阅读;运行 `node test/run.js` 即可执行测试套件。
## 许可证
MIT。
https://github.com/user-attachments/assets/422a90a9-3ce1-4071-8ce9-38c10cf77238
大多数 agent 安全工具只能在您安装之前扫描单个 agent 的单一 skill。
agentscan 可审计您的**整个运行中安装**——并且支持跨 **OpenClaw,
Hermes 等**通过单一工具完成。一条命令即可执行基于框架映射的
态势评估——**19 项检查加上复合风险关联**——涵盖
网络暴露、网关认证、CVE、密钥、SSRF、沙盒,*以及*恶意
skills/plugins(包含污点分析 + prompt injection 检测)。它将每个
发现映射到 CWE / OWASP LLM Top 10 / MITRE ATLAS,为您的设置评分 **A–F**,并
为 CI 输出 **SARIF**。一切都在您的本地机器上运行——绝不上传
任何数据,且**零依赖**,因此您可以在信任它之前查阅每一行代码。
已针对 **OpenClaw 和 Hermes 两者的**真实默认安装进行了验证——
每项均获得 **B** 评级,并提供具体、可操作的发现,**零误报**(包含
超过 300 个真实的内置 skills)。
```
npx @aayushcodebook/agentscan
```
```
OpenClaw ~/.openclaw F 0/100
──────────────────────────────────────────────────
● FAIL CHAIN: network-exposed AND unauthenticated gateway (RCE-class) CRIT
CWE-306,CWE-668 · LLM06:2025 · AML.T0049,AML.T0012
● FAIL Agent version vs. known security advisories (CVEs) CRIT
CWE-1395 · LLM03:2025
Installed version 3.0.0 is affected by CVE-2026-25253 (CVSS 8.8)…
● FAIL Malicious or suspicious skills & plugins CRIT
● FAIL Gateway authentication (is the local API/WebSocket protected?) CRIT
…
posture grade F 0/100
coverage: 13/15 checks ran
```
## 检查内容
每个发现都会标记其 **CWE**、**OWASP LLM Top 10 (2025)**,以及(如果适用)
**MITRE ATLAS** 技术,并带有用于评分的固有严重性。
| 检查项 | 映射到 | 为什么重要 |
|-------|---------|----------------|
| **网络暴露** | CWE-668 · ATLAS T0049 | 端口在 localhost 之外是否可访问?(63% 的公开实例是可访问的。) |
| **隧道暴露** | CWE-668 · LLM06 | 通过 Tailscale Funnel / ngrok / cloudflared 代理的 localhost 绑定 agent 实际上仍暴露在公网上——这是绑定地址的视觉盲区。 |
| **网关认证** | CWE-306/307 · LLM06 | 开放端口 + 无/弱认证 = ClawJacked/ClawBleed (CVE-2026-25253) 的前置条件。 |
| **访问策略** | CWE-284 · LLM06 | `dmPolicy: open` / `allowFrom: ["*"]` 允许频道上的任何陌生人指挥 agent。 |
| **CORS** | CWE-942 | 通配符 origin 允许您访问的任何网站调用 agent 的 API。 |
| **明文凭据** | CWE-312 · LLM02 | API 密钥/密码以明文形式存储在 config 中。 |
| **密钥脱敏** | CWE-532 · LLM02 | 如果关闭脱敏,工具输出中的密钥会泄漏到 transcripts 和磁盘上的 logs 中。 |
| **密钥文件权限** | CWE-732 | `.env` 中的密钥只有在文件对全局不可读时才是安全的。 |
| **Git 中的密钥** | CWE-540 · LLM02 | Agent 主目录是一个 repo 且密钥未被 `.gitignore` 忽略 → 被提交/推送。 |
| **版本与 CVE** | CWE-1395 · LLM03 | 运行带有已发布安全公告的构建(feed 可更新;内置 2026 年 OpenClaw CVE)。 |
| **恶意 skills & plugins** | CWE-506 · LLM01/LLM03 · ATLAS T0010 | 通过签名发现(`SKILL.md`/`openclaw.plugin.json`),与 ClawHavoc 黑名单匹配,进行**污点分析**(密钥是否真的*流入*了网络/exec sink?),在 SKILL.md *文本*中进行 **prompt injection 扫描**(隐形/双向 unicode、隐藏注释指令、角色劫持/覆盖、数据外泄 prompt),并进行**完整性验证**(“第一方” skill 只有在其字节哈希与原始匹配时才被信任;冒名顶替者将被捕获)。如果未发现任何内容则跳过(从不通过)。 |
| **MCP 供应链** | CWE-829 · LLM03 | 远程 MCP 工具服务器是位于 agent 信任边界内的第三方代码。 |
| **SSRF / 私有 URL** | CWE-918 · LLM06 | 如果开启了私有 URL 访问,中毒的链接可能会触达内部主机或 cloud-metadata endpoint (169.254.169.254)。 |
| **命令内容扫描器** | CWE-693 · LLM06 | Hermes 预先检查 shell 命令 (Tirith);标记其是否已禁用或 fail-open。 |
| **沙盒 / agency** | CWE-250 · LLM06 | 未沙盒化的工具(或以 root 身份运行)会将一条错误指令转化为完整的机器访问权限。 |
| **命令/exec 策略** | CWE-250 · LLM06 | 不受限制的 shell(`tools.exec.security="full"`,命令允许列表为空)是从 prompt injection 到 RCE 的路径。 |
| **审批 (HITL)** | CWE-250 · LLM06 | 自动批准的高影响操作移除了对抗被劫持 agent 的最后一道人工关卡。 |
| **Prompt injection 暴露** | CWE-77 · LLM01 · ATLAS T0051 | 态势:不受信任的输入 × 能力 × 弱关卡。诚实地说明静态扫描无法*证明* injection 路径。 |
| **审计日志** | CWE-778 | 没有 agent 操作记录 = 没有事件响应,不符合 SOC2/HIPAA/GDPR。 |
**复合风险关联。** 单独为黄色的发现可能构成严重的
链条。agentscan 会指出它们——例如 *暴露 + 未认证*(RCE 级别,
CVE-2026-25253)、*暴露 + 开放命令策略*、*不受信任的输入 + 实时
恶意扩展*。
**态势评分与评级。** 从 100 分开始,减去基于严重程度的扣分
(fail = 全扣,warn = 扣半,**skipped = 扣 ¼**,因此不确定性仍会产生代价),最低为 0,划分为 A–F。覆盖率会单独报告,因此低覆盖率下的高分无法伪装成安全。
## 持续监控(免费)
扫描是点状时间点操作,但风险时刻是在设置*之后*——当您安装
新 skill 或更改 config 时。按计划重新运行,仅在您的态势
变**糟**时收到警报。无需额外工具——只需 `agentscan`、调度程序和 diff。
一个 cron 单行命令可每日重新扫描,并在出现任何新发现(评级下降或
新 fail)时发出通知,并与上次运行结果进行比对:
```
# crontab -e → 每天早上 8 点进行 scan;仅在 grade/score 下降时发出 alert
0 8 * * * cur=$(npx @aayushcodebook/agentscan@latest --quiet 2>/dev/null); prev=$(cat ~/.agentscan/last 2>/dev/null); \
echo "$cur" > ~/.agentscan/last; [ "$cur" != "$prev" ] && \
printf '%s\n' "$cur" | grep -qE 'AT RISK|fail' && \
osascript -e "display notification \"$cur\" with title \"agentscan\"" 2>/dev/null || true
```
在 Linux 上,将 `osascript` 行替换为 `notify-send "agentscan" "$cur"`(或通过管道发送至
Slack/email)。在 CI 中,`examples/agentscan-scan.yml` 中的 GitHub Action 会执行相同的
定时操作并上传 SARIF。
内置的 `agentscan --watch`(文件监控 agent 的 config + skills 目录,在
发生更改时立即扫描)已列入路线图——如果您会使用它,请提交 issue。
实时行为监控(在数据外泄或 injection *发生时*进行捕获)是
一项独立且更庞大的工作,不属于此 CLI 的一部分。
### 它与原生工具的关系
agentscan 是 agent 自带审计工具的**补充**,而非替代品。
OpenClaw 内置的 `openclaw security audit --deep` 在
OpenClaw 专属的 config 加固(文件系统 ACL、hooks、Docker 沙盒
内部原理)方面要深入得多,并且可以自动修复——请运行它。agentscan 独特的价值在于**跨 agent
覆盖**(OpenClaw *和* Hermes)、**精心整理的恶意 skill 黑名单**和
**CVE 公告 feed**(内置 `doctor` 无法维护的威胁情报),以及面向安全团队和 CI 的
**框架映射、SARIF 输出**。建议两者配合使用。
干净的结果意味着未发现*这些*已知问题。这并不能
保证整体安全——值得注意的是,prompt injection 是作为
*态势*进行评估的,并未证明其不存在,而原生的 `--deep` 审计会发现
agentscan 无法检测到的 config 加固细节。
## 用法
```
npx @aayushcodebook/agentscan # scan auto-detected installs
npx @aayushcodebook/agentscan --path ~/my-agent # also scan a custom location (repeatable)
npx @aayushcodebook/agentscan --json # full findings + score + framework tags (JSON)
npx @aayushcodebook/agentscan --sarif # SARIF 2.1.0 for GitHub code scanning / CI
npx @aayushcodebook/agentscan --quiet # one-line graded verdict
npx @aayushcodebook/agentscan --update-feed # refresh blocklist + CVE advisory feeds
npx @aayushcodebook/agentscan --help
```
### 退出码
| 代码 | 含义 |
|------|---------|
| `0` | 全部正常(或未发现 agent) |
| `1` | 仅有警告 —— 建议审查 |
| `2` | 严重问题 —— 立即修复 |
| `3` | 扫描器错误 |
在 CI 中很有用:`npx @aayushcodebook/agentscan --quiet || echo "agent needs attention"`。
## 隐私
agentscan 会读取本地文件并列出本地 socket 以生成报告。它
**不发起网络调用**,也不上传任何内容。恶意 skill 黑名单
在包内离线提供。您可以通过阅读
`src/` 来确认所有这些内容——它是几百行没有任何第三方包的纯 Node 代码。
## 支持的 agent
`src/data/targets.js` 中的布局取自每个项目的官方文档:
| Agent | Config | 默认端口 | 绑定设置 | Extensions |
|-------|--------|--------------|--------------|------------|
| **OpenClaw** | `~/.openclaw/openclaw.json` (JSON5), `~/.openclaw/.env`; 旧版 `~/.clawdbot/` | `18789` | `gateway.bind`: `loopback` (安全) / `lan` / `tailnet` / `custom` | skills (`SKILL.md`) + plugins (`openclaw.plugin.json`) |
| **Hermes Agent** | `~/.hermes/config.yaml`, `~/.hermes/.env` | `8642` API, `9119` dashboard | `API_SERVER_HOST` 环境变量 (`127.0.0.1` 安全, `0.0.0.0` 暴露) | skills (`SKILL.md`, 按类别嵌套) |
添加另一个 agent 只需要在 `src/data/targets.js` 中添加一个条目(其 config 路径、
默认端口、绑定模型和 skill 目录)。
## 更新威胁 feed
内置的恶意 skill 黑名单 + CVE 公告是一个*保底基准*。无需
升级包即可刷新它们:
```
agentscan --update-feed
agentscan --update-feed --feed-url https://your-mirror/blocklist.json
```
信任保证(见 `src/feed.js`):
- **扫描器零网络调用**——它会读取内置列表或您之前
明确获取的 feed,以较新者为准。`--update-feed` 是唯一
接触网络的命令。
- 内置版本是**降级底线**:拒绝使用过期或被篡改(例如
清空)的缓存,因此检测能力不会被悄无声息地削弱。
- 获取失败会**回退到内置版本**并以非零状态退出。
## 贡献
欢迎提交 issue 和 PR——尤其是新的 agent 定义(`src/data/targets.js`)、
黑名单/CVE 条目以及误报报告。整个工具是无依赖的,
旨在方便从头到尾阅读;运行 `node test/run.js` 即可执行测试套件。
## 许可证
MIT。标签:AI安全, Chat Copilot, MITM代理, OWASP LLM Top 10, StruQ, Web报告查看器, XXE攻击, 安全态势评估, 插件系统, 文档结构分析, 自定义脚本