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, 上游代理, 关系图谱, 基线检查, 系统加固, 自定义脚本