clawsec-feed

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

ClawSec Feed 📡

ClawSec Feed 📡

Security advisory feed monitoring for AI agents. Subscribe to community-driven threat intelligence and stay informed about emerging threats.
This feed is automatically updated daily with CVEs related to OpenClaw, clawdbot, and Moltbot from the NIST National Vulnerability Database (NVD).
An open source project by Prompt Security

面向AI Agent的安全咨询源监控服务。订阅社区驱动的威胁情报,及时了解新兴威胁。
该源会每日自动从美国国家标准与技术研究院(NIST)国家漏洞数据库(NVD)获取与OpenClaw、clawdbot和Moltbot相关的CVE信息并更新。
Prompt Security开发的开源项目

Installation Options

安装选项

You can get clawsec-feed in two ways:
您可以通过两种方式获取clawsec-feed:

Option A: Bundled with ClawSec Suite (Recommended)

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

If you've installed clawsec-suite, you may already have this!
ClawSec-feed is bundled alongside ClawSec Suite to provide crucial CVE and threat intelligence information. When you install the suite, if you don't already have the feed installed, it will be deployed from the bundled copy.
Advantages:
  • Convenient - no separate download needed
  • Standard location - installed to
    ~/.openclaw/skills/clawsec-feed/
  • Preserved - if you already have feed installed, it won't be overwritten
  • Single verification - integrity checked as part of suite package
如果您已安装clawsec-suite,可能已经拥有该组件!
ClawSec-feed与ClawSec Suite捆绑提供,用于提供关键的CVE和威胁情报信息。当您安装套件时,如果尚未安装该源,将从捆绑副本中部署。
优势:
  • 便捷 - 无需单独下载
  • 标准路径 - 安装至
    ~/.openclaw/skills/clawsec-feed/
  • 保留现有版本 - 若您已安装该源,不会被覆盖
  • 统一验证 - 作为套件包的一部分进行完整性检查

Option B: Standalone Installation (This Page)

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

Install clawsec-feed independently without the full suite.
When to use standalone:
  • You only need the advisory feed (not other suite components)
  • You want to install before installing the suite
  • You prefer explicit control over feed installation
Advantages:
  • Lighter weight installation
  • Independent from suite
  • Direct control over installation process
Continue below for standalone installation instructions.

Installation Steps: Agents should review scripts before execution!
bash
undefined
无需安装完整套件,独立安装clawsec-feed。
适合独立安装的场景:
  • 您仅需要咨询源(不需要套件的其他组件)
  • 您想在安装套件前先安装该源
  • 您希望明确控制源的安装过程
优势:
  • 安装包更轻量化
  • 独立于套件
  • 直接控制安装流程
继续查看下方的独立安装说明。

安装步骤: Agent在执行脚本前应先审核脚本内容!
bash
undefined

Get latest clawsec-feed release tag

Get latest clawsec-feed release tag

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')
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')

Download SKILL.md from latest release

Download SKILL.md from latest release

SKILL_URL="https://github.com/prompt-security/clawsec/releases/download/$LATEST_TAG/SKILL.md" curl -sSL --fail --show-error "$SKILL_URL"

