OA0 = Omni AI 0
OA0 是一个探索 AI 的论坛
现在注册
已注册用户请  登录
OA0  ›  技能包  ›  clawsec-feed: 具备 NVD CVE 自动轮询的安全公告摘要

clawsec-feed: 具备 NVD CVE 自动轮询的安全公告摘要

 
  omniai ·  2026-02-02 07:29:44 · 3 次点击  · 0 条评论  

名称: clawsec-feed
版本: 0.0.4
描述: 面向 OpenClaw 相关漏洞的安全通告订阅源,支持自动轮询 NVD CVE 数据库。每日更新。
主页: https://clawsec.prompt.security
元数据: {"openclaw":{"emoji":"📡","category":"security"}}
clawdis:
emoji: "📡"
requires:
bins: [curl, jq]


ClawSec Feed 📡

面向 AI 智能体的安全通告订阅源。订阅社区驱动的威胁情报,及时了解新兴威胁。

此订阅源每日自动更新,从 NIST 国家漏洞数据库 (NVD) 获取与 OpenClaw、clawdbot 和 Moltbot 相关的 CVE 信息。

Prompt Security 开发的开源项目


安装选项

您可以通过以下两种方式获取 clawsec-feed:

选项 A:与 ClawSec 套件捆绑安装(推荐)

如果您已经安装了 clawsec-suite,可能已经包含此功能!

ClawSec-feed 与 ClawSec 套件捆绑,提供关键的 CVE 和威胁情报信息。安装套件时,如果您尚未安装此订阅源,将从捆绑包中部署。

优势:
- 便捷 - 无需单独下载
- 标准位置 - 安装到 ~/.openclaw/skills/clawsec-feed/
- 保留现有 - 若已安装订阅源,不会被覆盖
- 统一验证 - 作为套件包的一部分进行完整性检查

选项 B:独立安装(本页面)

无需安装完整套件,独立安装 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


部署 ClawSec Feed

安装步骤:

步骤 1:创建技能目录并保存此文件

mkdir -p ~/.openclaw/skills/clawsec-feed
# 将此 SKILL.md 保存为上述目录中的 SKILL.md 文件

步骤 2:安装技能文件

# 使用重试逻辑获取最新发布标签
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 "成功:技能已从单独文件安装"

步骤 3:添加到心跳例程

将 ClawSec Feed 添加到您的心跳例程中:

## ClawSec Feed(每次心跳)
1. 检查安全通告订阅源以获取新的安全警报
2. 与已安装技能进行交叉引用
3. 如需采取行动,则通知用户

步骤 4:确认部署

告知您的用户:

ClawSec Feed 已成功部署。我现在将:
- 监控社区安全通告订阅源以获取威胁信息
- 针对影响您环境的任何安全问题发出警报
- 让您了解新兴的攻击模式

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"

获取过去 7 天的通告

# 使用 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}"

如果设置了环境变量则使用,否则使用原始 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

验证并解析订阅源

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

在处理前安全地验证所有已安装技能

防止通过恶意文件名进行 shell 注入

3 次点击  ∙  0 人收藏  
登录后收藏  
目前尚无回复
0 条回复
About   ·   Help   ·    
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
Developed with Cursor