漏洞不是一种独立存在的东西——它是普通代码缺陷里,被外人碰得到、并且碰了会出事的那一小块;所以这一章要讲的一切(补丁、扫描、防火墙、安全编程),本质上都是在跟【写代码一定会写错】这个事实打交道。
第三章讲的是恶意软件——别人写来干坏事的程序;这一节换了一个角度,讲软件本身的弱点——你自己写的程序里,本来就不该存在的那一部分。
两者的连接点在 无辜的人变成犯罪者:那里说【固件长期不更新】是设备被接管的三个病灶之一。这一章要回答的就是:为什么更新这么重要,以及不更新到底会漏掉什么。
一、三种说法,其实是三个套在一起的圈
教材一开始就把三个词摆在一起,因为它们经常被混着用,但边界其实很清楚:
| 说法 | 是什么 | 数量级 |
|---|---|---|
| 软件缺陷(bug) | 程序行为与预期不符的任何地方 | 最多(含界面错、性能差) |
| 系统漏洞(security hole) | 缺陷里能被利用、让系统按攻击者意愿行动的那部分 | 少一些 |
| 安全漏洞(脆弱性) | 再进一步,会造成机密性/完整性/可用性受损的那部分 | 最少,也最要紧 |
关键在它们是包含关系,不是三种平行的东西:
软件缺陷(全部写错的地方)
└── 系统漏洞(外人碰得到、且能把系统带偏的)
└── 安全漏洞(会造成 CIA 受损的)
这个包含关系直接决定了一件事:你不可能【只修安全漏洞】。因为安全漏洞是缺陷的一个子集,而缺陷是写代码时必然产生的——你能做的只是:把最外面那层圈尽量收小,然后把内层那些挑出来优先处理。
二、分类的用处:它决定【先修哪一个】
把缺陷分类,不是为了做学术,而是为了在资源永远不够的情况下排出顺序。判断顺序上有三个问题:
- 外部能不能触发? —— 只有内部输入才能踩到的缺陷,攻击者碰不到(比如"输入格式不对时按钮点不动")。
- 触发之后系统会怎样? —— 崩溃、卡死、越权、把数据吐出来,后果完全不同。
- 伤不伤 CIA 三要素? —— 这就是 1-5 里那三根柱子:机密性、完整性、可用性。
三个问题问下来,绝大多数缺陷会自己落到"不急"那一档——而真正需要当天处理的,是"外人一伸手就能碰到、并且碰了会出事"的那一小撮。这就是"漏洞管理"这个词的全部含义。
三、动手 Demo:十三条缺陷,过一遍分类
下面这段脚本给出一副"缺陷清单",按两个判据(外部能不能触发、伤不伤 CIA)逐条过一遍:
# 判据:外部可触发 + 伤及 CIA(机密性/完整性/可用性)
rows = [
("B03", "搜索框把输入直接拼进 SQL", "是", "是", "安全漏洞"),
("B06", "错误页打印出数据库版本", "是", "是", "安全漏洞"),
("B07", "上传接口不检查文件类型", "是", "是", "安全漏洞"),
("B10", "登录提示能区分账号是否存在", "是", "否", "系统漏洞"),
("B13", "日志里塞入换行可伪造条目", "是", "否", "系统漏洞"),
("B01", "按钮点了没反应", "否", "否", "质量缺陷"),
]
# 归类:能外部触发且伤 CIA → 安全漏洞;只满足其一 → 系统漏洞;都不满足 → 质量缺陷
实跑输出:
一、十三条缺陷,按【外部能不能触发】+【伤不伤机密性·完整性·可用性】过一遍
编号 缺陷描述 外部可触发 伤及三项 归类
----------------------------------------------------------------------------------------------
B01 按钮点了没反应 否 否 质量缺陷
B02 订单金额小数位显示错 否 否 质量缺陷
B03 搜索框把输入直接拼进 SQL 是 是 安全漏洞
B04 页面回显昵称不过滤 是 是 安全漏洞
B05 导出功能偶发超时 否 否 质量缺陷
B06 错误页打印出数据库版本 是 是 安全漏洞
B07 上传接口不检查文件类型 是 是 安全漏洞
B08 管理页未做权限校验 是 是 安全漏洞
B09 日志时间戳用了本地时区 否 否 质量缺陷
B10 登录提示能区分账号是否存在 是 否 系统漏洞
B11 分页参数没有上限 是 是 安全漏洞
B12 打印排版错位 否 否 质量缺陷
B13 日志里塞入换行可伪造条目 是 否 系统漏洞
合计:质量缺陷 5 条 | 系统漏洞 2 条 | 安全漏洞 6 条(共 13 条)
→ 一句话:【漏洞不是一种特殊的东西,而是普通缺陷里、被外人碰得到】
【并且碰了会出事的那一小块】。
二、CVE 的年度曲线(全球公开漏洞编号的出版量)
1999 894
2005 4,932
2015 6,494
2020 18,322
2022 25,073
2023 28,816
2024 39,953
2025 48,152
2026 75,963 (截至第 281 天,日均 270 个)
→ 2026 年日均 270 个,2025 年是 132 个(+57.8%);累计已达 384,163 条。
读这个输出:
- 上半张表最值得看的是 B10 和 B13:它们确实能被外部触发,但不会直接让 CIA 受损——账号枚举(B10)和日志伪造(B13)本身不泄露数据、也不改数据,但它们是攻击链上的台阶。把它们归到"系统漏洞"而不是"安全漏洞",意思是"不是今天必修的,但修掉能少一个台阶"。
- 下半张图的形状更值得记住:1999 年不到一千个,2020 年一万八,2025 年四万八,2026 年前 281 天就到了七万六。这条曲线不是"软件越来越差",而是"发现能力越来越强"——尤其在 2026 年,AI 参与挖掘是主要推手(下面 2026 现状里给数字)。
四、⚠️ 2026 现状
- 【数量:2026 年第一次突破 5 万,实际跑到了 7 万以上】。 FIRST 在 2026 年 2 月预测全年 CVE 中位数为 59,427 个(首次超过 5 万);6 月就上调到约 66,000;而到 2026-09-16 累计已达 66,401 个,是 2025 年同期(33,512 个)的约两倍。按日算:2026 年日均 270 个,2025 年是 132 个(+57.8%)。作为对照:CVE 项目前 24 年一共积累了约 20 万条,而 2026 年一年就要再加三成以上。
- 【推手是 AI,而且是"量产级"的】。 几个可以并列看的数字:微软 2026 年 9 月单月修了 974 个 CVE(公司纪录);Oracle 2026 年 7 月发出 1,448 个补丁(2025 年 7 月是 309 个);Chrome 2026 年 6 月的两个大版本合起来修了 1,072 个漏洞,比它之前 23 个大版本的总和还多;Mozilla 用 Anthropic 的模型做了一轮测试,一次找出 Firefox 的 271 个漏洞。所以下面这条判断很重要:数字暴涨的第一原因是"找得更快",不是"写得更烂"。
- 【CVE 与 CWE 是两个层次,别混】。 CVE 是"这一次的具体漏洞"(像病历),CWE 是"这一类错法的名字"(像病因)。2026 年上半年的分布(奇安信对 18,464 个高危/极危漏洞的统计)很能说明问题:SQL 注入(CWE-89)以 1,116 个继续排第一,但占比已从 2025 年的 15.43% 大幅下降;释放后重用(CWE-416)以 858 个升到第二;内存安全类漏洞(越界写、越界读、栈溢出、堆溢出等)占了前 20 名里的 7 席;访问控制类(未授权访问、访问控制不当、关键功能缺认证)首次三类同时进入前 20。读法:Web 层的老问题在被框架挡住,而系统层的内存问题和权限问题正在补位。
- 【"数量涨"不等于"更不安全",这一点要能自己说清】。 追踪者自己说得很直白:"更多 CVE 不是更多漏洞,而是更多已知漏洞,多数情况下这是系统在正常工作"。数据也支持这个说法:2025 年公开的 48,000 多个 CVE 里,被确认在真实攻击中被利用的约 800 个,其中只有 58 个的 EPSS 分数高到可以视为"几乎肯定会被利用"。所以管理漏洞的正确姿势不是"把数量降下来"(降不下来),而是"从里面挑出那几十个"——这正是 4-13 要解决的问题。
- 【第一个由 AI 生成的零日利用已经出现】。 2026 年的威胁情报报告里记录了一个新情况:一个威胁组织使用了经评估由 AI 参与开发、用来绕过双因子认证的零日利用,意图是大规模利用(在利用开始前被阻断)。这标志着"利用开发的技能门槛"正在下降——过去防守方很大一部分安全感来自"写利用很难",这个缓冲正在变薄(详见 4-3)。
30 秒实验
今天做两个动作,各 15 秒:
- 给自己出一道判断题:随便想一个你最近遇到的软件小毛病(比如"点了没反应""偶尔卡一下"),然后用它过一遍两个判据——① 外人能不能触发?② 它会不会让数据被看见/被改动/用不了?两个都是"是"才是安全漏洞;只要有一个"否",它就不在今天该处理的清单里。这个判断你以后每天都会用到。
- 打开一个你常用软件的"关于"页或更新页,看一眼上次更新时间。如果已经超过三个月,问自己一句:这台设备上如果躺着一个公开了半年的漏洞,我知道它会怎么被用掉吗?(下一节 4-2 就是讲这件事。)
这一节要带走的一句是:漏洞不是敌人藏在代码里的地雷,而是你自己代码里本来就有的那部分错误——只不过其中有几条,正好被外人踩得到。
常见误区
-
错误:漏洞是高级黑客才能找到的稀有东西,跟我这种普通用户无关。——纠正:"稀有"这个印象在 2026 年已经被数量本身否掉了:日均 270 个新编号,一年公开 7 万多个,而且其中很多是"扫描器扫一遍就能发现"的老毛病(CISA 的复盘明确说:大多数入侵不是国家级零日,而是犯罪分子扫描暴露出来的已知漏洞)。真正稀有的不是"漏洞",而是"还没有人对着它写好了利用工具"。
-
错误:我的软件用着一切正常,说明它没有漏洞。——纠正:"功能正常"和"安全"是两件不同的事,而且它们经常同时成立。 一个把用户输入直接拼进数据库查询的搜索框,功能是完全正常的(搜什么都能搜出来)——它的缺陷恰恰藏在"正常工作"里。换句话说:漏洞不会以"用起来不对劲"的形式通知你,这正是它麻烦的地方。这也是为什么除了自己用,还得靠外部手段去查(4-9)。
-
错误:CVE 数量一年翻倍,说明现在的软件比过去更不安全了。——纠正:这两件事之间没有直接因果关系。 2026 年数量暴涨的直接原因是发现能力暴涨(AI 辅助挖掘、自动化检测进开发流程)。判断安全性要看的是另一组数字:2025 年 48,000 多个 CVE 里,被确认在真实攻击中被利用的约 800 个——比例不到 2%。软件是不是更不安全,取决于"被利用的那部分有没有变多",而不是"被记录的那部分有没有变多"。
-
错误:漏洞是程序员水平不行写出来的,换个高手就不会有。——纠正:CISA 在 2026 年 8 月发布的复盘报告里给了一个更不客气、也更准确的结论:大多数入侵来自少数几类反复出现的老毛病——KEV 目录里 41.5% 的条目属于"顽固弱点",也就是 MITRE CWE Top 25 里几乎每年都出现的那批;按 2007 年的标准,今天最常见的 10 类弱点里有 3 类当年就算"不可原谅"(写法有定论、攻击路径明确、利用极简单)。这不是个体水平问题,是"同一类错被整个行业反复犯"的问题——所以解法也不是"更小心一点",而是在流程里把这些类别的错堵死(4-11)。
自测三问(点开对答案)
1. 为什么说"软件缺陷 / 系统漏洞 / 安全漏洞"是三个圈而不是三种东西?这一点有什么实际后果? —— 因为**它们是层层包含的关系**:**所有能被攻击者利用的地方都是缺陷;所有会造成 CIA 受损的地方都是可被利用的系统漏洞**。**实际后果有两条**:① **你不可能"只关注安全漏洞"**——安全漏洞是缺陷的子集,**而缺陷是写代码时必然产生的**,所以**减少安全漏洞的现实路径是"把缺陷总量压小"加"把内层挑出来优先修"**,而不是"专心找那几条危险的";② **同一个东西在不同语境下会被叫成不同的名字**(同一个 SQL 拼接,在代码评审里叫"代码缺陷",在渗透报告里叫"安全漏洞")——**知道它们是同一个东西的不同切面,就不会在两个团队之间互相推责任。** 2. 为什么"外部能不能触发"比"这个缺陷看起来严不严重"更该先问? —— 因为**它决定了这个缺陷能不能被外人用来对付你**。一个**只有内部数据才能踩到的崩溃**(比如汇总报表里某个字段为空就崩),**再严重也只是内部可用性问题**;而一个**看起来只是"多显示了一行提示"的缺陷**(比如登录页区分了"账号不存在"和"密码错误"),**外部的自动化脚本可以拿它批量枚举出哪些账号是真实存在的**——**这就是攻击链的第一步**。**排序的第一刀应该切在"谁能碰到它"上**,然后再看后果。**这也解释了为什么"暴露在公网"这个属性在风险评估里权重这么高**(2-8 讲的入口·出口·内部三个方向,就是这个思路)。 3. 既然漏洞的数量降不下来,"漏洞管理"这件事的目标应该是什么? —— 目标应该是**在有限的人力下,把"真正会被用到的那几十个"挑出来并按时修掉**,而不是**把数字清零**。数据支持这个转向:**2025 年 48,000 多个 CVE 里约 800 个被实际利用,其中只有 58 个的 EPSS 分数高到"几乎肯定会被利用"**;**按 CVSS 排序去修,要处理 57% 的漏洞才能覆盖 82% 的被利用漏洞,而按 EPSS 排序只需处理 2.7% 就能覆盖 63%**(4-13)。**所以"漏洞管理"的核心能力不是扫描能力,而是"排序与取舍"的能力**——**这也解释了为什么各家的重点都在从"扫得更全"转向"排得更准"。**- ☐ 下一节(4-2 修正系统软件漏洞)
相关笔记
- 计算机病毒感染的不仅仅是计算机 —— 上一章收尾:同一套攻击落到另一种设备上
- 修正系统软件漏洞 —— 下一篇:知道有漏洞之后,第一件该做的事
- 无辜的人变成犯罪者 —— "固件长期不更新"那个病灶的下半篇
- 信息安全中不可或缺的认知 —— 脆弱性才是你能改的那一个
- 🛡️ 网络与信息安全 · 索引 —— 全课路线图