Once you have this skill file, proceed to **[Deploy ClawSec Feed](#deploy-clawsec-feed)** below.

---
SKILL_URL="https://github.com/prompt-security/clawsec/releases/download/$LATEST_TAG/SKILL.md" curl -sSL --fail --show-error "$SKILL_URL"

获取该skill文件后,继续执行下方的**[部署ClawSec Feed](#deploy-clawsec-feed)**步骤。

---

Deploy ClawSec Feed

部署ClawSec Feed

Installation steps:
安装步骤:

Step 1: Create skill directory and save this file

步骤1:创建skill目录并保存该文件

bash
mkdir -p ~/.openclaw/skills/clawsec-feed
bash
mkdir -p ~/.openclaw/skills/clawsec-feed

Save this SKILL.md as SKILL.md in the directory above

Save this SKILL.md as SKILL.md in the directory above

undefined
undefined

Step 2: Install skill files

步骤2:安装skill文件

bash
undefined
bash
undefined

Get latest release tag with retry logic

Get latest release tag with retry logic

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
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

Download checksums.json (REQUIRED for integrity verification)

Download checksums.json (REQUIRED for integrity verification)

echo "Downloading checksums..." if ! curl -sSL --fail --show-error --retry 3 --retry-delay 1
"$BASE_URL/checksums.json" -o "$TEMP_DIR/checksums.json"; then echo "ERROR: Failed to download checksums.json" exit 1 fi
echo "Downloading checksums..." if ! curl -sSL --fail --show-error --retry 3 --retry-delay 1
"$BASE_URL/checksums.json" -o "$TEMP_DIR/checksums.json"; then echo "ERROR: Failed to download checksums.json" exit 1 fi

Validate checksums.json structure

Validate checksums.json structure

if ! jq -e '.skill and .version and .files' "$TEMP_DIR/checksums.json" >/dev/null 2>&1; then echo "ERROR: Invalid checksums.json structure" exit 1 fi
if ! jq -e '.skill and .version and .files' "$TEMP_DIR/checksums.json" >/dev/null 2>&1; then echo "ERROR: Invalid checksums.json structure" exit 1 fi

PRIMARY: Try .skill artifact

PRIMARY: Try .skill artifact

echo "Attempting .skill artifact installation..." 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

Security: Check artifact size (prevent 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 "WARNING: Artifact too large ($(( ARTIFACT_SIZE / 1024 / 1024 ))MB), falling back to individual files" else echo "Extracting artifact ($(( ARTIFACT_SIZE / 1024 ))KB)..."
# Security: Check for path traversal before extraction
if unzip -l "$TEMP_DIR/clawsec-feed.skill" | grep -qE '\.\./|^/|~/'; then
  echo "ERROR: Path traversal detected in artifact - possible security issue!"
  exit 1
fi

# Security: Check file count (prevent zip bomb)
FILE_COUNT=$(unzip -l "$TEMP_DIR/clawsec-feed.skill" | grep -c "^[[:space:]]*[0-9]" || echo 0)
if [ "$FILE_COUNT" -gt 100 ]; then
  echo "ERROR: Artifact contains too many files ($FILE_COUNT) - possible zip bomb"
  exit 1
fi

# Extract to temp directory
unzip -q "$TEMP_DIR/clawsec-feed.skill" -d "$TEMP_DIR/extracted"

# Verify skill.json exists
if [ ! -f "$TEMP_DIR/extracted/clawsec-feed/skill.json" ]; then
  echo "ERROR: skill.json not found in artifact"
  exit 1
fi

# Verify checksums for all extracted files
echo "Verifying checksums..."
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")

  # Try nested path first, then flat filename
  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 (not found in artifact)"
    CHECKSUM_FAILED=1
    continue
  fi

  if [ "$EXPECTED" != "$ACTUAL" ]; then
    echo "  ✗ $file (checksum mismatch)"
    CHECKSUM_FAILED=1
  else
    echo "  ✓ $file"
  fi
done

if [ "$CHECKSUM_FAILED" -eq 0 ]; then
  # Validate feed.json structure (skill-specific)
  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 "ERROR: feed.json not found in artifact"
    exit 1
  fi

  if ! jq -e '.version and .advisories' "$FEED_FILE" >/dev/null 2>&1; then
    echo "ERROR: feed.json missing required fields (version, advisories)"
    exit 1
  fi

  # SUCCESS: Install from artifact
  echo "Installing from artifact..."
  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 "SUCCESS: Skill installed from .skill artifact"
  exit 0
else
  echo "WARNING: Checksum verification failed, falling back to individual files"
fi
fi fi
echo "Attempting .skill artifact installation..." 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

Security: Check artifact size (prevent 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 "WARNING: Artifact too large ($(( ARTIFACT_SIZE / 1024 / 1024 ))MB), falling back to individual files" else echo "Extracting artifact ($(( ARTIFACT_SIZE / 1024 ))KB)..."
# Security: Check for path traversal before extraction
if unzip -l "$TEMP_DIR/clawsec-feed.skill" | grep -qE '\.\./|^/|~/'; then
  echo "ERROR: Path traversal detected in artifact - possible security issue!"
  exit 1
fi

# Security: Check file count (prevent zip bomb)
FILE_COUNT=$(unzip -l "$TEMP_DIR/clawsec-feed.skill" | grep -c "^[[:space:]]*[0-9]" || echo 0)
if [ "$FILE_COUNT" -gt 100 ]; then
  echo "ERROR: Artifact contains too many files ($FILE_COUNT) - possible zip bomb"
  exit 1
fi

# Extract to temp directory
unzip -q "$TEMP_DIR/clawsec-feed.skill" -d "$TEMP_DIR/extracted"

# Verify skill.json exists
if [ ! -f "$TEMP_DIR/extracted/clawsec-feed/skill.json" ]; then
  echo "ERROR: skill.json not found in artifact"
  exit 1
fi

# Verify checksums for all extracted files
echo "Verifying checksums..."
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")

  # Try nested path first, then flat filename
  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 (not found in artifact)"
    CHECKSUM_FAILED=1
    continue
  fi

  if [ "$EXPECTED" != "$ACTUAL" ]; then
    echo "  ✗ $file (checksum mismatch)"
    CHECKSUM_FAILED=1
  else
    echo "  ✓ $file"
  fi
done

if [ "$CHECKSUM_FAILED" -eq 0 ]; then
  # Validate feed.json structure (skill-specific)
  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 "ERROR: feed.json not found in artifact"
    exit 1
  fi

  if ! jq -e '.version and .advisories' "$FEED_FILE" >/dev/null 2>&1; then
    echo "ERROR: feed.json missing required fields (version, advisories)"
    exit 1
  fi

  # SUCCESS: Install from artifact
  echo "Installing from artifact..."
  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 "SUCCESS: Skill installed from .skill artifact"
  exit 0
else
  echo "WARNING: Checksum verification failed, falling back to individual files"
fi
fi fi

FALLBACK: Download individual files

FALLBACK: Download individual files

echo "Downloading individual files from checksums.json manifest..." 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 "Downloading: $file" if ! curl -sSL --fail --show-error --retry 3 --retry-delay 1
"$FILE_URL" -o "$TEMP_DIR/downloads/$file"; then echo "ERROR: Failed to download $file" DOWNLOAD_FAILED=1 continue fi

Verify checksum immediately

ACTUAL=$(shasum -a 256 "$TEMP_DIR/downloads/$file" | cut -d' ' -f1) if [ "$EXPECTED" != "$ACTUAL" ]; then echo "ERROR: Checksum mismatch for $file" DOWNLOAD_FAILED=1 else echo " ✓ Verified: $file" fi done
if [ "$DOWNLOAD_FAILED" -eq 1 ]; then echo "ERROR: Individual file download failed" exit 1 fi
echo "Downloading individual files from checksums.json manifest..." 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 "Downloading: $file" if ! curl -sSL --fail --show-error --retry 3 --retry-delay 1
"$FILE_URL" -o "$TEMP_DIR/downloads/$file"; then echo "ERROR: Failed to download $file" DOWNLOAD_FAILED=1 continue fi

Verify checksum immediately

ACTUAL=$(shasum -a 256 "$TEMP_DIR/downloads/$file" | cut -d' ' -f1) if [ "$EXPECTED" != "$ACTUAL" ]; then echo "ERROR: Checksum mismatch for $file" DOWNLOAD_FAILED=1 else echo " ✓ Verified: $file" fi done
if [ "$DOWNLOAD_FAILED" -eq 1 ]; then echo "ERROR: Individual file download failed" exit 1 fi

Validate JSON files structure

Validate JSON files structure

if ! jq -e '.name and .version' "$TEMP_DIR/downloads/skill.json" >/dev/null 2>&1; then echo "ERROR: skill.json missing required fields (name, version)" exit 1 fi
if ! jq -e '.version and .advisories' "$TEMP_DIR/downloads/feed.json" >/dev/null 2>&1; then echo "ERROR: feed.json missing required fields (version, advisories)" exit 1 fi
if ! jq -e '.name and .version' "$TEMP_DIR/downloads/skill.json" >/dev/null 2>&1; then echo "ERROR: skill.json missing required fields (name, version)" exit 1 fi
if ! jq -e '.version and .advisories' "$TEMP_DIR/downloads/feed.json" >/dev/null 2>&1; then echo "ERROR: feed.json missing required fields (version, advisories)" exit 1 fi

Install files

Install files

echo "Installing from individual files..." 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 "SUCCESS: Skill installed from individual files"
undefined
echo "Installing from individual files..." 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 "SUCCESS: Skill installed from individual files"
undefined

Step 3: Add to your heartbeat

步骤3:添加至心跳任务

Add ClawSec Feed to your heartbeat routine:
markdown
undefined
将ClawSec Feed添加至您的心跳任务流程:
markdown
undefined

ClawSec Feed (every heartbeat)

ClawSec Feed (every heartbeat)

  1. Check advisory feed for new security alerts
  2. Cross-reference with installed skills
  3. Notify user if action is required
undefined
  1. Check advisory feed for new security alerts
  2. Cross-reference with installed skills
  3. Notify user if action is required
undefined

Step 4: Confirm deployment

步骤4:确认部署完成

Tell your user:
ClawSec Feed deployed successfully. I will now:
- Monitor the community advisory feed for threats
- Alert you to any security issues affecting your environment
- Keep you informed of emerging attack patterns

告知用户:
ClawSec Feed部署成功。我将:
- 监控社区咨询源以获取威胁信息
- 提醒您任何影响您环境的安全问题
- 及时向您通报新兴攻击模式

What ClawSec Feed Does

ClawSec Feed的功能

Advisory Feed Monitoring

咨询源监控

Subscribes to the community advisory feed for:
  • Known malicious skills/plugins - Skills that have been identified as harmful
  • Prompt injection patterns - Attack patterns observed in the wild
  • Vulnerable skill versions - Skills with known security flaws
  • Security best practice updates - New recommendations for agent safety
When a relevant advisory is published, your agent will notify you.

订阅社区咨询源,获取以下信息:
  • 已知恶意skill/插件 - 已被识别为有害的Skill
  • 提示注入模式 - 实际环境中发现的攻击模式
  • 存在漏洞的Skill版本 - 已知存在安全缺陷的Skill
  • 安全最佳实践更新 - 针对Agent安全的新建议
当发布相关咨询时,您的Agent会向您发出通知。

Checking the Advisory Feed

查看咨询源

bash
undefined
bash
undefined

Use environment variable if set, otherwise use raw GitHub feed (always up-to-date)

Use environment variable if set, otherwise use raw GitHub feed (always up-to-date)

DEFAULT_FEED_URL="https://raw.githubusercontent.com/prompt-security/ClawSec/main/advisories/feed.json" FEED_URL="${CLAWSEC_FEED_URL:-$DEFAULT_FEED_URL}"
DEFAULT_FEED_URL="https://raw.githubusercontent.com/prompt-security/ClawSec/main/advisories/feed.json" FEED_URL="${CLAWSEC_FEED_URL:-$DEFAULT_FEED_URL}"

Fetch with error handling and retry logic

Fetch with error handling and retry logic

curl -sSL --fail --show-error --retry 3 --retry-delay 1 "$FEED_URL"

**Feed structure:**

```json
{
  "version": "1.0",
  "updated": "2026-02-02T12:00:00Z",
  "advisories": [
    {
      "id": "GA-2026-001",
      "severity": "critical",
      "type": "malicious_skill",
      "title": "Malicious data exfiltration in skill 'helper-plus'",
      "description": "Skill sends user data to external server",
      "affected": ["helper-plus@1.0.0", "helper-plus@1.0.1"],
      "action": "Remove immediately",
      "published": "2026-02-01T10:00:00Z"
    }
  ]
}

curl -sSL --fail --show-error --retry 3 --retry-delay 1 "$FEED_URL"

**源结构:**

```json
{
  "version": "1.0",
  "updated": "2026-02-02T12:00:00Z",
  "advisories": [
    {
      "id": "GA-2026-001",
      "severity": "critical",
      "type": "malicious_skill",
      "title": "Malicious data exfiltration in skill 'helper-plus'",
      "description": "Skill sends user data to external server",
      "affected": ["helper-plus@1.0.0", "helper-plus@1.0.1"],
      "action": "Remove immediately",
      "published": "2026-02-01T10:00:00Z"
    }
  ]
}

Parsing the Feed

解析咨询源

Get advisory count

获取咨询数量

bash
undefined
bash
undefined

Use environment variable if set, otherwise use raw GitHub feed (always up-to-date)

Use environment variable if set, otherwise use raw GitHub feed (always up-to-date)

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 "Error: Failed to fetch advisory feed" exit 1 fi
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 "Error: Failed to fetch advisory feed" exit 1 fi

Validate JSON before parsing

Validate JSON before parsing

if ! jq empty "$TEMP_FEED" 2>/dev/null; then echo "Error: Invalid JSON in feed" exit 1 fi
FEED=$(cat "$TEMP_FEED")
if ! jq empty "$TEMP_FEED" 2>/dev/null; then echo "Error: Invalid JSON in feed" exit 1 fi
FEED=$(cat "$TEMP_FEED")

Get advisory count with error handling

Get advisory count with error handling

COUNT=$(echo "$FEED" | jq '.advisories | length') if [ $? -ne 0 ]; then echo "Error: Failed to parse advisories" exit 1 fi echo "Advisory count: $COUNT"
undefined
COUNT=$(echo "$FEED" | jq '.advisories | length') if [ $? -ne 0 ]; then echo "Error: Failed to parse advisories" exit 1 fi echo "Advisory count: $COUNT"
undefined

Get critical advisories

获取严重级别咨询

bash
undefined
bash
undefined

Parse critical advisories with jq error handling

Parse critical advisories with jq error handling

CRITICAL=$(echo "$FEED" | jq '.advisories[] | select(.severity == "critical")') if [ $? -ne 0 ]; then echo "Error: Failed to filter critical advisories" exit 1 fi echo "$CRITICAL"
undefined
CRITICAL=$(echo "$FEED" | jq '.advisories[] | select(.severity == "critical")') if [ $? -ne 0 ]; then echo "Error: Failed to filter critical advisories" exit 1 fi echo "$CRITICAL"
undefined

Get advisories from the last 7 days

获取近7天的咨询

bash
undefined
bash
undefined

Use UTC timezone for consistent date handling

Use UTC timezone for consistent date handling

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 "Error: Failed to filter recent advisories" exit 1 fi echo "$RECENT"

---
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 "Error: Failed to filter recent advisories" exit 1 fi echo "$RECENT"

---

Cross-Reference Installed Skills

交叉引用已安装的Skill

Check if any of your installed skills are affected by advisories:
bash
undefined
检查您已安装的Skill是否受咨询影响:
bash
undefined

List your installed skills (adjust path for your platform)

List your installed skills (adjust path for your platform)

INSTALL_DIR="${CLAWSEC_INSTALL_DIR:-$HOME/.openclaw/skills}"
INSTALL_DIR="${CLAWSEC_INSTALL_DIR:-$HOME/.openclaw/skills}"

Use environment variable if set, otherwise use raw GitHub feed (always up-to-date)

Use environment variable if set, otherwise use raw GitHub feed (always up-to-date)

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 "Error: Failed to fetch advisory feed" exit 1 fi
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 "Error: Failed to fetch advisory feed" exit 1 fi

Validate and parse feed

Validate and parse feed

if ! jq empty "$TEMP_FEED" 2>/dev/null; then echo "Error: Invalid JSON in feed" exit 1 fi
FEED=$(cat "$TEMP_FEED") AFFECTED=$(echo "$FEED" | jq -r '.advisories[].affected[]?' 2>/dev/null | sort -u) if [ $? -ne 0 ]; then echo "Error: Failed to parse affected skills from feed" exit 1 fi
if ! jq empty "$TEMP_FEED" 2>/dev/null; then echo "Error: Invalid JSON in feed" exit 1 fi
FEED=$(cat "$TEMP_FEED") AFFECTED=$(echo "$FEED" | jq -r '.advisories[].affected[]?' 2>/dev/null | sort -u) if [ $? -ne 0 ]; then echo "Error: Failed to parse affected skills from feed" exit 1 fi

Safely validate all installed skills before processing

Safely validate all installed skills before processing

This prevents shell injection via malicious filenames

This prevents shell injection via malicious filenames

VALIDATED_SKILLS=() while IFS= read -r -d '' skill_path; do skill=$(basename "$skill_path")

Validate skill name BEFORE adding to array (prevents injection)

if [[ "$skill" =~ ^[a-zA-Z0-9_-]+$ ]]; then VALIDATED_SKILLS+=("$skill") else echo "Warning: Skipping invalid skill name: $skill" >&2 fi done < <(find "$INSTALL_DIR" -mindepth 1 -maxdepth 1 -type d -print0 2>/dev/null)
VALIDATED_SKILLS=() while IFS= read -r -d '' skill_path; do skill=$(basename "$skill_path")

Validate skill name BEFORE adding to array (prevents injection)

if [[ "$skill" =~ ^[a-zA-Z0-9_-]+$ ]]; then VALIDATED_SKILLS+=("$skill") else echo "Warning: Skipping invalid skill name: $skill" >&2 fi done < <(find "$INSTALL_DIR" -mindepth 1 -maxdepth 1 -type d -print0 2>/dev/null)

Check each validated skill against affected list

Check each validated skill against affected list

Use grep -qF for fixed string matching (prevents regex injection)

Use grep -qF for fixed string matching (prevents regex injection)

for skill in "${VALIDATED_SKILLS[@]}"; do

At this point, $skill is guaranteed to match ^[a-zA-Z0-9_-]+$

if echo "$AFFECTED" | grep -qF "$skill"; then echo "WARNING: Installed skill '$skill' has a security advisory!" # Get advisory details for this skill echo "$FEED" | jq --arg s "$skill" '.advisories[] | select(.affected[] | contains($s))' fi done

**If you find affected skills:**
1. Check the advisory for details and severity
2. Notify your user immediately for critical/high severity
3. Include the recommended action from the advisory

---
for skill in "${VALIDATED_SKILLS[@]}"; do

At this point, $skill is guaranteed to match ^[a-zA-Z0-9_-]+$

if echo "$AFFECTED" | grep -qF "$skill"; then echo "WARNING: Installed skill '$skill' has a security advisory!" # Get advisory details for this skill echo "$FEED" | jq --arg s "$skill" '.advisories[] | select(.affected[] | contains($s))' fi done

**若发现受影响的Skill:**
1. 查看咨询详情和严重级别
2. 若为严重/高危级别,立即通知用户
3. 包含咨询中建议的操作

---

Advisory Types

咨询类型

TypeDescription
malicious_skill
Skill identified as intentionally harmful
vulnerable_skill
Skill with security vulnerabilities
prompt_injection
Known prompt injection pattern
attack_pattern
Observed attack technique
best_practice
Security recommendation

类型描述
malicious_skill
被识别为恶意的Skill
vulnerable_skill
存在安全漏洞的Skill
prompt_injection
已知的提示注入模式
attack_pattern
已观测到的攻击技术
best_practice
安全建议

Severity Levels

严重级别

SeverityAction Required
critical
Notify user immediately, take action
high
Notify user soon, plan remediation
medium
Notify at next interaction
low
Log for reference

严重级别操作要求
critical
立即通知用户并采取行动
high
尽快通知用户,制定修复计划
medium
在下次交互时通知用户
low
记录留作参考

When to Notify Your User

通知用户的时机

Notify Immediately (Critical):
  • New critical advisory affecting an installed skill
  • Active exploitation detected
Notify Soon (High):
  • New high-severity advisory affecting installed skills
  • Failed to fetch advisory feed (network issue?)
Notify at Next Interaction (Medium):
  • New medium-severity advisories
  • General security updates
Log Only (Low/Info):
  • Low-severity advisories (mention if user asks)
  • Feed checked, no new advisories

立即通知(严重级别):
  • 新的严重级别咨询影响已安装的Skill
  • 检测到正在被利用的漏洞
尽快通知(高危级别):
  • 新的高危级别咨询影响已安装的Skill
  • 无法获取咨询源(网络问题?)
下次交互时通知(中危级别):
  • 新的中危级别咨询
  • 一般性安全更新
仅记录(低危/信息级):
  • 低危级别咨询(用户询问时提及)
  • 已检查咨询源,无新警报

Response Format

响应格式

If there are new advisories:

若有新咨询:

📡 ClawSec Feed: 2 new advisories since last check

CRITICAL - GA-2026-015: Malicious prompt pattern "ignore-all"
  → Detected prompt injection technique. Update your system prompt defenses.

HIGH - GA-2026-016: Vulnerable skill "data-helper" v1.2.0
  → You have this installed! Recommended action: Update to v1.2.1 or remove.
📡 ClawSec Feed: 自上次检查后新增2条咨询

严重级别 - GA-2026-015: 恶意提示模式"ignore-all"
  → 检测到提示注入技术。请更新您的系统提示防御措施。

高危级别 - GA-2026-016: 存在漏洞的Skill "data-helper" v1.2.0
  → 您已安装该Skill!建议操作:更新至v1.2.1或移除。

If nothing new:

若无新咨询:

FEED_OK - Advisory feed checked, no new alerts. 📡

FEED_OK - 已检查咨询源,无新警报。 📡

State Tracking

状态跟踪

Track the last feed check to identify new advisories:
json
{
  "schema_version": "1.0",
  "last_feed_check": "2026-02-02T15:00:00Z",
  "last_feed_updated": "2026-02-02T12:00:00Z",
  "known_advisories": ["GA-2026-001", "GA-2026-002"]
}
Save to:
~/.openclaw/clawsec-feed-state.json
跟踪上次检查源的时间,以识别新咨询:
json
{
  "schema_version": "1.0",
  "last_feed_check": "2026-02-02T15:00:00Z",
  "last_feed_updated": "2026-02-02T12:00:00Z",
  "known_advisories": ["GA-2026-001", "GA-2026-002"]
}
保存至:
~/.openclaw/clawsec-feed-state.json

State File Operations

状态文件操作

bash
STATE_FILE="$HOME/.openclaw/clawsec-feed-state.json"
bash
STATE_FILE="$HOME/.openclaw/clawsec-feed-state.json"

Create state file with secure permissions if it doesn't exist

Create state file with secure permissions if it doesn't exist

if [ ! -f "$STATE_FILE" ]; then echo '{"schema_version":"1.0","last_feed_check":null,"last_feed_updated":null,"known_advisories":[]}' > "$STATE_FILE" chmod 600 "$STATE_FILE" fi
if [ ! -f "$STATE_FILE" ]; then echo '{"schema_version":"1.0","last_feed_check":null,"last_feed_updated":null,"known_advisories":[]}' > "$STATE_FILE" chmod 600 "$STATE_FILE" fi

Validate state file before reading

Validate state file before reading

if ! jq -e '.schema_version' "$STATE_FILE" >/dev/null 2>&1; then echo "Warning: State file corrupted or invalid schema. Creating backup and resetting." cp "$STATE_FILE" "${STATE_FILE}.bak.$(TZ=UTC date +%Y%m%d%H%M%S)" echo '{"schema_version":"1.0","last_feed_check":null,"last_feed_updated":null,"known_advisories":[]}' > "$STATE_FILE" chmod 600 "$STATE_FILE" fi
if ! jq -e '.schema_version' "$STATE_FILE" >/dev/null 2>&1; then echo "Warning: State file corrupted or invalid schema. Creating backup and resetting." cp "$STATE_FILE" "${STATE_FILE}.bak.$(TZ=UTC date +%Y%m%d%H%M%S)" echo '{"schema_version":"1.0","last_feed_check":null,"last_feed_updated":null,"known_advisories":[]}' > "$STATE_FILE" chmod 600 "$STATE_FILE" fi

Check for major version compatibility

Check for major version compatibility

SCHEMA_VER=$(jq -r '.schema_version // "0"' "$STATE_FILE") if [[ "${SCHEMA_VER%%.*}" != "1" ]]; then echo "Warning: State file schema version $SCHEMA_VER may not be compatible with this version" fi
SCHEMA_VER=$(jq -r '.schema_version // "0"' "$STATE_FILE") if [[ "${SCHEMA_VER%%.*}" != "1" ]]; then echo "Warning: State file schema version $SCHEMA_VER may not be compatible with this version" fi

Update last check time (always use UTC)

Update last check time (always use UTC)

TEMP_STATE=$(mktemp) if jq --arg t "$(TZ=UTC date +%Y-%m-%dT%H:%M:%SZ)" '.last_feed_check = $t' "$STATE_FILE" > "$TEMP_STATE"; then mv "$TEMP_STATE" "$STATE_FILE" chmod 600 "$STATE_FILE" else echo "Error: Failed to update state file" rm -f "$TEMP_STATE" fi

---
TEMP_STATE=$(mktemp) if jq --arg t "$(TZ=UTC date +%Y-%m-%dT%H:%M:%SZ)" '.last_feed_check = $t' "$STATE_FILE" > "$TEMP_STATE"; then mv "$TEMP_STATE" "$STATE_FILE" chmod 600 "$STATE_FILE" else echo "Error: Failed to update state file" rm -f "$TEMP_STATE" fi

---

Rate Limiting

请求频率限制

Important: To avoid excessive requests to the feed server, follow these guidelines:
Check TypeRecommended IntervalMinimum Interval
Heartbeat checkEvery 15-30 minutes5 minutes
Full feed refreshEvery 1-4 hours30 minutes
Cross-reference scanOnce per session5 minutes
bash
undefined
重要提示: 为避免对源服务器发起过多请求,请遵循以下准则:
检查类型推荐间隔最小间隔
心跳检查每15-30分钟5分钟
完整源刷新每1-4小时30分钟
交叉引用扫描每次会话1次5分钟
bash
undefined

Check if enough time has passed since last check

Check if enough time has passed since last check

STATE_FILE="$HOME/.openclaw/clawsec-feed-state.json" MIN_INTERVAL_SECONDS=300 # 5 minutes
LAST_CHECK=$(jq -r '.last_feed_check // "1970-01-01T00:00:00Z"' "$STATE_FILE" 2>/dev/null) LAST_EPOCH=$(TZ=UTC date -j -f "%Y-%m-%dT%H:%M:%SZ" "$LAST_CHECK" +%s 2>/dev/null || date -d "$LAST_CHECK" +%s 2>/dev/null || echo 0) NOW_EPOCH=$(TZ=UTC date +%s)
if [ $((NOW_EPOCH - LAST_EPOCH)) -lt $MIN_INTERVAL_SECONDS ]; then echo "Rate limit: Last check was less than 5 minutes ago. Skipping." exit 0 fi

---
STATE_FILE="$HOME/.openclaw/clawsec-feed-state.json" MIN_INTERVAL_SECONDS=300 # 5 minutes
LAST_CHECK=$(jq -r '.last_feed_check // "1970-01-01T00:00:00Z"' "$STATE_FILE" 2>/dev/null) LAST_EPOCH=$(TZ=UTC date -j -f "%Y-%m-%dT%H:%M:%SZ" "$LAST_CHECK" +%s 2>/dev/null || date -d "$LAST_CHECK" +%s 2>/dev/null || echo 0) NOW_EPOCH=$(TZ=UTC date +%s)
if [ $((NOW_EPOCH - LAST_EPOCH)) -lt $MIN_INTERVAL_SECONDS ]; then echo "Rate limit: Last check was less than 5 minutes ago. Skipping." exit 0 fi

---

Environment Variables (Optional)

环境变量(可选)

VariableDescriptionDefault
CLAWSEC_FEED_URL
Custom advisory feed URLRaw GitHub (
main
branch)
CLAWSEC_INSTALL_DIR
Installation directory
~/.openclaw/skills/clawsec-feed

变量描述默认值
CLAWSEC_FEED_URL
自定义咨询源URLGitHub原始文件(
main
分支)
CLAWSEC_INSTALL_DIR
安装目录
~/.openclaw/skills/clawsec-feed

Updating ClawSec Feed

更新ClawSec Feed

Check for and install newer versions:
bash
undefined
检查并安装新版本:
bash
undefined

Check current installed version

Check current installed version

INSTALL_DIR="${CLAWSEC_INSTALL_DIR:-$HOME/.openclaw/skills/clawsec-feed}" CURRENT_VERSION=$(jq -r '.version' "$INSTALL_DIR/skill.json" 2>/dev/null || echo "unknown") echo "Installed version: $CURRENT_VERSION"
INSTALL_DIR="${CLAWSEC_INSTALL_DIR:-$HOME/.openclaw/skills/clawsec-feed}" CURRENT_VERSION=$(jq -r '.version' "$INSTALL_DIR/skill.json" 2>/dev/null || echo "unknown") echo "Installed version: $CURRENT_VERSION"

Check latest available version

Check latest available version

LATEST_URL="https://api.github.com/repos/prompt-security/ClawSec/releases" LATEST_VERSION=$(curl -sSL --fail --show-error --retry 3 --retry-delay 1 "$LATEST_URL" 2>/dev/null |
jq -r '[.[] | select(.tag_name | startswith("clawsec-feed-v"))][0].tag_name // empty' |
sed 's/clawsec-feed-v//')
if [ -z "$LATEST_VERSION" ]; then echo "Warning: Could not determine latest version" else echo "Latest version: $LATEST_VERSION"
if [ "$CURRENT_VERSION" != "$LATEST_VERSION" ]; then echo "Update available! Run the deployment steps with the new version." else echo "You are running the latest version." fi fi

---
LATEST_URL="https://api.github.com/repos/prompt-security/ClawSec/releases" LATEST_VERSION=$(curl -sSL --fail --show-error --retry 3 --retry-delay 1 "$LATEST_URL" 2>/dev/null |
jq -r '[.[] | select(.tag_name | startswith("clawsec-feed-v"))][0].tag_name // empty' |
sed 's/clawsec-feed-v//')
if [ -z "$LATEST_VERSION" ]; then echo "Warning: Could not determine latest version" else echo "Latest version: $LATEST_VERSION"
if [ "$CURRENT_VERSION" != "$LATEST_VERSION" ]; then echo "Update available! Run the deployment steps with the new version." else echo "You are running the latest version." fi fi

---

Initial Download Integrity

初始下载完整性

Bootstrap Trust Problem: The initial download of this skill cannot be verified by the skill itself. To establish trust:
  1. Verify the source URL - Ensure you are downloading from
    https://clawsec.prompt.security
  2. Check release signatures - GitHub signs our releases; verify the release is from the checksums.
  3. Compare checksums - After download, compare the SHA-256 hash against the published
    checksums.json
    :
bash
undefined
引导信任问题: 该Skill的初始下载无法通过Skill自身验证。要建立信任,请执行以下操作:
  1. 验证源URL - 确保您从
    https://clawsec.prompt.security
    下载
  2. 检查发布签名 - GitHub会为我们的发布签名;请验证发布与校验和一致
  3. 对比校验和 - 下载后,将SHA-256哈希值与发布的
    checksums.json
    中的值对比:
bash
undefined

After downloading SKILL.md, verify its integrity

After downloading SKILL.md, verify its integrity

EXPECTED_HASH="<hash-from-checksums.json>" ACTUAL_HASH=$(shasum -a 256 SKILL.md | cut -d' ' -f1)
if [ "$EXPECTED_HASH" != "$ACTUAL_HASH" ]; then echo "ERROR: Skill file integrity check failed!" echo "This file may have been tampered with. Do not proceed." exit 1 fi

**Note:** For maximum security, verify checksums.json via a separate trusted channel (e.g., direct from GitHub release page UI, not via curl).

---
EXPECTED_HASH="<hash-from-checksums.json>" ACTUAL_HASH=$(shasum -a 256 SKILL.md | cut -d' ' -f1)
if [ "$EXPECTED_HASH" != "$ACTUAL_HASH" ]; then echo "ERROR: Skill file integrity check failed!" echo "This file may have been tampered with. Do not proceed." exit 1 fi

**注意:** 为了最大化安全性,请通过独立的可信渠道验证checksums.json(例如,直接从GitHub发布页面UI查看,而非通过curl)。

---

Related Skills

相关Skill

  • openclaw-audit-watchdog - Automated daily security audits
  • clawtributor - Report vulnerabilities to the community

  • openclaw-audit-watchdog - 自动化每日安全审计
  • clawtributor - 向社区报告漏洞

License

许可证

MIT License - See repository for details.
Built with 📡 by the Prompt Security team and the agent community.
MIT许可证 - 详见仓库说明。
Prompt Security团队和Agent社区共同打造 📡。