mcpField
C
clawsec-feed

clawsec-feed

github.com/prompt-securityセキュリティ1.1k240 回インストール今日更新
リポジトリ

clawsec-feed について

AI エージェント向けのセキュリティアドバイザリ監視スキルです。既定のフィードには NVD CVE、コミュニティのアドバイザリ、一部の GitHub Security Advisories が含まれ、深刻度や悪用可能性による絞り込みとインストール済みスキルとの照合ができます。

主な機能

  1. 01コミュニティのセキュリティフィードを監視
  2. 02悪意あるスキル、脆弱性、攻撃パターンを収録
  3. 03深刻度と悪用可能性で優先順位付け
  4. 04インストール済みスキルとアドバイザリを照合

活用シーン

  1. 01新しいアドバイザリの定期確認
  2. 02影響を受けるインストール済みスキルの特定
  3. 03悪用可能性の高い脅威の優先対応

インストール

コマンドをコピーしてターミナルで実行します。

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

インストール後、Claude Code で/clawsec-feedを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

.clawhubignore
CHANGELOG.md
README.md
skill.json
advisories/
feed.json.sig

詳細

ClawSec Feed 📡

AI エージェント向けのセキュリティアドバイザリーフィード監視機能です。コミュニティ主導の脅威インテリジェンスを購読して、新たな脅威の情報を入手しましょう。

デフォルトの feed.json は、統合されたエージェントフィードです。NVD CVE、承認済みのコミュニティアドバイザリー、およびまだ CVE ID が付与されていない暫定的な GitHub Security Advisory が含まれています。

Vercel Skills のインストール

このハーネスには、Vercel Skills CLI を使ってインストールします。

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

運用上の注意事項

  • スタンドアロンインストールで必要なランタイム:bash、curl、jq、shasum、unzip
  • 副作用:スタンドアロンインストールではローカルのスキルファイルのみが書き込まれます
  • ネットワーク動作:リリースメタデータ/成果物をダウンロードします。また、手動でポーリングする場合はアドバイザリーフィードを取得します
  • 信頼モデル:このパッケージ自体は cron ジョブの作成や外部へのデータ送信を行いません。自動化は clawsec-suite または独自のスケジューラーに委任されます

Prompt Security によるオープンソースプロジェクト


インストール方法

clawsec-feed を入手する方法は 2 つあります。

オプション A:ClawSec Suite に同梱(推奨)

clawsec-suite をインストール済みの場合、すでにこの機能を利用できる可能性があります。

ClawSec-feed は、重要な CVE および脅威インテリジェンス情報を提供するため、ClawSec Suite に同梱されています。Suite をインストールすると、フィードがまだインストールされていない場合は、同梱されたコピーからデプロイされます。

メリット:

  • 便利:個別にダウンロードする必要がありません
  • 標準の場所:~/.openclaw/skills/clawsec-feed/ にインストールされます
  • 保護:すでにフィードがインストールされている場合、上書きされません
  • 検証は 1 回:Suite パッケージの一部として整合性が確認されます
オプション B:スタンドアロンインストール(このページ)

Suite 全体をインストールせずに、clawsec-feed を個別にインストールします。

スタンドアロンを使用する場合:

  • アドバイザリーフィードだけが必要な場合(Suite の他のコンポーネントは不要)
  • Suite のインストール前にインストールしたい場合
  • フィードのインストールを明示的に制御したい場合

メリット:

  • 軽量なインストール
  • Suite から独立
  • インストールプロセスを直接制御可能

スタンドアロンインストールの手順は以下をご覧ください。

スタンドアロンインストールは、ネットワーク経由でダウンロードするワークフローです。本番ホストにインストールする前に、リリースの提供元と提示されたチェックサムを検証してください。


インストール手順: エージェントは実行前にスクリプトを確認してください!

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

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

このスキルファイルを入手したら、以下の ClawSec Feed のデプロイ に進んでください。


リリース成果物の検証

スタンドアロンインストールの場合は、SKILL.md、skill.json、またはアーカイブを信頼する前に、署名済みのリリースマニフェストを検証してください。skill.json ファイルはパッケージのメタデータ/SBOM のソースであり、リリースパイプラインは ClawSec リリースキーを使って checksums.json に署名します。

set -euo pipefail

SKILL_NAME="clawsec-feed"
VERSION="0.0.11"
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."

この検証が成功した後にのみ、アーカイブをインストールまたは展開してください。

ClawSec Feed のデプロイ

インストール手順:

ステップ 1:スキルディレクトリを作成し、このファイルを保存する
mkdir -p ~/.openclaw/skills/clawsec-feed
# Save this SKILL.md as SKILL.md in the directory above
ステップ 2:スキルファイルをインストールする
# 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

# 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

