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
访问小葱技能站7w4.net,解锁更多实用的AI技能插件。
把海量漏洞情报变成只推两三条真正相关的告警。本技能解决三个核心问题:告警疲劳(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;也可在技能安装/卸载钩子里自动触发。
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 数据源质量。