mcpField
S
soul-guardian

soul-guardian

github.com/prompt-security安全1.1k255 次安装今天更新
代码仓库

关于 soul-guardian

soul-guardian 使用批准基线监控 Agent 的核心文件,在检测到偏差时生成警报,并可自动恢复指定文件。它适合需要保护 OpenClaw 工作区配置与提示文件的用户。

主要功能

  1. 01按 SHA-256 基线检测文件偏差
  2. 02为指定文件自动恢复或仅发出警报
  3. 03生成统一差异供审查
  4. 04维护哈希链防篡改审计日志
  5. 05支持持续监控和心跳检查

适用场景

  1. 01监控 SOUL.md 和 AGENTS.md 的未授权修改
  2. 02检查 HEARTBEAT.md 等文件的变化
  3. 03审查差异后批准有意修改

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/prompt-security/clawsec --skill soul-guardian

安装后在 Claude Code 中输入/soul-guardian确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

.clawhubignore
CHANGELOG.md
README.md
skill.json
scripts/
install_launchd_plist.py
onboard_state_dir.py
soul_guardian.py
test_install_launchd_plist.py
test_soul_guardian.py

详细介绍

soul-guardian 👻

通过自动检测、恢复和用户提醒,保护 Agent 的核心文件(SOUL.md、AGENTS.md 等)免遭未经授权的更改。

Vercel Skills Installation

使用 Vercel Skills CLI 为此运行环境安装:

npx skills add prompt-security/clawsec --skill soul-guardian -a openclaw -y

Operational Notes

  • 必需的运行时:python3
  • 可选运行时:用于 cron 集成的 openclaw、用于 macOS 调度的 launchctl、用于演示辅助工具的 bash
  • 副作用:可将受保护文件自动恢复到已批准的基线,并在本地写入审计和隔离状态
  • 网络行为:默认不联网
  • 信任模型:所有调度均为可选,但恢复模式会有意覆盖偏离基线的文件

Release Artifact Verification

对于独立安装,请先验证已签名的发布清单,再信任 SKILL.md、skill.json 或归档文件。skill.json 文件是软件包元数据/SBOM 来源,发布流水线会使用 ClawSec 发布密钥对 checksums.json 进行签名。

set -euo pipefail

SKILL_NAME="soul-guardian"
VERSION="0.0.9"
REPO="prompt-security/clawsec"
TAG="${SKILL_NAME}-v${VERSION}"
BASE="https://github.com/${REPO}/releases/download/${TAG}"
ZIP_NAME="${SKILL_NAME}-v${VERSION}.zip"
TMP_DIR="$(mktemp -d)"
trap 'rm -rf "$TMP_DIR"' EXIT

RELEASE_PUBKEY_SHA256="711424e4535f84093fefb024cd1ca4ec87439e53907b305b79a631d5befba9c8"

curl -fsSL "$BASE/checksums.json" -o "$TMP_DIR/checksums.json"
curl -fsSL "$BASE/checksums.sig" -o "$TMP_DIR/checksums.sig"
curl -fsSL "$BASE/signing-public.pem" -o "$TMP_DIR/signing-public.pem"
curl -fsSL "$BASE/$ZIP_NAME" -o "$TMP_DIR/$ZIP_NAME"
curl -fsSL "$BASE/SKILL.md" -o "$TMP_DIR/SKILL.md"
curl -fsSL "$BASE/skill.json" -o "$TMP_DIR/skill.json"

ACTUAL_PUBKEY_SHA256="$(openssl pkey -pubin -in "$TMP_DIR/signing-public.pem" -outform DER | shasum -a 256 | awk '{print $1}')"
if [ "$ACTUAL_PUBKEY_SHA256" != "$RELEASE_PUBKEY_SHA256" ]; then
  echo "ERROR: signing-public.pem fingerprint mismatch" >&2
  exit 1
fi

openssl base64 -d -A -in "$TMP_DIR/checksums.sig" -out "$TMP_DIR/checksums.sig.bin"
openssl pkeyutl -verify -rawin -pubin \
  -inkey "$TMP_DIR/signing-public.pem" \
  -sigfile "$TMP_DIR/checksums.sig.bin" \
  -in "$TMP_DIR/checksums.json" >/dev/null

hash_file() {
  if command -v shasum >/dev/null 2>&1; then
    shasum -a 256 "$1" | awk '{print $1}'
  else
    sha256sum "$1" | awk '{print $1}'
  fi
}

verify_manifest_file() {
  asset="$1"
  path="$2"
  expected="$(jq -r --arg asset "$asset" '.files[$asset].sha256 // empty' "$TMP_DIR/checksums.json")"
  if [ -z "$expected" ]; then
    echo "ERROR: checksums.json missing $asset" >&2
    exit 1
  fi
  actual="$(hash_file "$path")"
  if [ "$actual" != "$expected" ]; then
    echo "ERROR: checksum mismatch for $asset" >&2
    exit 1
  fi
}

