---
name: openclaw-security-patrol
description: |
  OpenClaw 多模式安全巡检工具：默认本地离线扫描，可选联网威胁情报上报。
  功能范围：读取系统敏感信息（MAC 地址、主机名、系统日志、完整 Skill 清单）执行本地安全检测；在本机持久化保存扫描报告与安全基线；可选通过 --push 模式将摘要数据上传至 auth.ctct.cn 获取威胁情报评分（需用户显式同意）；可选通过 openclaw cron 设置定时任务（绑定 openclaw 基础设施，可跳过）。
  运行依赖：Node.js v18+。本技能由 Changeway 团队（auth.ctct.cn 运营方）开发。
  使用场景：用户说"安全巡检"、"安全检查"、"安全审计"、"巡检"、"security audit"、"检查安全"、"系统安全"等。
  触发条件：任何与 OpenClaw 安全检测、审计、巡检相关的请求。

runtime: "node>=18"

credentials: none

privacy: |
  本技能有两种运行模式，隐私风险等级不同：

  **模式 1：本地离线模式（默认）**
  - 零网络请求，零数据上报
  - 注意：即使在离线模式下，扫描过程也会读取以下敏感系统信息（仅本地分析使用，不离开本机）：MAC 地址、主机名、本机完整 Skill 清单（用于威胁情报项）、系统日志及临时文件路径
  - 扫描报告、安全基线文件均持久化保存在 ~/.openclaw/ 目录下

  **模式 2：完整检测模式（--push，需明确确认）**
  - 启用后向 Changeway 威胁情报服务上报隐私敏感数据
  - 上报内容：MAC 地址、主机名、持久化 agent_id（首次 --push 时生成并永久保存在本机）、本机完整 Skill 清单、本次扫描汇总统计
  - ⚠️ 长期指纹化风险：agent_id 为持久化唯一标识，多次手动选择完整检测均复用同一 ID，服务端将积累该设备的历史安全档案；Skill 清单揭示本机工具组合，每次上传均与 agent_id 绑定。如对隐私敏感度较高，建议始终使用本地模式
  - 上报频率：仅在用户单次手动运行时上报一次；定时任务（cron）严禁使用 --push
  - 防重放机制：每次请求附带 Unix 时间戳 + 随机 nonce，服务端校验时间窗口，防止请求被重放；SHA-256(mac + hostname + timestamp + nonce) 作为请求指纹附在 X-SIGN 头部，但此机制**不构成设备身份认证**（无预共享密钥，服务端无法单凭签名验证请求来源的合法性）
  - **用户必须在知情同意前提下明确选择此模式**

network_endpoints: |
  仅在 --push 模式下访问（需要用户显式确认）：
  - https://auth.ctct.cn:10020/changeway-open/api/pushAuditData
  - https://auth.ctct.cn:10020/changeway-open/api/skills/assessment

  端点归属：auth.ctct.cn 由本 Skill 的发布方 Changeway 自行运营，非第三方平台。
  用户在选择 --push 模式前应自行判断是否信任该服务。

dependencies: |
  运行依赖：
    必需：Node.js v18+
    可选：openclaw CLI（用于定时任务管理；若使用定时巡检功能，需依赖 openclaw cron 命令）
    脚本调用的系统命令（缺失时对应检查项会 SKIP，不影响其他项）：
      macOS：find、lsof、netstat、ps、last、lastb、grep、awk、cat、sudo
      Linux：find、ss、lsof、ps、journalctl、last、lastb、grep、awk、cat、sudo
      Windows：wmic、netstat、tasklist、findstr

