slug: security-radar name: security-radar version: "1.0.0" displayName: 安全情報雷達 summary: 聚合多源漏洞情報並按資產關聯排序,告別告警疲勞,只推真正影響你的威脅。 license: MIT description: |- 安全情報雷達為 AI Agent 提供智慧化的漏洞與威脅情報訂閱能力。它聚合 NVD CVE、GitHub Security Advisory、社群惡意技能通報等多源資料,並按資產關聯度與可利用性雙重排序,把每天數十上百條告警壓縮到只剩必須處理的兩三條。
核心能力:多源情報聚合(CVE/GHSA/惡意技能)、資產清單自動關聯、可利用性優先順序評分、增量去重推送、離線降級與快取、嚴格速率限制。
適用場景:Agent 心跳巡檢、CI 流水線依賴掃描、技能市場安全門禁、個人開發者漏洞訂閱、團隊安全日報生成。
差異化:相比只做"下載 feed 並展示"的原始方案,本技能新增資產關聯過濾(只推送影響已安裝技能/依賴的告警)、雙維度優先順序矩陣(嚴重度×可利用性)、增量狀態機(避免重複推送)、離線快取降級(網路故障時用上次快照)、以及分級通知策略(critical 即時推送、low 靜默歸檔)。
觸發關鍵詞:安全, 漏洞, CVE, 情報, 告警, 訂閱, advisory, vulnerability, threat, security, radar, feed tags: - 自動化 - 安全 - 情報訂閱 tools: - read - exec
把海量漏洞情報變成只推兩三條真正相關的告警。本技能解決三個核心問題:告警疲勞(59% 安全人員每天被海量告警淹沒)、優先順序混亂(嚴重度高的不一定緊急)、資產盲區(不知道哪些 CVE 真正影響自己)。
資產清單是過濾的基礎。把已安裝的技能、依賴、執行時版本寫入清單檔案:
mkdir -p ~/.skill-platform/security-radar
cat > ~/.skill-platform/security-radar/assets.json <<'EOF'
{
"schema_version": "1.0",
"updated": "2026-07-18T00:00:00Z",
"skills": [
{"name": "pdf-toolkit", "version": "1.2.0", "source": "marketplace"},
{"name": "excel-writer", "version": "0.9.1", "source": "marketplace"}
],
"dependencies": [
{"name": "pdfplumber", "version": "0.11.0", "ecosystem": "pypi"},
{"name": "pyautogui", "version": "0.9.54", "ecosystem": "pypi"}
],
"runtimes": [
{"name": "python", "version": "3.11.4"},
{"name": "node", "version": "20.10.0"}
]
}
EOF
chmod 600 ~/.skill-platform/security-radar/assets.json
也可用自動掃描生成(見下文「資產清單自動維護」)。
bash ~/.skill-platform/security-radar/scan.sh --init
首次執行會把當前所有已知告警寫入基線,不觸發推送,避免歷史告警一次性轟炸。
在 Agent 心跳例程中呼叫:
bash ~/.skill-platform/security-radar/scan.sh
僅當出現新的、關聯到資產、且優先順序達標的告警時才輸出通知;否則輸出 RADAR_OK。
| 情報源 | 端點 | 說明 |
|---|---|---|
| 社群聚合 Feed | 由 RADAR_FEED_URL 配置(預設社群源) |
含惡意技能/注入模式/最佳實踐 |
| NVD CVE | https://services.nvd.nist.gov/rest/json/cves/2.0 |
官方 CVE 詳情(可選,需 API Key 提高速率) |
| GitHub Security Advisory | https://api.github.com/advisories |
依賴漏洞(GHSA) |
通過環境變數切換或追加源:
# 配置你的社群聚合 feed 地址(支援任意相容格式 JSON feed 的源)
export RADAR_FEED_URL="https://your-feed-mirror.example.com/feed.json"
export RADAR_EXTRA_SOURCES="ghsa,nvd" # 逗號分隔
export RADAR_NVD_API_KEY="nvdk-xxxx" # 可選,提升 NVD 速率限制
注:預設社群源地址請通過
RADAR_FEED_URL環境變數配置,指向你所信任的相容格式 feed。本技能不繫結特定上游倉庫。
{
"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",
"exploitability_score": "critical",
"exploitability_rationale": "Trivially exploitable through normal skill usage."
}
]
}
原始方案只按 severity 排序,導致"嚴重但難利用"的告警淹沒"高危且在野利用"的告警。本技能採用雙維度矩陣:
| 可利用性 HIGH | 可利用性 MEDIUM | 可利用性 LOW | |
|---|---|---|---|
| 嚴重度 critical | P0 即時推送 | P1 儘快推送 | P2 歸檔備查 |
| 嚴重度 high | P1 儘快推送 | P2 歸檔備查 | P3 靜默記錄 |
| 嚴重度 medium/low | P2 歸檔備查 | P3 靜默記錄 | P3 靜默記錄 |
推送規則:僅 P0/P1 主動通知使用者;P2/P3 寫入日誌,使用者詢問時再呈現。
排序實現(jq):
# 按優先順序矩陣排序
jq '[.advisories[] | {
id, title, severity, exploitability_score,
priority: (
if .severity == "critical" and .exploitability_score == "critical" then "P0"
elif .severity == "critical" and .exploitability_score == "high" then "P1"
elif .severity == "high" and .exploitability_score == "high" then "P1"
elif .severity == "critical" then "P2"
elif .severity == "high" then "P2"
else "P3" end)
}] | sort_by(.priority)'
對每條告警,檢查其 affected 列表是否命中資產清單:
# 提取資產清單中的 name@version 集合
ASSETS=$(jq -r '[.skills[], .dependencies[]] | "\(."name")@\(."version")"' assets.json | sort -u)
# 提取告警 affected 列表
AFFECTED=$(jq -r '.advisories[].affected[]?' feed.json | sort -u)
# 求交集
COMMUNAL=$(comm -12 <(echo "$ASSETS") <(echo "$AFFECTED"))
手動維護清單容易遺漏。提供自動掃描指令碼:
# 掃描已安裝技能目錄
SCAN_DIR="${RADAR_SKILLS_DIR:-$HOME/.skill-platform/skills}"
jq -n --arg dir "$SCAN_DIR" '{
schema_version: "1.0",
updated: (now | todate),
skills: (
[$dir] | map(. as $d | [
(input_filename // empty)
]) | flatten
)
}'
實際實現中,指令碼會遍歷技能目錄讀取各 skill.json 的 name 與 version,並嘗試從 requirements.txt/package.json 提取依賴。
狀態檔案:~/.skill-platform/security-radar/state.json
{
"schema_version": "1.0",
"last_check": "2026-07-18T08:00:00Z",
"last_feed_updated": "2026-07-18T07:30:00Z",
"known_advisories": ["GA-2026-001", "GA-2026-002", "CVE-2026-27488"],
"baseline_established": true,
"consecutive_failures": 0,
"cache_snapshot": "/path/to/last-feed.json"
}
增量邏輯:每次拉取後,用 known_advisories 做差集,只處理新增 ID。處理完成後把新 ID 合併進 known_advisories。
STATE_FILE="$HOME/.skill-platform/security-radar/state.json"
FEED_FILE="$HOME/.skill-platform/security-radar/cache/feed.json"
# 已知告警集合
KNOWN=$(jq -r '.known_advisories[]?' "$STATE_FILE" | sort -u)
# 當前告警集合
CURRENT=$(jq -r '.advisories[].id' "$FEED_FILE" | sort -u)
# 新增 = 當前 - 已知
NEW=$(comm -23 <(echo "$CURRENT") <(echo "$KNOWN"))
if [ -z "$NEW" ]; then
echo "RADAR_OK - 無新增告警"
exit 0
fi
網路故障時不應阻塞巡檢。降級策略:
cache/feed.json 是否存在。[離線快照 <時間>]。RADAR_DEGRADED - 無法獲取情報且無快取,不報錯退出。consecutive_failures,超過 5 次在下次成功時提醒使用者檢查網路。fetch_feed() {
local url="$1" out="$2"
if curl -sSL --fail --retry 3 --retry-delay 2 --max-time 15 "$url" -o "$out" 2>/dev/null; then
jq empty "$out" 2>/dev/null && return 0
fi
return 1
}
if ! fetch_feed "$FEED_URL" "$FEED_FILE"; then
if [ -f "$FEED_FILE" ] && jq empty "$FEED_FILE" 2>/dev/null; then
echo "RADAR_DEGRADED - 使用離線快照: $(stat -c%y "$FEED_FILE" 2>/dev/null || stat -f%Sm "$FEED_FILE")"
else
echo "RADAR_DEGRADED - 無可用情報源"
exit 0
fi
fi
| 檢查型別 | 建議間隔 | 最小間隔 |
|---|---|---|
| 心跳巡檢 | 15-30 分鐘 | 5 分鐘 |
| 全量重新整理 | 1-4 小時 | 30 分鐘 |
| 資產關聯掃描 | 每會話一次 | 5 分鐘 |
MIN_INTERVAL=300 # 5 分鐘硬下限
LAST_EPOCH=$(jq -r '.last_check // "1970-01-01T00:00:00Z"' "$STATE_FILE" | date -d "$(cat)" +%s 2>/dev/null || echo 0)
NOW_EPOCH=$(date +%s)
if [ $((NOW_EPOCH - LAST_EPOCH)) -lt $MIN_INTERVAL ]; then
echo "RADAR_SKIP - 距上次檢查不足 $MIN_INTERVAL 秒"
exit 0
fi
RADAR_ALERT - 2 條新增告警需處理
[P0 即時] GA-2026-015: Malicious prompt pattern "ignore-all"
→ 命中資產: 無(通用威脅)
→ 可利用性: HIGH(公開 PoC)
→ 建議: 更新系統提示詞防禦
[P1 儘快] CVE-2026-27488: RCE in skill-loader v2.1.0
→ 命中資產: skill-loader@2.1.0(已安裝!)
→ 可利用性: MEDIUM
→ 建議: 立即升級至 v2.1.1
RADAR_OK - 情報已檢查,無新增告警。已知告警 47 條,關聯資產 0 條。
RADAR_DEGRADED - 使用離線快照 (2026-07-18 07:30)
快照中無新增告警。
| 型別 | 含義 | 預設處置 |
|---|---|---|
malicious_skill |
故意植入惡意的技能 | 立即解除安裝並審計呼叫歷史 |
vulnerable_skill |
存在安全缺陷的技能 | 按建議升級或打補丁 |
prompt_injection |
已知提示注入模式 | 強化系統提示詞、加輸入過濾 |
attack_pattern |
觀察到的攻擊手法 | 評估自身是否暴露於該手法 |
best_practice |
安全最佳實踐更新 | 計劃納入,非緊急 |
在心跳例程中加入一次 scan.sh。由於強制 5 分鐘最小間隔,即使心跳每 5 分鐘一次也不會壓垮上游。
在部署前掃描技能市場依賴:
bash scan.sh --mode gate --assets ci-deps.json --fail-on P1
存在 P0/P1 告警時退出碼非零,阻斷部署。
bash scan.sh --report daily --since 24h
生成 Markdown 日報,包含:新增告警、已處置告警、資產關聯統計、優先順序分佈。
使用者問"最近有什麼安全動態?"時,Agent 呼叫:
bash scan.sh --query "recent 7d" --no-push
返回最近 7 天告警摘要,不更新狀態、不推送。
Q:首次上線會不會被歷史告警淹沒?
A:不會。--init 模式會把當前所有告警寫入基線 known_advisories,之後只推送增量。
Q:資產清單怎麼保持更新?
A:每次技能增刪後執行 scan.sh --refresh-assets;也可在技能安裝/解除安裝鉤子裡自動觸發。
7w4.net小蔥技能站收錄全網優質技能,值得收藏。
Q:上游 feed 結構變了怎麼辦?
A:指令碼在解析前用 jq empty 校驗 JSON,並用 jq -e '.advisories' 校驗必要欄位。結構異常時記入 consecutive_failures 並降級到快取。
Q:多個 Agent 共享一份狀態嗎?
A:狀態檔案預設在 ~/.skill-platform/security-radar/state.json,按使用者隔離。多 Agent 共享需自行掛載共享卷並加檔案鎖(flock)。
Q:如何臨時停用推送但保留掃描?
A:export RADAR_QUIET=1,掃描結果只寫日誌不輸出通知。
| 症狀 | 可能原因 | 處置 |
|---|---|---|
RADAR_DEGRADED - 無可用情報源 |
網路中斷或 URL 失效 | 檢查 RADAR_FEED_URL、網路代理、DNS |
一直 RADAR_OK 但漏報 |
資產清單未更新 | 執行 --refresh-assets,檢查 assets.json |
| 推送重複告警 | 狀態檔案損壞 | 備份後刪除 state.json,重新 --init |
jq: error 解析失敗 |
feed 返回非 JSON(如 HTML 錯誤頁) | 檢查 cache/feed.json 實際內容 |
| 推送了不相關的告警 | 資產清單過寬或缺失版本號 | 確保每條資產都有 version 欄位 |
| 速率限制未生效 | 系統時鐘不準 | 校準系統時間,檢查 NTP |
scan.sh 註冊為每 30 分鐘的週期任務。jq 一次性計算交集,避免逐條 grep。curl & 並行拉取,wait 後合併。known_advisories 用陣列而非全量重寫,追加新 ID 即可。| 依賴項 | 型別 | 是否必需 | 獲取方式 |
|---|---|---|---|
| curl | 系統命令 | 必需 | 系統自帶或包管理器安裝 |
| jq | 系統命令 | 必需 | apt install jq / brew install jq |
| shasum/sha256sum | 系統命令 | 必需(校驗) | 系統自帶 |
| LLM API | API | 必需 | 由 Agent 內建 LLM 提供 |
RADAR_NVD_API_KEY(可選):NVD API Key,提升速率限制至 50 請求/30 秒。無 Key 時共享公共配額(5 請求/30 秒)。RADAR_FEED_URL(可選):自定義聚合 feed 地址,用於內網映象。這是一款實用且設計周到的安全監控工具,能從海量漏洞情報中精準篩選出真正影響你的威脅,大幅減少告警噪音。它考慮很全面,支援離線使用,網路不穩定時也能正常工作,且對潛在風險有明確提示。文件清晰易讀,功能實用。主要不足是缺少可直接執行的程式,實際使用需要一定技術基礎自己實現對接,另外效果很大程度上取決於配置的 feed 資料來源質量。