clawsec-feed について
AI エージェント向けのセキュリティアドバイザリ監視スキルです。既定のフィードには NVD CVE、コミュニティのアドバイザリ、一部の GitHub Security Advisories が含まれ、深刻度や悪用可能性による絞り込みとインストール済みスキルとの照合ができます。
主な機能
- 01コミュニティのセキュリティフィードを監視
- 02悪意あるスキル、脆弱性、攻撃パターンを収録
- 03深刻度と悪用可能性で優先順位付け
- 04インストール済みスキルとアドバイザリを照合
活用シーン
- 01新しいアドバイザリの定期確認
- 02影響を受けるインストール済みスキルの特定
- 03悪用可能性の高い脅威の優先対応
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ prompt-security/ clawsec --skill clawsec-feedインストール後、Claude Code で/clawsec-feedを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
.clawhubignoreCHANGELOG.mdREADME.mdskill.jsonadvisories/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"
悪用可能性スコアで絞り込む
悪用可能性の優先順位付けに関する共通のガイダンスは、以下で管理されています。
wiki/exploitability-scoring.mdskills/clawsec-suite/SKILL.md(「フィードのクイックチェック」)
アドバイザリの悪用可能性に関するコンテキストを取得する
# 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
影響を受けるスキルが見つかった場合:
- アドバイザリで詳細と深刻度を確認します
- 深刻度が重大または高の場合は、直ちにユーザーに通知します
- アドバイザリで推奨されている対応を含めます
アドバイザリの種類
| 種類 | 説明 |
|---|---|
malicious_skill | 意図的に有害なものとして特定されたスキル |
vulnerable_skill | セキュリティ上の脆弱性があるスキル |
prompt_injection | 既知のプロンプトインジェクションパターン |
attack_pattern | 観測された攻撃手法 |
best_practice | セキュリティに関する推奨事項 |
深刻度レベル
| 深刻度 | 必要な対応 |
|---|---|
critical | 直ちにユーザーに通知し、対応します |
high | 速やかにユーザーに通知し、修正計画を立てます |
medium | 次回のやり取りで通知します |
low | 参照用に記録します |
悪用可能性の高い脅威に優先順位を付ける
重要: アドバイザリを確認する際は、深刻度に加えて、必ず悪用可能性スコアに基づいて優先順位を付けてください。悪用可能性スコアは、脆弱性が実際にどれほど簡単に悪用されるかを示し、対応の必要性が最も高い脅威に集中するのに役立ちます。
悪用可能性の優先度レベル
| 悪用可能性 | 意味 | 対応の優先度 |
|---|---|---|
high | 公開されているツールを使って、非常に簡単に、または容易に悪用できます | 直ちに通知 |
medium | 悪用可能ですが、特定の条件が必要です | 通常の通知 |
low | 悪用が困難、または理論上のものです | 低優先度の通知 |
通知で悪用可能性を活用する方法
-
まず悪用可能性の高いものに絞り込みます:
# Get high exploitability advisories echo "$FEED" | jq '.advisories[] | select(.exploitability_score == "high")' -
通知に悪用可能性を含めます:
📡 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 -
深刻度と悪用可能性の両方で優先順位を付けます:
- 深刻度が高く、悪用可能性も高い CVE は、深刻度が重大でも悪用可能性が低い CVE より緊急性が高くなります
- 深刻で、かつ容易に悪用できる脅威にユーザーの注意を向けます
- ユーザーがリスクの背景を理解できるよう、悪用可能性の根拠を含めます
通知の優先順位の例
複数のアドバイザリがある場合は、次の順序で提示します。
- 深刻度:重大 + 悪用可能性:高 - 最も緊急
- 深刻度:高 + 悪用可能性:高
- 深刻度:重大 + 悪用可能性:中/低
- 深刻度:高 + 悪用可能性:中/低
- 深刻度:中/低(悪用可能性を問わない)
これにより、対応の必要性が高く、直ちに危険をもたらす脅威から先にユーザーへ警告できます。
ユーザーへの通知タイミング
直ちに通知(重大):
- インストール済みスキルに影響する、新たな重大アドバイザリ
- 現在進行中の悪用を検知した場合
- 悪用可能性スコアが高い場合(深刻度を問わない)
速やかに通知(高):
- インストール済みスキルに影響する、新たな深刻度の高いアドバイザリ
- アドバイザリフィードの取得に失敗した場合(ネットワークの問題でしょうか?)
- 深刻度が高く、悪用可能性が中程度の場合
次回のやり取りで通知(中):
- 新たな深刻度が中程度のアドバイザリ
- セキュリティに関する一般的な更新
- 悪用可能性の低いアドバイザリ
記録のみ(低/情報):
- 深刻度の低いアドバイザリ(ユーザーから尋ねられた場合に言及)
- フィードを確認した結果、新しいアドバイザリがなかった場合
- 理論上の脆弱性(悪用可能性が低く、深刻度も低い)
応答形式
新しいアドバイザリがある場合:
📡 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
初回ダウンロードの整合性
ブートストラップ時の信頼の問題: このスキルの初回ダウンロードは、スキル自体では検証できません。信頼を確立するには、次の手順に従ってください。
- ソース URL を確認する -
https://clawsec.prompt.securityからダウンロードしていることを確認します - リリース署名を確認する - GitHub はリリースに署名しています。リリースがチェックサムからのものであることを検証してください。
- チェックサムを比較する - ダウンロード後、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 チームとエージェントコミュニティが 📡 を使って作成しました。