24.4 安全审计

生成模型:Claude Opus 4.6 (anthropic/claude-opus-4-6) Token 消耗:输入 ~290k tokens,输出 ~8k tokens(本节)


安全配置需要持续验证——即使系统有良好的默认值,用户的自定义配置仍可能引入安全漏洞。OpenClaw 内置了一套自动化安全审计系统,可以扫描配置、文件权限、渠道策略等多个维度,生成结构化的安全发现报告。本节分析这套系统的架构与实现。


24.4.1 审计系统(src/security/audit.ts

审计报告结构

安全审计的输出是一个结构化的 SecurityAuditReport

// src/security/audit.ts

type SecurityAuditSeverity = "info" | "warn" | "critical";

type SecurityAuditFinding = {
  checkId: string;        // 检查项 ID(如 "gateway.bind_no_auth")
  severity: SecurityAuditSeverity;
  title: string;          // 简短标题
  detail: string;         // 详细描述
  remediation?: string;   // 修复建议
};

type SecurityAuditReport = {
  ts: number;                          // 审计时间戳
  summary: { critical, warn, info };   // 各级别计数
  findings: SecurityAuditFinding[];    // 所有发现
  deep?: { gateway?: { ... } };        // 深度探测结果
};

审计流水线

runSecurityAudit 是审计的入口函数,它按类别顺序收集发现:

Gateway 配置安全检查

collectGatewayConfigFindings 检查 Gateway 服务器的安全配置,是最核心的检查项之一:

渠道安全检查

渠道安全检查涵盖了 DM 策略、群聊权限、斜杠命令授权等多个维度。以 Discord 为例:


24.4.2 文件系统审计(src/security/audit-fs.ts

权限检查模型

文件系统审计检查 OpenClaw 的关键文件和目录的权限是否安全。inspectPathPermissions 是跨平台的权限检查函数:

衍生解释:Unix/Linux 文件权限使用 9 位二进制数表示,分为三组(所有者/同组/其他),每组 3 位(读/写/执行)。八进制表示法中,0o700 意味着所有者有全部权限(rwx),同组和其他用户无任何权限。0o600 意味着所有者可读写,但不可执行。OpenClaw 期望状态目录为 0o700(仅所有者可访问),配置文件为 0o600(仅所有者可读写),因为配置文件中可能包含 API 密钥等敏感信息。

审计发现的严重级别

文件系统审计根据风险程度分配不同的严重级别:

检查项
条件
严重级别

状态目录世界可写

bits & 0o002

critical

状态目录组可写

bits & 0o020

warn

状态目录可被他人读取

bits & 0o044

warn

配置文件可被他人写入

group/world writable

critical

配置文件世界可读

bits & 0o004

critical

配置文件组可读

bits & 0o040

warn

路径是符号链接

isSymbolicLink()

warn

修复建议会根据平台自动生成——POSIX 系统生成 chmod 700 ~/.openclaw,Windows 系统生成 icacls 命令。


24.4.3 技能安全扫描(src/security/skill-scanner.ts

为什么需要扫描技能代码

技能(Skills)是用户安装的第三方代码,在 Agent 执行环境中运行。与浏览器扩展类似,恶意技能可能:

  • 执行系统命令(child_process.exec

  • 窃取环境变量中的 API 密钥

  • 通过网络外发敏感数据

  • 使用混淆代码隐藏恶意逻辑

扫描规则

技能扫描器使用两类规则——行级规则(Line Rules)和源码级规则(Source Rules)

requiresContext 双重检查是一个巧妙的误报控制机制——exec 是一个常见的函数名,如果没有 requiresContext: /child_process/ 的二次验证,正则匹配工具的 .exec() 方法也会被误报为危险操作。

目录扫描

scanDirectory 遍历技能目录,扫描所有 .js/.ts/.mjs/.cjs 等文件:

安全限制保护扫描器本身不被 DoS:

  • 文件数上限(500):防止巨大的 node_modules 目录拖慢扫描

  • 文件大小上限(1MB):跳过异常大的文件

  • 跳过 node_modules 和隐藏目录:避免扫描依赖库


24.4.4 外部内容安全(src/security/external-content.ts

此模块已在 24.1 节详细分析过。这里补充几个审计相关的 API:


24.4.5 openclaw security audit 命令

安全审计通过 CLI 命令触发:

审计结果以分级着色的方式输出:

  • CRITICAL(红色):需要立即修复的严重安全问题

  • WARN(黄色):建议修复的安全隐患

  • INFO(灰色):信息性提示

每个发现都附带修复建议(remediation),例如:


本节小结

  1. 结构化审计报告包含三级严重度(critical/warn/info)的发现列表,每个发现附带检查 ID、详情和修复建议。

  2. 五层审计流水线:攻击面分析 → 配置安全检查 → 文件系统权限 → 渠道安全 → 深度探测。

  3. 跨平台文件权限检查:POSIX 使用 mode bits,Windows 使用 icacls ACL,统一为 worldWritable/groupWritable 等布尔属性。

  4. 技能安全扫描器使用行级+源码级双重规则,配合 requiresContext 机制控制误报。

  5. 外部内容安全模块提供会话来源判定和 Web 内容分级包装能力。

  6. CLI 集成支持基础/深度两种模式和 JSON 输出,适用于手动检查和 CI/CD 自动化。

Last updated