# 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

# 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

# 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

# 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

# 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"
ステップ 3:ハートビートに追加する

ハートビートのルーチンに ClawSec Feed を追加します。

## 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
ステップ 4:デプロイを確認する

ユーザーに次のように伝えます。

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 の機能

アドバイザリーフィードの監視

コミュニティのアドバイザリーフィードを購読し、次の情報を確認します。

  • 既知の悪意あるスキル/プラグイン - 有害であると特定されたスキル
  • プロンプトインジェクションのパターン - 実環境で確認された攻撃パターン
  • 脆弱なスキルのバージョン - 既知のセキュリティ上の欠陥があるスキル
  • セキュリティのベストプラクティスの更新 - エージェントの安全性に関する新たな推奨事項

関連するアドバイザリーが公開されると、エージェントから通知されます。


アドバイザリーフィードの確認

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

# Fetch with error handling and retry logic
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": "Malicious data exfiltration in skill 'helper-plus'",
      "description": "Skill sends user data to external server",
      "affected": ["[email protected]", "[email protected]"],
      "action": "Remove immediately",
      "published": "2026-02-01T10:00:00Z",
      "exploitability_score": "critical",
      "exploitability_rationale": "Trivially exploitable through normal skill usage; no special conditions required. Active exploitation observed in the wild."
    }
  ]
}

フィードの解析

アドバイザリーの件数を取得する
# 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

# 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")

# 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"
重大なアドバイザリーを取得する
# 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"
過去 7 日間のアドバイザリーを取得する
# 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"
悪用可能性スコアで絞り込む

悪用可能性の優先順位付けに関する共通のガイダンスは、以下で管理されています。

アドバイザリの悪用可能性に関するコンテキストを取得する
# Show exploitability details for a specific CVE
CVE_ID="CVE-2026-27488"
echo "$FEED" | jq --arg cve "$CVE_ID" '.advisories[] | select(.id == $cve) | {
  id: .id,
  severity: .severity,
  exploitability_score: .exploitability_score,
  exploitability_rationale: .exploitability_rationale,
  title: .title
}'
アドバイザリを悪用可能性で優先順位付けする
# Sort advisories by exploitability (critical → high → medium → low)
# This helps agents focus on the most immediately actionable threats
echo "$FEED" | jq '[.advisories[] | select(.exploitability_score != null)] |
  sort_by(
    if .exploitability_score == "critical" then 0
    elif .exploitability_score == "high" then 1
    elif .exploitability_score == "medium" then 2
    elif .exploitability_score == "low" then 3
    else 4 end
  )'

インストール済みスキルを相互参照する

インストール済みスキルがアドバイザリの影響を受けていないか確認します。

# List your installed skills (adjust path for your platform)
INSTALL_DIR="${CLAWSEC_INSTALL_DIR:-$HOME/.openclaw/skills}"

# 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

# 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

# Safely validate all installed skills before processing
# 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)

# Check each validated skill against affected list
# 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

影響を受けるスキルが見つかった場合:

  1. アドバイザリで詳細と深刻度を確認します
  2. 深刻度が重大または高の場合は、直ちにユーザーに通知します
  3. アドバイザリで推奨されている対応を含めます

アドバイザリの種類

種類説明
malicious_skill意図的に有害なものとして特定されたスキル
vulnerable_skillセキュリティ上の脆弱性があるスキル
prompt_injection既知のプロンプトインジェクションパターン
attack_pattern観測された攻撃手法
best_practiceセキュリティに関する推奨事項

深刻度レベル

深刻度必要な対応
critical直ちにユーザーに通知し、対応します
high速やかにユーザーに通知し、修正計画を立てます
medium次回のやり取りで通知します
low参照用に記録します

悪用可能性の高い脅威に優先順位を付ける

重要: アドバイザリを確認する際は、深刻度に加えて、必ず悪用可能性スコアに基づいて優先順位を付けてください。悪用可能性スコアは、脆弱性が実際にどれほど簡単に悪用されるかを示し、対応の必要性が最も高い脅威に集中するのに役立ちます。

悪用可能性の優先度レベル
悪用可能性意味対応の優先度
high公開されているツールを使って、非常に簡単に、または容易に悪用できます直ちに通知
medium悪用可能ですが、特定の条件が必要です通常の通知
low悪用が困難、または理論上のものです低優先度の通知
通知で悪用可能性を活用する方法
  1. まず悪用可能性の高いものに絞り込みます:

    # Get high exploitability advisories
    echo "$FEED" | jq '.advisories[] | select(.exploitability_score == "high")'
    
  2. 通知に悪用可能性を含めます:

    📡 ClawSec Feed: High-exploitability alert
    
    CRITICAL - CVE-2026-27488 (Exploitability: HIGH)
      → Trivially exploitable RCE in skill-loader v2.1.0
      → Public exploit code available
      → Recommended action: Immediate removal or upgrade to v2.1.1
    
  3. 深刻度と悪用可能性の両方で優先順位を付けます:

    • 深刻度が高く、悪用可能性も高い CVE は、深刻度が重大でも悪用可能性が低い CVE より緊急性が高くなります
    • 深刻で、かつ容易に悪用できる脅威にユーザーの注意を向けます
    • ユーザーがリスクの背景を理解できるよう、悪用可能性の根拠を含めます
