🚨 实战 — 漏洞分诊
输入一段漏洞描述,自动提取 CWE、判断是否在 Top 25、获取详情、输出修复优先级。
CLI 实战在线 + 内置列表🎬 场景
安全运营每天收到若干漏洞工单,描述里散落 CWE 引用。需要快速分诊:哪些命中 Top 25 要优先修,每个 CWE 是什么。
📋 前置准备
bash
curl -sL https://github.com/scagogogo/cwe-skills/releases/latest/download/cwe-skills_latest_linux_x86_64.tar.gz | tar xz
sudo mv cwe /usr/local/bin/
# 需 jq 处理 JSON
sudo apt-get install -y jq需网络访问 MITRE API。
💻 完整脚本
bash
#!/usr/bin/env bash
# triage.sh — 漏洞分诊
# 用法: ./triage.sh "漏洞描述文本"
set -euo pipefail
TEXT="${1:?用法: $0 \"漏洞描述\"}"
# 1. 提取所有 CWE ID
IDS=$(cwe extract "$TEXT" -o json | jq -r '.ids[]')
if [[ -z "$IDS" ]]; then
echo "未在描述中发现 CWE 引用"
exit 0
fi
# 2. 检查 Top 25 / OWASP / SANS
echo "=== 知名列表检查 ==="
cwe wellknown check $IDS -o json | jq -r '
.[] |
"\(.cwe_id): \(.in_list | if length > 0 then join(", ") else "不在任何知名列表" end)"
'
# 3. 取每个 CWE 的详情并定优先级
echo ""
echo "=== 分诊结果 ==="
for id in $IDS; do
name=$(cwe show "$id" -o json 2>/dev/null | jq -r '.[0].detail.name')
intop25=$(cwe wellknown check "$id" -o json | jq -r '.[0].in_list | map(select(. == "Top 25")) | length > 0')
if [[ "$intop25" == "true" ]]; then
priority="🔴 高(Top 25)"
else
priority="🟡 中"
fi
printf "%s %s %s\n" "$priority" "$id" "$name"
done▶️ 运行步骤
bash
chmod +x triage.sh
./triage.sh "该接口存在反射型 XSS(CWE-79) 与 SQL 注入(CWE-89),另外日志记录不当(CWE-778)"📤 输出示例
text
=== 知名列表检查 ===
CWE-79: Top 25, OWASP Top 10 (A03:2021-Injection), SANS Top 25
CWE-89: Top 25, OWASP Top 10 (A03:2021-Injection), SANS Top 25
CWE-778: 不在任何知名列表中
=== 分诊结果 ===
🔴 高(Top 25) CWE-79 Improper Neutralization of Input During Web Page Generation...
🔴 高(Top 25) CWE-89 Improper Neutralization of Special Elements used in an SQL Command...
🟡 中 CWE-778 Insufficient Logging🧩 扩展思路
- 接入工单系统:把脚本输出写入工单的优先级字段,自动排期。
- 批量分诊:把多条描述放文件,循环调用脚本,汇总成 CSV。
- 加权评分:除了 Top 25,再用
cwe enum likelihood看利用可能性,综合打分。 - 离线版:把
cwe show换成cwe registry get --xml <file>,断网也能分诊。
用 -o json 更稳
脚本全程用 -o json + jq 提取字段,避免解析 text 输出的歧义。