cain66666/openclaw-hardening-check
GitHub: cain66666/openclaw-hardening-check
一个无依赖、纯只读的 OpenClaw 安装安全加固检查脚本,离线核查 Gateway 暴露面、身份验证、CVE 漏洞版本、文件权限和插件清单等加固项。
Stars: 0 | Forks: 0
此脚本仅执行读取操作。它不修复任何问题,也不保证您的安全。绿色的输出仅表示下方列出的检查项目已通过——仅此而已。
# OpenClaw 强化检查
`openclaw-hardening-check.mjs` 是一个无依赖、离线的 OpenClaw 安装审查工具。它会读取本地配置、包元数据、插件和 skill 清单、文件模式,以及(在 Linux 上)运行中的 Gateway 在 `/proc` 中的条目。它不会修改文件、调用 OpenClaw 命令、联系 registry 或发起任何网络请求。
## 检查内容
- **Gateway bind:** 报告 `gateway.bind` 是否为仅限 loopback、非 loopback 或依赖于 runtime。在检测到的 Docker、Podman、Kubernetes 或 Fly container 中,未设置或设为 `auto` 的 bind 将被视为 `0.0.0.0`,这与 OpenClaw 的 container 默认设置一致。正在运行的 Linux Gateway 会被单独检查,因此命令行或服务覆盖无法隐藏在安全的配置值背后。
- **Gateway 身份验证:** 模拟 OpenClaw 对于明文 `gateway.auth.token` 和 `.password` 的配置优先原则。在评估凭据之前,它会识别 `${VAR}`, `$VAR`, `secretref-env:VAR`, `__env__:VAR` 以及结构化的 SecretRef。身份验证环境证据来自于匹配的 Gateway 进程、`gateway.systemd.env` 或状态目录下的 `.env`,绝不会来自审计工具进程。永远不会打印 Secret 值;报告中仅包含其是否存在、来源类别和长度。公开的示例占位符以及短于 24 个字符的 token 会被标记。
- **CVE-2026-25253:** 将 `2026.1.29` 之前的版本视为受影响。该漏洞允许 query-string 中的 `gatewayUrl` 触发 WebSocket 连接,从而泄露 Gateway token。详见 [NVD 条目](https://nvd.nist.gov/vuln/detail/CVE-2026-25253)和 [OpenClaw 公告](https://github.com/openclaw/openclaw/security/advisories/GHSA-g8p2-7wf7-98mq)。
- **安装版本锁定:** 当提供安装来源时,能够区分精确的版本或 commit 与 `latest`、`beta` 或 `main` 等动态目标。由于 npm 和 pnpm 不会在已安装的包中保留最初请求的 dist-tag,因此当缺少该来源信息时,脚本会报告“cannot check”而不是进行猜测。
- **Secret 文件权限:** 检查配置文件、配置包含文件、`.env`、`gateway.systemd.env`、发现的 `auth-profiles.json` 文件以及已解析的文件 SecretRef,确认是否存在组/全局暴露或意外的所有权情况。
- **Skills 与 plugins:** 将内置项(包括 `dist-runtime/extensions`)与在 state、config-directory、managed、workspace、personal、configured 或 npm 项目位置中发现的项分开盘点。非内置项会被标记为需人工审核,绝不会直接被标记为恶意。
- **监听 socket:** 在 Linux 上,将 `/proc/net/tcp*` socket inode 映射回 Gateway 的入口文件或二进制进程,并标记它们拥有的所有非 loopback TCP 监听器。如果位于预期端口上的监听器所有者无法验证,会产生“cannot check”的结果,而不是“Gateway 未运行”。当 Gateway 停止时,该检查仍可基于磁盘生效。
- **控制 UI 强化:** 标记危险的 device-auth、insecure-auth 以及 Host-header-origin 覆盖配置。当非 loopback 的 shared-secret 身份验证未配置 rate limit 时,也会发出警告。
其路径与默认值遵循官方的[配置文档](https://docs.openclaw.ai/gateway/configuration)、[配置参考](https://docs.openclaw.ai/gateway/configuration-reference)、[Gateway 暴露 runbook](https://docs.openclaw.ai/gateway/security/exposure-runbook)、[skills 文档](https://docs.openclaw.ai/tools/skills)和[plugin 管理文档](https://docs.openclaw.ai/plugins/manage-plugins)。
## 运行方式
将脚本复制到运行 OpenClaw 的机器上,然后以相同的 OS 用户身份运行:
```
node openclaw-hardening-check.mjs
```
OpenClaw 的默认配置是 `~/.openclaw/openclaw.json`。该脚本也支持 `OPENCLAW_CONFIG_PATH`、`OPENCLAW_STATE_DIR` 和 `OPENCLAW_GATEWAY_PORT`。
对于非默认布局和可重现的锁定检查,可使用以下可选覆盖参数:
```
node openclaw-hardening-check.mjs \
--config /srv/openclaw/openclaw.json \
--state-dir /srv/openclaw \
--package-root /opt/openclaw/lib/node_modules/openclaw \
--install-spec 2026.6.10
```
`--install-spec` 必须是安装程序或部署定义最初使用的目标。如果不验证该来源,仅传入当前安装的版本并不能证明部署已被锁定。
## 示例输出
检查器绝不会输出 secret 本身,因此可公开的表单仅记录其来源与长度:
```
OpenClaw hardening check
Read-only and offline. Secret values are never printed.
Config: ~/.openclaw/openclaw.json
[PASS] Config: loaded ~/.openclaw/openclaw.json without printing its contents.
[PASS] Gateway bind: loopback; configured for local-only access.
[PASS] Gateway authentication: present via Gateway process environment bootstrap, length 48; value was not printed.
[PASS] Listening sockets: OpenClaw TCP listeners are loopback-only: 127.0.0.1:18789, [::1]:18789.
[PASS] CVE-2026-25253: installed package version 2026.6.10 is at or newer than 2026.1.29.
[PASS] Installation pin: exact target 2026.6.10 is recorded for this check.
[WARN] Third-party plugins: 1: example-plugin. Review it yourself; no malware verdict was attempted.
Summary: 1 issue(s) need attention; exit code 1.
```
Secret value: `[REDACTED — never present in output]`。
## 退出码
| 代码 | 含义 |
| ---: | ------------------------------------------------------------------------------------------------ |
| `0` | 所有适用的检查均已通过。 |
| `1` | 至少有一个问题、审核项或不完整的检查需要关注。 |
| `2` | 命令行无效,或者无法安全地找到、读取、包含或解析配置文件。 |
## 固有限制
- 这是一个本地配置和进程状态检查工具,而不是远程暴露扫描器。它不会建立任何网络连接,即使是连接到 localhost。
- 请在与 Gateway 相同的 host/container 上下文中,并以相同的 OS 用户身份运行。审计工具自身的 token/password 环境会被刻意忽略。
- 如果 Gateway 已停止,且在配置文件或已知环境文件中未找到凭据,身份验证状态将被报告为“cannot check”:另一个服务环境源可能仅在 Gateway 启动时才提供该凭据。
- Socket 所有权检查目前需要使用 Linux `/proc`。其他平台将收到明确的“cannot check”结果。
- 反向代理、container 端口发布、OpenClaw 外部的 Tailscale 配置、防火墙规则或云负载均衡器都可能暴露看似 loopback 的部署。请单独审查这些层面。
- 包文件能够证明已安装的版本,但通常无法证明 package manager 最初是否解析为 `@latest`。请通过 `--install-spec` 提供受信任的部署来源。
- 第三方清单仅用于提示人工审核,并非声誉或恶意软件扫描。
## 测试
测试套件仅使用 `node:test` 和临时目录:
```
node --test test/openclaw-hardening-check.test.mjs
```
## 作者
Ilya Prudnikov — [cain-ai.com](https://cain-ai.com)
## 许可证
[MIT](LICENSE)
标签:DevSecOps, GNU通用公共许可证, MITM代理, Node.js, OpenClaw, 上游代理, 关系图谱, 基线检查, 系统加固, 自定义脚本