通知の優先順位の例

複数のアドバイザリがある場合は、次の順序で提示します。

  1. 深刻度:重大 + 悪用可能性:高 - 最も緊急
  2. 深刻度:高 + 悪用可能性:高
  3. 深刻度:重大 + 悪用可能性:中/低
  4. 深刻度:高 + 悪用可能性:中/低
  5. 深刻度:中/低(悪用可能性を問わない)

これにより、対応の必要性が高く、直ちに危険をもたらす脅威から先にユーザーへ警告できます。


ユーザーへの通知タイミング

直ちに通知(重大):

  • インストール済みスキルに影響する、新たな重大アドバイザリ
  • 現在進行中の悪用を検知した場合
  • 悪用可能性スコアが高い場合(深刻度を問わない)

速やかに通知(高):

  • インストール済みスキルに影響する、新たな深刻度の高いアドバイザリ
  • アドバイザリフィードの取得に失敗した場合(ネットワークの問題でしょうか?)
  • 深刻度が高く、悪用可能性が中程度の場合

次回のやり取りで通知(中):

  • 新たな深刻度が中程度のアドバイザリ
  • セキュリティに関する一般的な更新
  • 悪用可能性の低いアドバイザリ

記録のみ(低/情報):

  • 深刻度の低いアドバイザリ(ユーザーから尋ねられた場合に言及)
  • フィードを確認した結果、新しいアドバイザリがなかった場合
  • 理論上の脆弱性(悪用可能性が低く、深刻度も低い)

応答形式

新しいアドバイザリがある場合:
📡 ClawSec Feed: 2 new advisories since last check

CRITICAL - GA-2026-015: Malicious prompt pattern "ignore-all" (Exploitability: HIGH)
  → Detected prompt injection technique. Update your system prompt defenses.
  → Exploitability: Easily exploitable with publicly documented techniques.

HIGH - GA-2026-016: Vulnerable skill "data-helper" v1.2.0 (Exploitability: MEDIUM)
  → You have this installed! Recommended action: Update to v1.2.1 or remove.
  → Exploitability: Requires specific configuration; not trivially exploitable.
新しいアドバイザリがない場合:
FEED_OK - Advisory feed checked, no new alerts. 📡

状態の追跡

新しいアドバイザリを特定できるよう、フィードを最後に確認した時刻を追跡します。

{
  "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="$HOME/.openclaw/clawsec-feed-state.json"

# 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

# 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

# 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

# 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

レート制限

重要: フィードサーバーへの過剰なリクエストを避けるため、次のガイドラインに従ってください。

チェックの種類推奨間隔最小間隔
ハートビートチェック15~30分ごと5分
フィード全体の更新1~4時間ごと30分
相互参照スキャンセッションごとに1回5分
# 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

環境変数(任意)

変数説明デフォルト
CLAWSEC_FEED_URLカスタムアドバイザリフィードの URL統合署名フィード
CLAWSEC_INSTALL_DIRインストールディレクトリ~/.openclaw/skills/clawsec-feed

ClawSec Feed の更新

新しいバージョンを確認してインストールします。

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

# 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

初回ダウンロードの整合性

ブートストラップ時の信頼の問題: このスキルの初回ダウンロードは、スキル自体では検証できません。信頼を確立するには、次の手順に従ってください。

  1. ソース URL を確認する - https://clawsec.prompt.security からダウンロードしていることを確認します
  2. リリース署名を確認する - GitHub はリリースに署名しています。リリースがチェックサムからのものであることを検証してください。
  3. チェックサムを比較する - ダウンロード後、SHA-256 ハッシュを公開されている checksums.json と比較します。
# 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

注: 最大限のセキュリティを確保するには、別の信頼できるチャネル(例:curl 経由ではなく、GitHub のリリースページ UI から直接)で checksums.json を検証してください。


関連スキル

  • openclaw-audit-watchdog - 毎日のセキュリティ監査を自動化します
  • clawtributor - コミュニティに脆弱性を報告します

ライセンス

GNU AGPL v3.0 以降 - 詳細はリポジトリをご覧ください。

Prompt Security チームとエージェントコミュニティが 📡 を使って作成しました。

コメント