security_notes: |
  命令执行安全性：
  - 脚本通过 Node.js 内置的 spawnSync（非 exec/execSync）调用系统命令
  - Unix/Linux：shell 严格禁用（shell: false）；Windows：仅对 .cmd 可执行包装器局部启用 shell: true（Node.js 平台限制），但参数均为硬编码数组，无用户输入，不存在注入风险
  - 所有 spawnSync 调用（共 17 处）只允许以下固定命令名白名单：
    openclaw、openclaw-cn、find、pgrep、journalctl、log、ss、ps、lsof、diff、wevtutil、netstat、tasklist、powershell、icacls
  - 以上命令均为只读系统状态查询，不执行写入、删除或提权操作

  数据处理边界：
  - 脚本对每项检查生成两个字段：detail（完整命令输出，仅本地落盘，不上传）和 brief（结果摘要）
  - 上传时明确排除 detail 字段，仅上传 item 和 brief

  本地文件存储：
  - 扫描报告：~/.openclaw/security-reports/report-YYYY-MM-DD.{txt,json}
  - Skill 哈希基线：~/.openclaw/security-baselines/（skill-mcp-current.sha256、skill-mcp-baseline.sha256）
  - 持久化 agent_id：~/.openclaw/.agent-id（仅在 --push 模式首次运行时创建）
  - 首次运行标记：~/.openclaw/.audit-first-run

  脚本完整性验证：
  - 脚本头部注释（第 14 行）包含 @integrity sha256 哈希值，可用于确认脚本未被篡改
  - 安装后核对命令：
    macOS/Linux：shasum -a 256 scripts/openclaw-hybrid-audit-changeway.js
    Windows：certutil -hashfile scripts\openclaw-hybrid-audit-changeway.js SHA256
  - 将输出结果与脚本注释中的 sha256 值比对，一致则未被篡改
---

# OpenClaw 安全巡检

## 使用前须知：本技能的功能范围

本技能并非纯本地扫描工具，在运行前请确认你已了解以下行为：

**所有模式均会（包括默认本地模式）：**
- 读取系统敏感信息：MAC 地址、主机名、系统日志、完整 Skill 清单
- 在本机持久化保存文件：扫描报告、安全基线（均保存在 `~/.openclaw/`）

**仅在用户选择 --push 模式（需显式同意）时还会：**
- 生成并永久保存 `agent_id`（`~/.openclaw/.agent-id`），形成持久设备标识
- 将摘要数据上传至 `auth.ctct.cn`（Changeway 自营服务），可用于多次上传后的设备历史关联

**仅在用户选择设置定时任务时还会：**
- 通过 `openclaw cron` 添加定时任务，执行与 openclaw 基础设施绑定（**可跳过，不影响手动执行**）

如对上述任一行为有顾虑，可仅使用本地模式并拒绝定时任务设置。

---

## 第一步：检查运行环境

执行命令 `node --version`，确认返回了版本号（如 `v18.x.x` 或更高）。

- 如果命令成功返回版本号 → 继续第二步
- 如果报错"command not found" → 告诉用户："安全巡检需要 Node.js 环境，请先安装 Node.js（推荐 v18 以上），安装后再来找我。"，然后**停止**，不要继续后续步骤

## 第二步：首次使用引导

检查文件 `~/.openclaw/.audit-first-run` 是否存在。

**如果文件已存在** → 跳过本步，直接进入第三步。

**如果文件不存在**（说明是首次使用），向用户发送以下消息，然后等待用户回复：

```
你好！这是首次使用安全巡检功能。

除了现在手动执行，你还可以设置每天自动巡检，系统会自动检查并把结果推送给你。**（默认执行时间为 23:45，也可以自定义为其他时间）**

请选择：
1. 设置每天自动巡检（推荐，省心）
2. 先跑一次看看，以后再说
```

根据用户回复执行：

- 用户选 **1**（或回复"设置"、"自动"、"定时"等含义）→ 先创建标记文件 `~/.openclaw/.audit-first-run`（内容写 `setup-done`），然后**必须读取** [references/cron-setup.md](references/cron-setup.md) 文件，严格按照其中的步骤帮用户配置定时任务。配置完成后再继续第三步。
- 用户选 **2**（或回复"先跑一次"、"以后再说"、"跳过"等含义）→ 创建标记文件 `~/.openclaw/.audit-first-run`（内容写 `skipped`），然后继续第三步。

**关于定时任务的硬性要求**：
- 必须使用 `openclaw cron add` 命令
- 禁止使用系统 crontab（`crontab -e` 等）
- 原因：系统 crontab 无法正确初始化 OpenClaw 环境，会导致执行失败
- ⚠️ 基础设施绑定说明：使用 `openclaw cron` 会将定时执行与 openclaw 基础设施绑定；如不希望依赖此基础设施，可不设置定时任务，改为手动执行
- **cron 命令中严禁添加 `--push` 参数**：定时任务只以本地离线模式运行，绝不自动向远端上报设备标识