expected_archive="$(jq -r '.archive.sha256 // empty' "$TMP_DIR/checksums.json")"
if [ -z "$expected_archive" ]; then
  echo "ERROR: checksums.json missing archive.sha256" >&2
  exit 1
fi
actual_archive="$(hash_file "$TMP_DIR/$ZIP_NAME")"
if [ "$actual_archive" != "$expected_archive" ]; then
  echo "ERROR: archive checksum mismatch" >&2
  exit 1
fi

verify_manifest_file "SKILL.md" "$TMP_DIR/SKILL.md"
verify_manifest_file "skill.json" "$TMP_DIR/skill.json"

echo "Signed release manifest, archive, SKILL.md, and skill.json verified."

只有在验证成功后,才可安装或解压归档文件。

Quick Start (3 Steps)

Step 1: 初始化基线
cd ~/.openclaw/workspace
python3 skills/soul-guardian/scripts/soul_guardian.py init --actor setup --note "initial baseline"
Step 2: 启用监控
python3 skills/soul-guardian/scripts/soul_guardian.py enable-monitoring

此操作将演示如何将监控添加到工作流中。

Step 3: 添加到 HEARTBEAT.md(推荐)

将以下内容添加到 HEARTBEAT.md,以启用自动监控:

## Soul Guardian Check
- Run `python3 skills/soul-guardian/scripts/soul_guardian.py check --actor heartbeat --output-format alert`
- If any output is produced, relay it to the user immediately as a security alert

就是这样!Soul Guardian 现在将:

  • ✅ 检测受保护文件是否遭到未经授权的更改
  • ✅ 将 SOUL.md 和 AGENTS.md 自动恢复到已批准的基线
  • ✅ 在检测并处理偏离基线的情况时提醒你

保护范围(默认策略)

文件模式偏离基线时的操作
SOUL.mdrestore自动恢复并提醒
AGENTS.mdrestore自动恢复并提醒
USER.mdalert仅提醒
TOOLS.mdalert仅提醒
IDENTITY.mdalert仅提醒
HEARTBEAT.mdalert仅提醒
MEMORY.mdalert仅提醒
memory/*.mdignore忽略

Commands

检查是否偏离基线(输出提醒)
python3 skills/soul-guardian/scripts/soul_guardian.py check --output-format alert
  • 未发现偏离时不输出内容
  • 检测到偏离时,输出易于理解的提醒
  • 非常适合与心跳集成
监视模式(持续监控)
python3 skills/soul-guardian/scripts/soul_guardian.py watch --interval 30

程序将持续运行,每 30 秒检查一次。

批准有意进行的更改
python3 skills/soul-guardian/scripts/soul_guardian.py approve --file SOUL.md --actor user --note "intentional update"
查看状态
python3 skills/soul-guardian/scripts/soul_guardian.py status
验证审计日志完整性
python3 skills/soul-guardian/scripts/soul_guardian.py verify-audit

提醒格式

检测到偏离基线时,--output-format alert 会生成类似以下内容的输出:

==================================================
🚨 SOUL GUARDIAN SECURITY ALERT
==================================================

📄 FILE: SOUL.md
   Mode: restore
   Status: ✅ RESTORED to approved baseline
   Expected hash: abc123def456...
   Found hash:    789xyz000111...
   Diff saved: /path/to/patches/drift.patch

==================================================
Review changes and investigate the source of drift.
If intentional, run: soul_guardian.py approve --file <path>
==================================================

此输出旨在直接转发给 TUI/聊天中的用户。


安全模型

它能做什么:

  • 检测文件系统与已批准基线之间的偏差(sha256)
  • 生成统一差异,以供审查
  • 通过哈希链维护防篡改审计日志
  • 拒绝对符号链接执行操作
  • 使用原子写入来恢复文件

它不能做什么:

  • 无法证明是谁进行了更改(操作者信息仅为尽力收集的元数据)
  • 如果攻击者同时控制工作区和状态目录,则无法提供保护
  • 不能替代备份

**建议:**将状态目录存放在工作区之外,以提高韧性。


演示

运行完整演示流程,查看 soul-guardian 的实际效果:

bash skills/soul-guardian/scripts/demo.sh

此操作将:

  1. 验证状态干净(静默检查)
  2. 向 SOUL.md 注入恶意内容
  3. 运行心跳检查(生成提醒)
  4. 显示 SOUL.md 已恢复

故障排除

“未初始化”错误: 先运行 init 来设置基线。

偏离基线的情况持续发生: 检查是什么在修改你的文件。查看审计日志和补丁。

想要批准某项更改: 审查更改后,运行 approve --file <path>。

评论

支持 Markdown