名称: clawsec-feed
版本: 0.0.4
描述: 面向 OpenClaw 相关漏洞的安全通告订阅源,支持自动轮询 NVD CVE 数据库。每日更新。
主页: https://clawsec.prompt.security
元数据: {"openclaw":{"emoji":"📡","category":"security"}}
clawdis:
emoji: "📡"
requires:
bins: [curl, jq]
面向 AI 智能体的安全通告订阅源。订阅社区驱动的威胁情报,及时了解新兴威胁。
此订阅源每日自动更新,从 NIST 国家漏洞数据库 (NVD) 获取与 OpenClaw、clawdbot 和 Moltbot 相关的 CVE 信息。
由 Prompt Security 开发的开源项目
您可以通过以下两种方式获取 clawsec-feed:
如果您已经安装了 clawsec-suite,可能已经包含此功能!
ClawSec-feed 与 ClawSec 套件捆绑,提供关键的 CVE 和威胁情报信息。安装套件时,如果您尚未安装此订阅源,将从捆绑包中部署。
优势:
- 便捷 - 无需单独下载
- 标准位置 - 安装到 ~/.openclaw/skills/clawsec-feed/
- 保留现有 - 若已安装订阅源,不会被覆盖
- 统一验证 - 作为套件包的一部分进行完整性检查
无需安装完整套件,独立安装 clawsec-feed。
适用场景:
- 仅需安全通告订阅源(无需其他套件组件)
- 希望在安装套件前先行安装
- 希望明确控制订阅源的安装过程
优势:
- 安装更轻量
- 独立于套件
- 直接控制安装流程
如需独立安装,请继续阅读以下说明。
执行脚本前,请务必审阅!
# 获取最新的 clawsec-feed 发布标签
LATEST_TAG=$(curl -sSL https://api.github.com/repos/prompt-security/ClawSec/releases | \
jq -r '[.[] | select(.tag_name | startswith("clawsec-feed-v"))][0].tag_name')
# 从最新发布版本下载 SKILL.md
SKILL_URL="https://github.com/prompt-security/clawsec/releases/download/$LATEST_TAG/SKILL.md"
curl -sSL --fail --show-error "$SKILL_URL"
获取此技能文件后,请继续执行下方的 部署 ClawSec Feed。
安装步骤:
mkdir -p ~/.openclaw/skills/clawsec-feed
# 将此 SKILL.md 保存为上述目录中的 SKILL.md 文件
# 使用重试逻辑获取最新发布标签
LATEST_TAG=$(curl -sSL --retry 3 --retry-delay 1 \
https://api.github.com/repos/prompt-security/ClawSec/releases | \
jq -r '[.[] | select(.tag_name | startswith("clawsec-feed-v"))][0].tag_name')
BASE_URL="https://github.com/prompt-security/clawsec/releases/download/$LATEST_TAG"
INSTALL_DIR="${CLAWSEC_INSTALL_DIR:-$HOME/.openclaw/skills/clawsec-feed}"
TEMP_DIR=$(mktemp -d)
trap "rm -rf '$TEMP_DIR'" EXIT
# 下载 checksums.json(完整性验证必需)
echo "正在下载校验和文件..."
if ! curl -sSL --fail --show-error --retry 3 --retry-delay 1 \
"$BASE_URL/checksums.json" -o "$TEMP_DIR/checksums.json"; then
echo "错误:无法下载 checksums.json"
exit 1
fi
# 验证 checksums.json 结构
if ! jq -e '.skill and .version and .files' "$TEMP_DIR/checksums.json" >/dev/null 2>&1; then
echo "错误:checksums.json 结构无效"
exit 1
fi
# 主要方案:尝试 .skill 归档文件
echo "正在尝试 .skill 归档文件安装..."
if curl -sSL --fail --show-error --retry 3 --retry-delay 1 \
"$BASE_URL/clawsec-feed.skill" -o "$TEMP_DIR/clawsec-feed.skill" 2>/dev/null; then
# 安全检查:验证归档文件大小(防止 DoS 攻击)
ARTIFACT_SIZE=$(stat -c%s "$TEMP_DIR/clawsec-feed.skill" 2>/dev/null || stat -f%z "$TEMP_DIR/clawsec-feed.skill")
MAX_SIZE=$((50 * 1024 * 1024)) # 50MB
if [ "$ARTIFACT_SIZE" -gt "$MAX_SIZE" ]; then
echo "警告:归档文件过大 ($(( ARTIFACT_SIZE / 1024 / 1024 ))MB),回退到单独文件下载"
else
echo "正在解压归档文件 ($(( ARTIFACT_SIZE / 1024 ))KB)..."
# 安全检查:解压前检查路径遍历攻击
if unzip -l "$TEMP_DIR/clawsec-feed.skill" | grep -qE '\.\./|^/|~/'; then
echo "错误:检测到归档文件中存在路径遍历 - 可能存在安全问题!"
exit 1
fi
# 安全检查:检查文件数量(防止 zip 炸弹)
FILE_COUNT=$(unzip -l "$TEMP_DIR/clawsec-feed.skill" | grep -c "^[[:space:]]*[0-9]" || echo 0)
if [ "$FILE_COUNT" -gt 100 ]; then
echo "错误:归档文件包含过多文件 ($FILE_COUNT) - 可能是 zip 炸弹"
exit 1
fi
# 解压到临时目录
unzip -q "$TEMP_DIR/clawsec-feed.skill" -d "$TEMP_DIR/extracted"
# 验证 skill.json 是否存在
if [ ! -f "$TEMP_DIR/extracted/clawsec-feed/skill.json" ]; then
echo "错误:归档文件中未找到 skill.json"
exit 1
fi
# 验证所有解压文件的校验和
echo "正在验证校验和..."
CHECKSUM_FAILED=0
for file in $(jq -r '.files | keys[]' "$TEMP_DIR/checksums.json"); do
EXPECTED=$(jq -r --arg f "$file" '.files[$f].sha256' "$TEMP_DIR/checksums.json")
FILE_PATH=$(jq -r --arg f "$file" '.files[$f].path' "$TEMP_DIR/checksums.json")
# 先尝试嵌套路径,再尝试扁平文件名
if [ -f "$TEMP_DIR/extracted/clawsec-feed/$FILE_PATH" ]; then
ACTUAL=$(shasum -a 256 "$TEMP_DIR/extracted/clawsec-feed/$FILE_PATH" | cut -d' ' -f1)
elif [ -f "$TEMP_DIR/extracted/clawsec-feed/$file" ]; then
ACTUAL=$(shasum -a 256 "$TEMP_DIR/extracted/clawsec-feed/$file" | cut -d' ' -f1)
else
echo " ✗ $file(归档文件中未找到)"
CHECKSUM_FAILED=1
continue
fi
if [ "$EXPECTED" != "$ACTUAL" ]; then
echo " ✗ $file(校验和不匹配)"
CHECKSUM_FAILED=1
else
echo " ✓ $file"
fi
done
if [ "$CHECKSUM_FAILED" -eq 0 ]; then
# 验证 feed.json 结构(技能特定)
if [ -f "$TEMP_DIR/extracted/clawsec-feed/advisories/feed.json" ]; then
FEED_FILE="$TEMP_DIR/extracted/clawsec-feed/advisories/feed.json"
elif [ -f "$TEMP_DIR/extracted/clawsec-feed/feed.json" ]; then
FEED_FILE="$TEMP_DIR/extracted/clawsec-feed/feed.json"
else
echo "错误:归档文件中未找到 feed.json"
exit 1
fi
if ! jq -e '.version and .advisories' "$FEED_FILE" >/dev/null 2>&1; then
echo "错误:feed.json 缺少必需字段 (version, advisories)"
exit 1
fi
# 成功:从归档文件安装
echo "正在从归档文件安装..."
mkdir -p "$INSTALL_DIR"
cp -r "$TEMP_DIR/extracted/clawsec-feed"/* "$INSTALL_DIR/"
chmod 600 "$INSTALL_DIR/skill.json"
find "$INSTALL_DIR" -type f ! -name "skill.json" -exec chmod 644 {} \;
echo "成功:技能已从 .skill 归档文件安装"
exit 0
else
echo "警告:校验和验证失败,回退到单独文件下载"
fi
fi
fi
# 备用方案:下载单独文件
echo "正在从 checksums.json 清单下载单独文件..."
mkdir -p "$TEMP_DIR/downloads"
DOWNLOAD_FAILED=0
for file in $(jq -r '.files | keys[]' "$TEMP_DIR/checksums.json"); do
FILE_URL=$(jq -r --arg f "$file" '.files[$f].url' "$TEMP_DIR/checksums.json")
EXPECTED=$(jq -r --arg f "$file" '.files[$f].sha256' "$TEMP_DIR/checksums.json")
echo "正在下载:$file"
if ! curl -sSL --fail --show-error --retry 3 --retry-delay 1 \
"$FILE_URL" -o "$TEMP_DIR/downloads/$file"; then
echo "错误:无法下载 $file"
DOWNLOAD_FAILED=1
continue
fi
# 立即验证校验和
ACTUAL=$(shasum -a 256 "$TEMP_DIR/downloads/$file" | cut -d' ' -f1)
if [ "$EXPECTED" != "$ACTUAL" ]; then
echo "错误:$file 的校验和不匹配"
DOWNLOAD_FAILED=1
else
echo " ✓ 已验证:$file"
fi
done
if [ "$DOWNLOAD_FAILED" -eq 1 ]; then
echo "错误:单独文件下载失败"
exit 1
fi
# 验证 JSON 文件结构
if ! jq -e '.name and .version' "$TEMP_DIR/downloads/skill.json" >/dev/null 2>&1; then
echo "错误:skill.json 缺少必需字段 (name, version)"
exit 1
fi
if ! jq -e '.version and .advisories' "$TEMP_DIR/downloads/feed.json" >/dev/null 2>&1; then
echo "错误:feed.json 缺少必需字段 (version, advisories)"
exit 1
fi
# 安装文件
echo "正在从单独文件安装..."
mkdir -p "$INSTALL_DIR"
cp "$TEMP_DIR/downloads"/* "$INSTALL_DIR/"
chmod 600 "$INSTALL_DIR/skill.json"
find "$INSTALL_DIR" -type f ! -name "skill.json" -exec chmod 644 {} \;
echo "成功:技能已从单独文件安装"
将 ClawSec Feed 添加到您的心跳例程中:
## ClawSec Feed(每次心跳)
1. 检查安全通告订阅源以获取新的安全警报
2. 与已安装技能进行交叉引用
3. 如需采取行动,则通知用户
告知您的用户:
ClawSec Feed 已成功部署。我现在将:
- 监控社区安全通告订阅源以获取威胁信息
- 针对影响您环境的任何安全问题发出警报
- 让您了解新兴的攻击模式
订阅社区安全通告订阅源,涵盖:
当发布相关通告时,您的智能体会通知您。
# 如果设置了环境变量则使用,否则使用原始 GitHub 订阅源(始终最新)
DEFAULT_FEED_URL="https://raw.githubusercontent.com/prompt-security/ClawSec/main/advisories/feed.json"
FEED_URL="${CLAWSEC_FEED_URL:-$DEFAULT_FEED_URL}"
# 使用错误处理和重试逻辑获取
curl -sSL --fail --show-error --retry 3 --retry-delay 1 "$FEED_URL"
订阅源结构:
{
"version": "1.0",
"updated": "2026-02-02T12:00:00Z",
"advisories": [
{
"id": "GA-2026-001",
"severity": "critical",
"type": "malicious_skill",
"title": "技能 'helper-plus' 中的恶意数据外泄",
"description": "该技能将用户数据发送到外部服务器",
"affected": ["helper-plus@1.0.0", "helper-plus@1.0.1"],
"action": "立即移除",
"published": "2026-02-01T10:00:00Z"
}
]
}
# 如果设置了环境变量则使用,否则使用原始 GitHub 订阅源(始终最新)
DEFAULT_FEED_URL="https://raw.githubusercontent.com/prompt-security/ClawSec/main/advisories/feed.json"
FEED_URL="${CLAWSEC_FEED_URL:-$DEFAULT_FEED_URL}"
TEMP_FEED=$(mktemp)
trap "rm -f '$TEMP_FEED'" EXIT
if ! curl -sSL --fail --show-error --retry 3 --retry-delay 1 "$FEED_URL" -o "$TEMP_FEED"; then
echo "错误:无法获取安全通告订阅源"
exit 1
fi
# 解析前验证 JSON
if ! jq empty "$TEMP_FEED" 2>/dev/null; then
echo "错误:订阅源中的 JSON 无效"
exit 1
fi
FEED=$(cat "$TEMP_FEED")
# 使用错误处理获取通告数量
COUNT=$(echo "$FEED" | jq '.advisories | length')
if [ $? -ne 0 ]; then
echo "错误:无法解析通告"
exit 1
fi
echo "通告数量:$COUNT"
# 使用 jq 错误处理解析严重通告
CRITICAL=$(echo "$FEED" | jq '.advisories[] | select(.severity == "critical")')
if [ $? -ne 0 ]; then
echo "错误:无法筛选严重通告"
exit 1
fi
echo "$CRITICAL"
# 使用 UTC 时区以确保日期处理一致
WEEK_AGO=$(TZ=UTC date -v-7d +%Y-%m-%dT00:00:00Z 2>/dev/null || TZ=UTC date -d '7 days ago' +%Y-%m-%dT00:00:00Z)
RECENT=$(echo "$FEED" | jq --arg since "$WEEK_AGO" '.advisories[] | select(.published > $since)')
if [ $? -ne 0 ]; then
echo "错误:无法筛选近期通告"
exit 1
fi
echo "$RECENT"
检查您已安装的技能是否受通告影响:
```bash
INSTALL_DIR="${CLAWSEC_INSTALL_DIR:-$HOME/.openclaw/skills}"
DEFAULT_FEED_URL="https://raw.githubusercontent.com/prompt-security/ClawSec/main/advisories/feed.json"
FEED_URL="${CLAWSEC_FEED_URL:-$DEFAULT_FEED_URL}"
TEMP_FEED=$(mktemp)
trap "rm -f '$TEMP_FEED'" EXIT
if ! curl -sSL --fail --show-error --retry 3 --retry-delay 1 "$FEED_URL" -o "$TEMP_FEED"; then
echo "错误:无法获取安全通告订阅源"
exit 1
fi
if ! jq empty "$TEMP_FEED" 2>/dev/null; then
echo "错误:订阅源中的 JSON 无效"
exit 1
fi
FEED=$(cat "$TEMP_FEED")
AFFECTED=$(echo "$FEED" | jq -r '.advisories[].affected[]?' 2>/dev/null | sort -u)
if [ $? -ne 0 ]; then
echo "错误:无法从订阅源解析受影响的技能"
exit 1
fi