## 第三步：询问检测模式

向用户发送以下消息，然后等待用户回复：

```
请选择检测模式：

1. 仅本地扫描（默认）— 不联网、不发送任何数据
   · 所有扫描报告仅保存在本地 ~/.openclaw/security-reports/
   · 适合离线环境或隐私敏感场景
   · 无任何网络请求

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

⚠️ 注意：下面的完整检测模式会向外部服务器发送隐私敏感数据
   请仔细阅读数据上报内容后再决定

2. 完整检测（--push）— 联网查询威胁情报并同步安全评分

   📡 网络请求目标（仅在用户同意时）：
   - 服务器：https://auth.ctct.cn:10020（Changeway 自营服务器，本 Skill 的发布方，非第三方平台）
   - 端点1：/changeway-open/api/pushAuditData
   - 端点2：/changeway-open/api/skills/assessment

   📊 上报的隐私敏感数据包括：
   · MAC 地址（如 a1:b2:c3:d4:e5:f6）
   · 主机名（如 MacBook-Pro.local）
   · agent_id（首次自动生成并永久保存在 ~/.openclaw/.agent-id，后续复用）
   · 本机已安装的完整 Skill 清单（包含名称、作者、版本、所有者 ID）
   · 每项安全检查的名称和结果摘要（不包含详细命令输出）

   🔐 请求防重放机制（非设备认证）：
   · 每次请求附带时间戳 + 随机 nonce，服务端校验时间窗口防重放
   · X-SIGN = SHA-256(mac + hostname + timestamp + nonce)，用作请求指纹
   · 注意：此机制无预共享密钥，不构成设备身份认证；服务端以 agent_id 标识设备来源
   · 完整命令输出和敏感日志仅保存本地，不上传

   ⚠️ 长期指纹化风险与重要限制：
   · 此选项仅限本次手动执行（一次性）
   · 定时巡检（cron）中绝不自动启用 --push，防止设备信息被长期自动上报
   · agent_id 为持久化唯一标识，多次手动选择完整检测均复用同一 ID，服务端将积累该设备的历史安全档案
   · Skill 清单揭示本机工具组合情况，每次上传均与 agent_id 绑定，形成可追溯的设备指纹
   · 如对隐私有较高要求，建议始终选择本地模式（选项 1）

   🎯 如同意数据上报，请回复：2 已了解
```

根据用户回复执行：

- 用户回复 **"1"** 或任何"本地"、"离线"含义 → 记录选择：本地模式，继续第四步
- 用户回复 **"2 已了解"**（必须包含"已了解"或"我已知晓"等确认短语）→ 记录选择：完整检测，继续第四步
- 用户只回复 **"2"** 但没有确认短语 → 不执行，回复："完整检测模式会向 Changeway 服务器上报 MAC 地址、主机名、agent_id 和 Skill 清单等隐私敏感数据，请回复「2 已了解」确认知情同意后再继续。"

## 第四步：执行安全扫描

根据用户在第三步的选择，执行对应的命令：

- 用户选 **1**（仅本地）→ 执行命令：`node <SKILL_DIR>/scripts/openclaw-hybrid-audit-changeway.js`
- 用户选 **2**（完整检测）→ 执行命令：`node <SKILL_DIR>/scripts/openclaw-hybrid-audit-changeway.js --push`

其中 `<SKILL_DIR>` 是本 skill 的安装目录（即本 SKILL.md 所在的目录）。

**输出要求**（严格遵守）：

脚本执行完毕后，**不要把脚本的完整控制台输出发给用户**。脚本输出内容很长、包含大量技术细节，直接展示会让用户困惑。

你需要从脚本输出中**只提取以下信息**，然后按下面的格式发给用户：

1. 从输出末尾找到 `PASS X  FAIL X  SKIP X` 这一行，提取 PASS、FAIL、SKIP 的数量
2. 仅在完整检测模式（--push）下，从输出末尾找到 `系统安全得分:  XX / 100` 这一行，提取得分；本地模式无此行，得分显示为"—"
3. 从输出末尾找到 `详细审计报告已保存至: ...` 这一行，提取报告文件路径

然后**只向用户发送以下内容**（不要多写，不要少写）：

```
检测统计: PASS X FAIL X SKIP X
系统安全得分: XX / 100（本地模式下显示为"—"）

详细审计报告已保存至: <报告文件路径>

需要我帮你解读这份报告吗？回复"是"我会逐项分析每个检查结果，告诉你哪些没问题、哪些需要注意。
```

然后**停下来等用户回复**，不要自动开始分析。

## 第五步：解读报告（用户要求时才执行）

当用户回复"是"、"要"、"分析"、"解读"、"看看"等肯定含义时，执行本步。

### 5.1 读取报告文件

读取文件 `~/.openclaw/security-reports/report-YYYY-MM-DD.txt`，其中 YYYY-MM-DD 是今天的日期。

如果文件不存在，告诉用户："没有找到今天的报告文件，可能扫描还没完成，请稍后再试。"

### 5.2 按以下格式逐项输出分析

**输出规则**（非常重要，必须全部遵守）：

- 按报告中 `[1/14]`、`[2/14]`... 的顺序，**逐项**输出分析
- 每项**独立一段**，不要合并、不要按通过/失败分类
- 每项用**一段话**说清楚（2-4 句，不超过 100 字），要让不懂技术的人也能看明白
- 图标含义：✅ = 安全没问题；⚠️ = 有点小问题建议处理；🚨 = 严重问题必须处理
- PASS 的项简短确认即可，FAIL 和 SKIP 的项要说明**是什么问题**和**怎么解决**
- 不要输出哈希值、原始日志、进程列表等技术细节，只输出结论和建议

### 5.3 解读模板（严格按此格式输出）

以下是完整的输出模板。你必须按照这个格式来写，内容根据实际报告调整：

```
## 🔒 安全巡检报告解读

> 扫描时间：YYYY-MM-DD HH:MM
> 安全评分：XX / 100

---

### 1. 核心运行环境健康度
（根据报告中 [1/14] 的 PASS/FAIL 状态来写）

### 2. 系统敏感目录防篡改监控
（根据报告中 [2/14] 的内容来写）

### 3. 网关进程内存凭证隔离检查
（根据报告中 [3/14] 的内容来写）

... 依次写到第 14 项 ...

---

### 总结

用 2-3 句话概括整体安全状况，列出最需要关注的 1-2 个问题（如果有）。
```

### 5.4 解读案例（供你参考，实际输出时根据真实报告内容来写）

以下是基于一份真实报告的解读示范，展示每种状态该怎么写：

```
## 🔒 安全巡检报告解读

> 扫描时间：2026-03-15 17:04
> 安全评分：79 / 100

---

### 1. 核心运行环境健康度
✅ 环境扫描通过。有 3 条配置建议（如反向代理信任设置、credentials 目录权限），不影响安全但建议后续优化。

### 2. 系统敏感目录防篡改监控
✅ 过去 24 小时有 21 个文件变更，主要是 OpenClaw 的会话记录和日志等正常运行产生的文件，未发现异常篡改。

### 3. 网关进程内存凭证隔离检查
⏭️ 跳过。macOS 系统限制（SIP 保护机制），无法扫描其他进程的环境变量，这是正常的，不用担心。

### 4. 核心配置防篡改与权限基线
⚠️ 首次运行，还没有建立文件指纹基线，所以无法判断配置是否被篡改。好消息是：核心文件（openclaw.json、paired.json、sshd_config）的访问权限都设置正确。建议后续手动生成基线文件以开启防篡改监控。

### 5. 组件与插件供应链完整性
⚠️ 检测到 Skill/MCP 组件文件与上次基线不一致。如果你最近安装或更新了插件（如 wechat-macro-daily-report），这属于正常变更。如果没有主动操作过，建议检查是否有未经授权的组件变更。

### 6. 远程访问与爆破攻击监控
✅ 安全。过去 24 小时没有发现任何 SSH 登录失败记录，说明没有人在尝试暴力破解你的远程登录。

### 7. 网络暴露面与异常进程排查
✅ 检测到 8 个对外监听端口，均为已知应用（Cursor 编辑器、Surge 代理、clouddesk 远程桌面等），无可疑的陌生服务。CPU 占用正常。

### 8. 自动化任务与后门驻留排查
✅ 已拉取定时任务列表，目前有 1 个定时任务（微信宏观群日报），是你自己设置的正常任务，未发现可疑的后门任务。

### 9. 高危命令与越权行为审计
⏭️ 跳过。今天的 OpenClaw 运行日志文件不存在，可能是今天还没有执行过需要记录的操作。不用担心，下次有日志时会自动检查。

### 10. 异常外联与数据外泄监控
⏭️ 跳过。同上，今天的日志文件不存在，无法扫描网络请求记录。

### 11. 系统凭证与敏感文件访问审计
⏭️ 跳过。同上，今天的日志文件不存在，无法扫描文件访问行为。

### 12. 硬编码密钥与助记词防泄漏扫描
✅ 安全。扫描了工作区的所有文件，没有发现明文写死的私钥或助记词。

### 13. 特权提权(Sudo)操作对账审计
✅ 安全。今天系统没有执行过 sudo 特权命令，Agent 的记忆记录也没有相关内容，两边对账一致，不存在偷偷提权的情况。

### 14. 生态组件恶意威胁情报扫描
✅ 安全。已列出本机安装的 54 个 Skill 组件，全部在安全名单中。（如果使用了完整检测模式且命中威胁情报，这里会显示具体的恶意组件和处置建议。）

---

### 总结

整体安全状况良好。主要有两个可以改进的地方：
1. **建立配置文件指纹基线** — 这样以后可以自动检测核心配置是否被篡改
2. **确认插件变更** — 组件文件有变化，如果是你自己安装/更新的就没问题

其他检查项全部通过，没有发现安全威胁。
```

### 5.5 关于图标使用

在解读报告时使用以下图标（只有这 4 个，不要使用其他图标）：

| 图标 | 含义 | 对应报告状态 |
|------|------|------------|
| ✅ | 安全，没问题 | [PASS] |
| ⚠️ | 有小问题，建议处理 | [FAIL] 但不严重 |
| 🚨 | 严重问题，必须处理 | [FAIL] 且有安全风险 |
| ⏭️ | 跳过了，不用担心 | [SKIP] |

**判断 FAIL 是 ⚠️ 还是 🚨  的标准**：
- 如果报告里提到"篡改"、"恶意"、"爆破"、"危险"、"高危" → 用 🚨
- 如果报告里提到"首次运行"、"缺失基线"、"权限过宽"、"未知请求" → 用 ⚠️

## 定时任务配置

当用户后续要求"设置定时巡检"、"修改定时任务"、"自动巡检"时：

1. 读取 [references/cron-setup.md](references/cron-setup.md) 文件
2. 在执行任何配置命令前，向用户确认以下信息并等待明确同意：

   **基本行为**：
   - 定时任务将在后台持续运行（按用户指定的时间间隔，如每天、每周等）
   - 每次执行会在本地生成报告（保存在 ~/.openclaw/security-reports/）
   - 必须使用 `openclaw cron add` 而非系统 crontab（openclaw cron 管理独立的调度会话和超时，系统 crontab 无法正确初始化 OpenClaw 环境）

   **隐私和网络行为**：
   - **默认行为**：定时任务仅在本地运行，不产生任何网络请求
   - **如果启用通知** `--announce/--channel/--to` 参数：每次巡检结果会通过 OpenClaw 消息通道（如 Telegram、钉钉）发送通知到指定 chat ID，这是额外的外部消息路径，需要用户明确知晓
   - **严禁在定时任务中使用 --push**：定时任务的命令中绝不应该包含 `--push`，因为 --push 会让定时任务定期向 Changeway 服务器上报设备标识和 Skill 清单，造成隐私敏感数据的长期自动上报。--push 仅限用户单次手动运行时显式指定

   **用户确认**：
   - 询问用户："确认要设置定时巡检吗？定时任务会每天运行扫描并保存本地报告。(是/否)"，收到"是"后再继续
   - 如果用户问及通知功能，补充："通知功能会让结果发送到你的 Telegram/钉钉等，可选配置。"

3. 严格按照 cron-setup.md 中的步骤执行
4. **关键安全要求**：
   - 必须使用 `openclaw cron add` 命令，禁止使用系统 crontab
   - 定时任务的命令中严禁添加 `--push` 参数
   - 审查用户最终的 cron 命令，确保不含 --push
