从 Morris 到 Log4Shell:互联网安全四十年攻防简史

19132 字
96 分钟
从 Morris 到 Log4Shell:互联网安全四十年攻防简史

互联网发展的历史,同时也是一部漏洞与恶意程序共同演化的历史。

如果只看漏洞与安全缺陷,我们会看到缓冲区溢出、SQL 注入、远程代码执行、0day 漏洞不断出现;如果只看恶意软件与攻击活动,我们又会看到文件病毒、蠕虫、木马、僵尸网络、勒索软件不断演化。

但真正推动互联网安全不断升级的,往往并不是“某个漏洞”或者“某个病毒”,而是二者结合之后产生的结果。

漏洞提供入口,恶意程序则把这个入口变成传播、控制、窃密、勒索甚至破坏现实设备的工具。

从 Morris Worm 到 CIH,从“熊猫烧香”到 WannaCry,再到 Log4Shell 与现代供应链攻击,互联网安全的发展轨迹其实非常清晰:攻击者不断寻找新的入口,而恶意软件也不断改变进入系统之后的目的。

但如果只从攻击者一侧观察,这段历史仍然是不完整的。

几乎每一次大规模安全事件之后,防守方都会补上一层新的防线:漏洞推动补丁机制成熟,网络蠕虫推动防火墙与自动更新普及,内存破坏推动 DEP、ASLR 等保护机制出现,而这些新的防御又会迫使攻击者寻找新的绕过方式。

因此,互联网安全的发展并不是单向的“攻击技术越来越强”,而更像一场旷日持久的攻防博弈:

攻击者寻找新的突破口,防守方修补暴露出的弱点;新的防御提高攻击成本,而攻击者又继续寻找下一条路径。


互联网早期:安全并不是第一优先级#

互联网的前身: ARPANET 诞生于一个与今天完全不同的环境。

当时能够接入网络的,主要是政府机构、大学和研究单位。网络规模有限,参与者数量也不多,因此整个系统在很大程度上建立在“参与者可信”的假设之上。

这直接影响了早期网络协议的设计。

Telnet 可以直接通过网络登录远程计算机,却长期使用明文传输用户名和密码;FTP 的账号和数据同样可以明文传输;早期电子邮件协议也缺乏今天常见的身份验证机制。很多网络服务默认认为来自网络中的请求是正常请求,而不是潜在的攻击输入。

从今天的角度来看,这些设计显得相当危险。

但在当时,它们并不完全不合理。毕竟,如果一个网络只连接少量经过授权的科研机构,那么“如何方便地互联”显然比“如何防范互联网上数以亿计的陌生设备”更加重要。

问题在于,互联网发展得太过迅速,这一切都发生了变化。

网络迅速扩大,而很多原本建立在信任基础上的协议和软件,并没有同步完成安全转型。

1988 年,一个著名的网络蠕虫,让整个互联网第一次真正意识到这个问题。

它就是 Morris Worm——莫里斯蠕虫。


1988:Morris Worm,让网络攻击第一次实现自动传播#

1988 年 11 月,一个仅有 99 行代码的程序开始在当时的互联网中自行传播。

它后来被称为 Morris Worm。

今天看来,蠕虫自动扫描网络、寻找目标、利用漏洞,然后继续感染下一台机器,似乎已经是非常熟悉的攻击模式。但在当年,这是一件极具冲击力的事情。

Morris Worm 综合利用了 Unix 系统中的多个问题,包括网络服务漏洞、弱口令和配置缺陷。一旦进入某台机器,就会继续寻找其他可感染主机。

它的传播方式并不是“复制一个文件然后等用户打开”,而是主动寻找下一台主机,并尝试通过不同方式进入:

发现其他主机
↓
尝试网络服务漏洞
↓
尝试弱口令 / 信任关系
↓
进入系统
↓
复制并启动自己
↓
继续寻找下一台主机

这也是“网络蠕虫”与传统文件病毒最核心的区别:传播过程本身就是自动化的。

它并不是传统意义上必须依附文件传播的“病毒”,而是一种更加顺应当时时代的恶意程序:

网络蠕虫。

传统病毒通常需要附着在其他文件或程序上,例如感染可执行文件,再等待用户运行后继续复制;蠕虫则可以独立运行,并通过网络主动寻找下一个目标。

Morris Worm 最重要的意义并不是它感染了多少机器,而是它证明了:

漏洞不只是让某一台计算机被攻破,还可以成为恶意程序自动传播的通道。

从这一刻开始,安全问题不再只是“某个人入侵了某台计算机”。

正如现实中的传染病会在人群中扩散,网络蠕虫也可以从一台机器自动传播到另一台机器。

Morris Worm 之后,计算机安全事件响应机制开始受到重视,CERT/CC 也在这一时期成立。

Morris Worm 展示了攻击方第一次能够借助网络快速放大一个安全问题,而防守方的回应,则不再只是让某个管理员单独修好某台机器,而是开始建立事件通报、漏洞协调和应急响应机制。

也就是说,防御第一次开始尝试以组织化响应对抗自动化传播。

互联网安全由此逐渐从少数技术人员关注的问题,发展成一个正式的研究和管理领域。


1990 年代:病毒与漏洞利用开始同时成熟#

进入 1990 年代后,个人计算机和 Windows 系统迅速普及。

这一时期,传统文件病毒依然是最常见的恶意程序之一。病毒可以感染 .exe、.com 等可执行文件,也可以感染启动扇区,甚至通过 Office 宏进入 Word 和 Excel 文档。

与此同时,漏洞利用技术也开始逐渐成熟。

其中最具代表性的一类,就是 缓冲区溢出。

很多程序使用 C 或 C++ 编写,而这些语言允许程序直接操作内存。如果开发者没有正确检查输入数据的长度,攻击者就可能向一个固定大小的缓冲区写入超过其容量的数据。

原本的内存结构可能类似:

[ 缓冲区 ][ 其他数据 ][ 返回地址 ]

如果输入内容超过缓冲区长度,多余的数据就可能继续覆盖后面的内存区域。

一旦攻击者能够控制程序的返回地址,就可能进一步改变程序的执行流程。

这让原本看起来只是“程序崩溃”的错误,变成了“执行攻击者代码”的安全漏洞。

1996 年,Aleph One 发表经典文章《Smashing The Stack For Fun And Profit》,系统介绍了栈缓冲区溢出的利用方式。这篇文章后来几乎成为漏洞利用技术史上的标志性文献。

但如果要理解 1990 年代末的恶意软件,单讲漏洞还不够。

这一时期还有一个极具代表性的名字:CIH


1998—1999:CIH,破坏型文件病毒时代的代表#

CIH大约在 1998 年出现,并在 1999 年因为大规模发作而广为人知。

它通常也被称为“切尔诺贝利病毒”或“4 月 26 日病毒”。

与后来依靠网络漏洞高速传播的蠕虫不同,CIH 更接近传统意义上的文件感染型病毒。

它会感染 Windows 可执行文件,并将自己的代码嵌入其中。某些 CIH 变种还会尽量利用 PE 文件中原本没有被使用的空隙存放自身代码,从而减小文件体积明显变化带来的异常感。

当用户运行被感染程序时,病毒代码也会被执行,并继续寻找其他可执行文件进行感染。

其基本逻辑可以简化为:

运行被感染程序
↓
CIH 代码被执行
↓
寻找其他可执行文件
↓
写入病毒代码
↓
等待触发日期
↓
执行破坏载荷

某些 CIH 变种在特定日期触发后,会尝试覆盖硬盘数据;在部分硬件和系统环境下,还可能破坏 Flash BIOS 内容。

这使 CIH 成为 1990 年代末最著名的破坏型病毒之一。

CIH 的意义不只是“破坏力强”。

它代表的是一个仍然带有明显“病毒文化”色彩的时代。

当时很多病毒作者更在意的是:

  • 能否感染更多文件;
  • 能否隐藏自身;
  • 能否展示复杂的技术技巧;
  • 能否造成足够明显的破坏。

也就是说,在 CIH 所代表的时代:

计算机本身就是攻击和破坏的目标。

这和后来恶意软件逐渐追求盗号、控制、流量变现乃至勒索,有非常明显的区别。

从恶意软件演化史来看,CIH 很适合作为“传统文件病毒时代”的一个阶段性顶点。


1999—2000:Melissa 与 ILOVEYOU,邮件和社会工程学接管传播#

1999 年,**Melissa(梅丽莎)**大规模传播。

它利用 Microsoft Word 文档中的宏功能,并结合 Outlook 邮件客户端自动向通讯录中的联系人发送带毒文档。

它的传播思路非常典型:

用户打开带宏文档
↓
宏代码执行
↓
感染 Word 模板 / 文档
↓
读取 Outlook 通讯录
↓
自动发送带毒附件

也就是说,Melissa 并不需要攻破操作系统内核,而是把 Word 宏和 Outlook 自动化接口这些“正常功能”拼接成了一条传播链。

它并不主要依靠传统系统漏洞,而是滥用了 Office 宏和邮件客户端的自动化能力。

这说明攻击面并不只来自程序错误。

很多时候,合法功能本身也可能被恶意利用。

2000 年,**ILOVEYOU(爱虫,也常称“我爱你”蠕虫)**又进一步展示了社会工程学的威力。

用户收到主题类似“ILOVEYOU”的邮件,因为好奇打开附件,恶意脚本随后修改本地文件,并继续通过通讯录传播。

它本质上是一个脚本型蠕虫。用户一旦运行附件,脚本就会执行本地文件操作,并利用邮件客户端继续向联系人复制自己。

和 Melissa 相比,ILOVEYOU 更突出的一点是:传播链条的第一步不是技术突破,而是诱导用户主动执行。

它的技术本身并不算复杂,但传播效果却极其惊人。

原因很简单:

它利用的不是某个高深漏洞,而是人的心理。

从这一时期开始,一个重要的攻击思想逐渐成熟:

如果无法骗过计算机,也可以先骗过人。

这条路线后来一直延续到今天的钓鱼邮件、伪造登录页、恶意二维码和社交平台诈骗。


Web 的兴起:Web 应用成为新的漏洞重灾区#

1990 年代后期到 2000 年代初,互联网开始进入真正意义上的 Web 时代。

PHP、ASP、JSP、CGI 等动态网页技术逐渐普及,数据库也开始大量用于网站后台。

过去的漏洞往往存在于操作系统或网络服务中,而现在,任何一个网站程序都有可能成为攻击目标。

于是,一批今天依然很常见的 Web 漏洞开始出现:

  • SQL 注入;
  • XSS;
  • 命令注入;
  • 文件包含;
  • 目录遍历;
  • 任意文件上传;
  • 身份验证绕过;
  • Session 劫持。

以 SQL 注入为例,如果开发者直接把用户输入拼接到 SQL 语句中,攻击者就可能通过构造特殊输入改变原本查询逻辑。

例如,程序原本只想执行一次普通的账号查询:

SELECT * FROM users
WHERE username = '$username'
AND password = '$password';

如果 $username 和 $password 直接来自用户输入,那么攻击者提供的内容就可能被数据库当成 SQL 语法的一部分,而不是单纯的数据。

问题的本质并不是 SQL 本身“不安全”,而是程序将“用户提供的数据”和“程序执行的指令”混在了一起。

XSS 和命令注入其实也有类似的思想。XSS 是让原本应该被当作网页内容的数据,被浏览器误当成脚本执行;命令注入则是让原本应该只是参数的数据,被操作系统外壳解释成了新的命令。

因此,这一类漏洞背后的共同问题可以概括为:

数据与指令的边界被打破了。

现代防御通常会通过参数化查询、上下文相关转义、严格输入校验等方式,尽量让“数据始终只是数据”。

2001 年,OWASP 成立。后来广为流传的 OWASP Top 10,也逐渐成为 Web 安全领域最著名的风险分类之一。

这也是 Web 安全攻防逐渐体系化的过程。

攻击方不断寻找新的输入点,把用户数据变成 SQL、脚本或系统命令;防守方则逐渐形成参数化查询、输出编码、输入校验、权限隔离和安全开发规范等方法。

于是,攻防双方争夺的重点从“某台服务器有没有明显漏洞”,进一步深入到了:

应用程序如何理解和处理每一份来自外部的数据。

从这里开始,漏洞已经不再只是操作系统开发者的问题,也成为普通网站开发者每天都要面对的问题。


2001—2004:高速网络蠕虫#

如果说 Morris Worm 证明了自动传播攻击的可能性,那么 2000 年代初的一系列蠕虫,则真正展示了这种攻击在大规模互联网中的破坏力。

这一时期有几个重要背景:

Windows 个人电脑大量普及,越来越多设备直接接入互联网,而自动更新机制和用户安全意识还远没有今天成熟。

一台没有及时安装补丁的计算机,只要暴露在互联网上,就可能被自动扫描和感染。

Code Red:不需要用户点击的攻击#

2001 年,**Code Red(红色代码)**出现。

它利用 Microsoft IIS Web 服务器中的缓冲区溢出漏洞传播。

一旦成功进入服务器,Code Red 会驻留在内存中继续扫描其他 IIS 主机,并尝试重复利用同一个漏洞进行传播。部分变种还会篡改网页内容或在特定阶段参与拒绝服务攻击。

因此它的运行模式很像:

扫描 IIS
↓
利用缓冲区溢出
↓
进入服务器
↓
继续扫描
↓
感染更多服务器

和 Melissa、ILOVEYOU 最大的区别在于:

用户不需要打开邮件,也不需要运行附件。

服务器只要存在漏洞并暴露在网络中,就可能被感染。

这就是“漏洞 + 自动传播程序”的经典组合。

Nimda:多传播渠道开始出现#

同年出现的 **Nimda(尼姆达)**更进一步。

它不仅能够利用 Web 服务器漏洞,还会通过邮件、网络共享、被感染网站和本地文件传播。

Nimda 的特别之处就在于“多向传播”。一台主机既可能因为服务器漏洞被感染,也可能因为用户打开邮件附件而感染,还可能通过共享目录或访问被感染网页受到影响。

因此它不像早期很多蠕虫那样只有一条固定路线,而更像同时打开了多个传播通道:

邮件附件
├─→ 用户执行
Web 漏洞
├─→ 服务器感染
网络共享
├─→ 局域网传播
被感染网页
└─→ 客户端继续受影响

这说明恶意程序已经开始采用多条传播路线。

如果一种方法失败,还可以尝试另一种。

SQL Slammer:几百字节代码也能影响全球网络#

2003 年出现的 **SQL Slammer(也称“蓝宝石”或“SQL 杀手”)**利用 Microsoft SQL Server 中的缓冲区溢出漏洞传播。

它体积非常小,并且主要驻留在内存中运行。一旦感染一台服务器,就会高速生成随机 IP 并不断发送攻击数据包。

它几乎不需要复杂的持久化、文件复制或用户交互,传播逻辑非常直接:

利用 SQL Server 漏洞
↓
恶意代码进入内存
↓
高速生成随机 IP
↓
向下一批服务器发送攻击数据

正因为步骤少、体积小、传播环节短,它才能在极短时间内产生巨大的网络扫描流量。

这种简单粗暴的设计让它获得了惊人的传播速度,并造成严重网络拥塞。

Slammer 证明了:

恶意程序不需要庞大复杂,只要传播效率足够高,同样可以给整个互联网造成明显冲击。

Blaster 与 Sasser:普通 Windows 用户开始直接感受到漏洞利用型攻击#

2003 年的 **Blaster Worm(冲击波蠕虫)**利用 Windows RPC 服务漏洞传播。

它会扫描其他 Windows 主机并尝试利用 RPC 服务缺陷,在成功利用后让目标主机下载并启动蠕虫程序。

很多用户感染后会看到“系统将在 60 秒后关闭”之类的提示,随后计算机自动重启。这个现象并不完全是“病毒故意弹出倒计时”,而常常是系统关键 RPC 服务崩溃后触发的 Windows 自动关机机制。

2004 年的 **Sasser Worm(震荡波蠕虫)**则利用 Windows LSASS 服务漏洞传播。

Sasser 的思路与 Blaster 很相似:扫描网络中的易受攻击主机,利用服务漏洞进入系统,再让新感染主机继续扫描。两者都是典型的“无需用户点击”的网络蠕虫。

它们共同改变了很多普通用户对“中病毒”的认识。

过去人们会认为:

只要不下载陌生程序就不会中毒。

但 Blaster 和 Sasser 告诉用户:

即使你什么都没有点击,只要系统存在漏洞并连接互联网,也可能被感染。

这也是防火墙、自动更新和补丁管理后来越来越重要的原因。

这一时期的攻防关系非常典型:

攻击方
自动扫描 + 漏洞利用 + 高速传播
↓
防守方
防火墙 + 补丁管理 + 自动更新 + 网络隔离

当“不要乱点附件”已经不足以保护用户时,防守方开始把安全能力直接做到操作系统和网络边界里。

但这并没有结束攻防。

随着系统补丁越来越及时、网络服务越来越难被直接攻破,攻击者又开始把注意力转向弱口令、社会工程、浏览器、第三方软件以及用户本身。


2000 年代中后期:恶意软件开始从“破坏”转向“赚钱”#

这一时期,恶意软件的目标逐渐发生变化。

网上银行、网络游戏、即时通信、电商和数字支付快速发展,互联网账号开始拥有直接经济价值。

于是攻击目标从“让你的电脑出问题”逐渐变成:

  • 盗取银行账户;
  • 盗取网络游戏账号;
  • 窃取 QQ 等即时通信账号;
  • 发送垃圾邮件;
  • 控制设备;
  • 构建僵尸网络;
  • 引流和广告欺诈。

恶意软件开始明显商业化。

这一转折,在中文互联网语境中有一个非常有代表性的案例:

熊猫烧香。


2006—2007:熊猫烧香,从破坏型病毒走向黑产化恶意软件#

“熊猫烧香”在 2006 年末到 2007 年初大规模传播。

它最有辨识度的特征,就是大量被感染文件的图标会变成一个“熊猫举着三炷香”的形象。

对很多当时的国内 Windows 用户来说,这几乎成为了“电脑中病毒”的视觉符号。

但如果只把它理解成“一个图标很特别的病毒”,就低估了它在恶意软件演化史上的意义。

熊猫烧香带有明显的文件感染能力,同时又存在网络传播、下载其他恶意组件和黑产化利用等特征。

它会感染本地可执行文件,并修改部分网页文件;在一些传播场景中,还会借助局域网共享、可移动存储介质等方式继续扩散。用户看到的大量“熊猫烧香”图标,本质上是文件被病毒修改后的外在表现。

可以简单理解为:

感染本地文件
↓
修改文件图标 / 内容
↓
利用共享或移动介质扩散
↓
下载或配合其他恶意组件
↓
盗号 / 控制 / 变现

相关传播体系中还出现了大量变种,恶意程序的目的也逐渐和盗号、控制、流量变现等利益联系起来。

这和 CIH 所代表的时代已经完全不同。

CIH 更像:

感染 → 隐藏 → 复制 → 等待触发 → 破坏。

而到了熊猫烧香时代,思路开始变成:

感染 → 传播 → 控制 → 盗号 / 僵尸网络 / 引流 → 获利。

这个变化非常关键。

因为它意味着:

被感染的计算机不再只是破坏对象,而开始成为一种“资产”。

攻击者没有必要马上把电脑弄坏。

一台能够联网、能够运行、还能长期接受控制的计算机,可能更加有价值。

它可以被用来盗取账号、发垃圾邮件、攻击其他网站、挂马、刷流量,甚至加入僵尸网络。

这也迫使防守方改变思路。

过去,人们往往把“电脑是否崩溃、文件是否损坏”当成判断感染的重要依据;但面对追求长期控制的木马和僵尸网络,真正危险的状态反而可能是:

电脑看起来一切正常,但攻击者已经悄悄获得了控制权。

因此,防御的重点开始从“阻止明显破坏”,进一步转向进程行为、网络连接、持久化机制和异常活动的检测。

因此,“熊猫烧香”很适合被看作中文互联网恶意软件从传统病毒文化逐渐走向黑产化的一道标志。


病毒、蠕虫和木马的边界开始模糊#

到了 2000 年代中后期,“病毒”这个大众称呼已经越来越难准确描述所有恶意程序。

传统病毒强调的是:

感染文件,并自我复制。

蠕虫强调的是:

独立运行,并通过网络自动传播。

木马则更加重视:

伪装、控制和长期驻留。

但现实中的恶意软件越来越可能同时具备多种能力:

文件感染
+
网络传播
+
远程控制
+
下载其他组件
+
僵尸网络接入

因此专业领域越来越倾向于使用一个更大的总称:

Malware——恶意软件。

“病毒”只是其中的一种。


僵尸网络:感染本身不再是最终目标#

随着恶意软件商业化,Botnet——僵尸网络逐渐成为互联网黑产的重要基础设施。

攻击者通过漏洞、木马、恶意下载或者弱口令控制大量设备,再把这些机器组织成一个可以统一下发指令的网络。

被控制设备可以用于:

  • 发动 DDoS;
  • 发送垃圾邮件;
  • 扫描漏洞;
  • 挖矿;
  • 广告欺诈;
  • 传播其他恶意软件。

每台设备本身可能不起眼,但数万甚至数十万台设备同时行动,就会形成巨大的攻击能力。

这个时代最有代表性的恶意软件之一,就是 Conficker。


2008:Conficker,漏洞、弱口令与僵尸网络的结合#

**Conficker(飞客)**利用 Windows Server Service 漏洞传播,同时也会尝试弱口令、网络共享和可移动设备等其他传播方式。

它的传播逻辑并不依赖单一入口,而是同时尝试:

系统漏洞
+
共享目录
+
弱口令
+
可移动设备

感染后,它还会修改系统设置、干扰部分安全服务,并尝试与控制基础设施建立联系。

这意味着 Conficker 已经不只是“会复制自己的蠕虫”,而开始具备明显的长期控制和僵尸网络属性。

它感染规模巨大。

更重要的是,感染并不是它的最终目的。

被感染设备可以继续成为一个大型僵尸网络的一部分,等待后续控制。

这意味着恶意软件的设计目标发生了根本变化:

过去:

感染本身就是目的。

现在:

感染只是获得长期控制权的第一步。

这条思路后来在木马、APT、挖矿程序和勒索攻击中不断发展。


2010:Stuxnet,让恶意代码进入物理世界#

2010 年被发现的 Stuxnet(震网),是整个网络安全历史中的分水岭之一。

它针对的不是普通用户电脑,而是工业控制系统。

Stuxnet 利用了多种高级攻击技术,其中包括当时尚未公开修复的 0day 漏洞。

什么是 0day 漏洞#

这里提到的 0day(Zero-Day,零日)漏洞,并不是某一种特定类型的漏洞。

它描述的其实是一个漏洞所处的“时间状态”。

简单来说:

当一个漏洞已经存在,但软件厂商还不知道它,或者还没有来得及提供有效修复时,这个漏洞就可能被称为 0day 漏洞。

“Zero-Day”这个名字中的“0”,可以理解为:

防御方用于修复这个问题的时间是 0 天。

也就是说,当攻击者已经掌握利用方式,而厂商和用户还没有补丁可用时,防守方几乎没有传统意义上的“更新系统就能解决”的机会。

Note

这里有三个容易混淆的概念:0day 漏洞指尚未得到有效修复的未知或新发现漏洞;0day Exploit 指针对它编写的利用方法或代码;0day Attack 则是攻击者实际使用这类漏洞利用发动的攻击。三者分别对应“弱点”“利用方式”和“实际攻击行为”。

例如,一个研究人员发现了某软件中的严重内存漏洞,但没有公开,也没有通知厂商。

此时:

漏洞已经存在
↓
厂商尚不知情
↓
没有补丁
↓
攻击者如果掌握利用方法
↓
就可能发动 0day 攻击

这也是为什么 0day 漏洞通常被认为尤其危险。

普通已知漏洞曝光后,防御方至少可以采取一个最直接的办法:

安装补丁。

但面对 0day 时,这条路可能暂时不存在。

为什么 0day 很难防御#

假设一个已经公开的漏洞被发现。

正常情况下,安全流程可能是:

发现漏洞
↓
厂商分析
↓
发布安全公告
↓
提供补丁
↓
用户安装更新

而 0day 攻击的情况可能是:

攻击者发现漏洞
↓
秘密开发 Exploit
↓
开始攻击
↓
受害者出现异常
↓
安全研究人员发现攻击
↓
厂商才知道漏洞存在
↓
开始开发补丁

也就是说,攻防双方的顺序被反了过来。

攻击者已经开始行动,而防御方甚至还不知道自己应该修什么。

传统杀毒软件和入侵检测系统也可能面临类似问题。

如果某个攻击方式从未出现过,那么基于“已知特征”的检测方法可能没有对应规则。

因此 0day 的危险之处并不仅仅是:

“这个漏洞很厉害。”

而是:

防御方缺少针对这个具体漏洞提前准备好的补丁和检测规则。

不过,“难防”并不代表“完全无法防御”。

现代安全体系不会只依赖“知道漏洞之后打补丁”,还会通过:

  • 最小权限;
  • 浏览器与应用沙箱;
  • DEP / NX;
  • ASLR;
  • EDR 行为检测;
  • 网络隔离;
  • 应用白名单;
  • 异常行为监控;

来限制未知漏洞成功利用之后能够造成的影响。

例如,安全软件可能不知道:

“这是某个从未见过的 0day Exploit。”

但它仍然可能发现:

“一个普通文档程序突然启动了命令解释器,并开始连接陌生服务器。”

这种检测关注的是行为是否异常,而不是必须提前知道漏洞名称。

因此现代安全越来越强调:

即使不知道漏洞在哪里,也要让攻击者利用漏洞之后难以继续行动。

0day 并不会永远是 0day#

“0day”并不是漏洞永久拥有的属性。

一旦漏洞被公开、厂商确认问题并发布补丁,它通常就不再属于严格意义上的 0day。

此后的攻击可能变成:

N-day 漏洞利用。

也就是:

漏洞已经公开,甚至已经存在补丁,但仍然有人没有及时更新系统。

现实中,这种情况其实非常常见。

Tip

0day 并不会永远是 0day。 一旦漏洞公开、厂商确认问题并发布补丁,后续围绕它展开的攻击通常就更接近 N-day 漏洞利用。此时真正的问题往往不再是“有没有补丁”,而是“补丁有没有真正部署”。

很多大规模网络攻击并不需要昂贵的 0day。

攻击者只需要寻找:

已经公开漏洞
+
已经存在 Exploit
+
仍未安装补丁的设备

就可能继续发动攻击。

WannaCry 就非常适合用来理解这种区别。

它爆发时,Microsoft 已经发布了对应 SMB 漏洞的安全更新。

因此 WannaCry 所利用的并不是“当时还没有修复方案的 0day”,而是:

已经存在补丁,但大量设备尚未完成更新的已知漏洞。

这也说明了一个很重要的现实:

0day 最危险的地方是“还不知道怎么修”,而已知漏洞最危险的地方则往往是“明明已经能修,却还没有修”。

它并不是依靠“一个超级漏洞”完成全部攻击,而是把多个漏洞利用环节与不同攻击能力组合在一起。

这种思路后来常被称为漏洞利用链:

进入目标系统
↓
提升权限
↓
绕过限制
↓
在内部继续传播
↓
接触工业控制软件
↓
修改控制逻辑

攻击链中的不同漏洞利用环节各自解决一部分问题,组合起来就可能突破原本彼此隔离的多层防线。

这也是为什么 0day 尤其具有价值:防御方在漏洞尚未公开、补丁尚未普及之前,往往很难针对性阻断这一环。

它最终影响的是现实世界中的工业设备。

Stuxnet 的真正目标:核设施中的工业设备#

Stuxnet 最特殊的地方,还在于它并不是为了随机感染尽可能多的电脑。

后续研究普遍认为,它的主要目标是伊朗纳坦兹(Natanz)的铀浓缩设施。

Stuxnet 会检查目标系统中是否存在特定的 Siemens 工业控制软件、变频器以及符合特定运行条件的设备。只有当环境与预设目标高度吻合时,它才会进一步修改控制逻辑。

这意味着它并不是:

“感染之后就立刻破坏。”

而更像是:

进入系统
↓
识别工业控制环境
↓
确认设备与运行条件
↓
只有目标符合预设条件
↓
修改控制逻辑
↓
影响离心机等物理设备

这种高度针对性的设计,也是 Stuxnet 与普通蠕虫最明显的区别之一。

它可以在多种 Windows 系统中传播,但真正准备执行工业破坏载荷的环境却非常具体。

这也是为什么 Stuxnet 经常被视为现代“网络武器”概念的重要分水岭:恶意代码的目标已经不只是窃取数据或破坏计算机,而是通过控制软件进一步影响现实世界中的工业过程。

这意味着恶意软件第一次非常明确地展示出:

数字世界中的代码,可以直接改变现实世界中的物理过程。

Stuxnet 之后,网络攻击开始越来越频繁地与国家安全、工业安全和关键基础设施联系在一起。


APT:漏洞更多只是攻击链的初始入口#

随着攻击技术的发展,安全行业开始频繁使用一个术语:

APT——Advanced Persistent Threat,高级持续性威胁。

和早期“发现漏洞 → 发动攻击 → 完成破坏”的模式相比,APT 更强调长期、隐蔽和有明确目标的入侵过程。

攻击者可能先调查目标组织,然后通过钓鱼邮件、暴露在公网的服务、弱口令或软件漏洞获得最初访问权限。

之后,他们往往不会立即发动破坏,而是继续:

  • 提升权限;
  • 窃取管理员账号;
  • 横向移动;
  • 建立后门;
  • 搜索高价值系统;
  • 长期窃取数据。

到了这里,单个漏洞已经不再是整个攻击过程的中心。

它只是整个攻击链的入口之一。

APT 也让“攻防战”的不对称性变得更加明显。

防守方需要保护整个组织中的账号、终端、服务器、网络边界和内部系统;攻击者却只需要在其中找到一条能够继续深入的路径。

因此现代防御逐渐不再假设:

“只要把入口堵住,攻击就结束了。”

而是开始强调:

即使攻击者已经进入,也要尽早发现异常、限制横向移动,并阻止攻击继续扩大。

这就是后来纵深防御、零信任、EDR 和持续监控等思路越来越重要的背景之一。

Tip

“零信任”并不是“任何人都不可信”的口号,而是强调:不能仅因为设备或用户已经进入内网,就默认后续访问全部可信。 身份、设备状态、权限和访问行为仍然需要持续验证。


2014:Heartbleed,基础组件漏洞影响整个互联网#

2014 年,**Heartbleed(心脏滴血漏洞)**曝光。

它存在于被大量服务器使用的 OpenSSL 中。

漏洞与 TLS Heartbeat 功能有关。这个功能原本只是为了让通信双方确认连接仍然存活:客户端发送一小段数据,服务器再把这段数据原样返回。

问题出在长度检查。

可以把一次正常请求理解成:

我发送了 5 个字节,
请把这 5 个字节返回给我。

而存在漏洞的实现没有认真核对“实际收到多少数据”和“对方声称有多少数据”是否一致。

于是攻击者可以实际只发送很短的数据,却声明:

我发送了 5 个字节,
但请返回 65535 个字节。

服务器为了凑够这个长度,就可能继续读取相邻内存中的其他内容并一并返回。

因此,Heartbleed 本质上不是“攻进去执行代码”,而是一种越界读取:攻击者让程序读出了原本不应该暴露给它的内存。

泄露的数据可能包含 Cookie、用户名、密码甚至其他敏感信息。

Heartbleed 最重要的意义,不只在于漏洞本身。

它揭示了现代互联网的另一个事实:

很多看起来彼此独立的网站,其实依赖着相同的底层基础组件。

于是,一个基础库中的漏洞,就可能同时影响数量庞大的服务器。

这为后来受到广泛关注的软件供应链安全问题埋下了伏笔。


2016:Mirai,把摄像头和路由器变成攻击武器#

随着摄像头、路由器、电视、打印机和各种智能设备接入互联网,一个新的攻击面开始出现:

IoT——物联网设备。

很多设备为了降低成本和简化部署,存在默认密码、无法更新固件、开放不必要服务、硬编码凭据等问题。

2016 年,Mirai Botnet 让这一问题彻底进入公众视野。

Mirai 会扫描互联网上的设备,并尝试使用一批常见默认用户名和密码登录。

这里并不一定存在复杂的“程序漏洞”。

很多设备出厂时预设了固定账号,用户又从未修改密码;有些设备甚至把管理服务直接暴露在公网。于是攻击者只需要不断尝试常见凭据,就可能直接获得远程登录权限。

它的逻辑更像:

扫描设备
↓
发现远程管理服务
↓
尝试默认账号 / 弱口令
↓
登录成功
↓
植入 Mirai

这说明安全问题并不总来自代码错误。

不安全的默认配置和身份认证设计,同样可以形成大规模攻击面。

一旦成功,这些摄像头、路由器和 DVR 就会被纳入僵尸网络。

之后,它们可以被统一用于发动大规模 DDoS。

Mirai 最值得记住的一点是:

互联网攻击使用的“计算资源”,已经不再局限于电脑和服务器。

一台无人关注的摄像头,也可能成为攻击网络的一部分。


2017:WannaCry,把网络蠕虫和勒索软件合二为一#

2017 年,**WannaCry(想哭)**爆发。

它成为现代互联网安全史上最著名的恶意软件之一。

WannaCry 利用了 Windows SMB 协议漏洞,其中最广为人知的漏洞利用方式就是 EternalBlue(永恒之蓝)。

Note

这里也很容易混淆概念:445 是端口,SMB 是协议,漏洞存在于具体实现中,而 EternalBlue 是针对其中漏洞的利用方式之一。 因此,“445 端口就是永恒之蓝漏洞”并不是严谨的说法。

SMB 常见于 TCP 445 端口。

SMB 本身是 Windows 中用于文件和资源共享的重要协议,问题并不是“445 端口天然有毒”,而是旧版 SMB 实现中曾存在严重的内存处理缺陷。

EternalBlue(永恒之蓝)利用的核心思路,可以简单理解为:

向存在缺陷的 SMB 服务发送经过特殊构造的网络数据,让系统在处理这些数据时发生内存破坏,最终获得远程代码执行能力。

也就是说,攻击者并不需要先登录系统。

只要目标主机的 SMB 服务暴露在网络中、系统版本存在漏洞并且没有安装补丁,就可能在处理恶意网络请求时被直接攻破。

因此 WannaCry 真正可怕的地方,不只是“它会加密文件”,而是 EternalBlue 给了它一个能够自动进入下一台机器的传播入口。

WannaCry 的危险之处在于,它同时具有两种能力:

第一种是蠕虫传播。

它会扫描其他存在漏洞的 Windows 主机并尝试自动感染。

第二种是勒索。

感染之后,它会加密用户文件并索要赎金。

于是传播流程变成了:

扫描 445
↓
利用 SMB 漏洞
↓
进入系统
↓
加密文件
↓
继续扫描下一台设备

它把两个时代的恶意软件特征结合到了一起:

2000 年代的高速网络蠕虫 + 2010 年代的勒索软件。

也正因如此,WannaCry 能够在短时间内对全球大量医院、企业、学校和机构造成影响。

从攻防角度看,WannaCry 还有一个格外值得注意的地方:

防守方其实已经拥有补丁。

Microsoft 在 WannaCry 大规模爆发之前已经发布了针对相关 SMB 漏洞的安全更新,但现实中的大量设备并没有及时安装。

于是,这场攻防并不是“攻击者掌握了防守方完全不知道的秘密”,而是变成了另一种竞赛:

防守方发布补丁
↓
用户是否及时更新?
↓
攻击者开始大规模扫描
↓
尚未更新的设备被感染

这说明补丁发布并不等于漏洞风险自动消失。

在很多现实事件中,防守方真正需要争取的是:

能否在攻击者完成大规模武器化和扫描之前,把修复真正部署到足够多的设备上。


NotPetya:看起来像勒索软件,但更接近破坏程序#

不久之后,又出现了 NotPetya。

它表面上看起来很像勒索软件。

系统被感染后,会显示勒索信息。

但 NotPetya 的核心行为并不只是“加密几个用户文件”,而会破坏磁盘相关数据结构,并利用企业网络中的凭据和漏洞继续横向传播。

NotPetya 付款后也几乎无法恢复数据#

NotPetya 看起来很像传统勒索软件:

系统被感染后会显示勒索信息,并要求受害者支付比特币。

但研究人员分析其加密与密钥恢复机制后发现了一个关键问题:

它并没有保留一套正常、可行的解密流程。

传统勒索软件如果真的以“收钱”为目的,就必须保留某种方式,让攻击者在收到付款后能够为受害者恢复数据,否则商业模式无法成立。

也就是说:

生成加密密钥
↓
加密受害者数据
↓
保留恢复密钥所需的信息
↓
受害者付款
↓
攻击者提供解密能力

但 NotPetya 并不是这样。

其勒索界面中显示的所谓安装 ID,并没有像正常勒索软件那样保存恢复密钥所需要的有效信息,而更接近随机生成的数据。

Note

这也是为什么 NotPetya 通常不被简单理解成“一个写坏了的勒索软件”。更常见的判断是:它从设计上就更接近破坏程序,勒索界面只是外衣。

受害者即使支付赎金,也不能够完全恢复数据。它的勒索界面更像是一层伪装,而不是一个真正可以在付款后完成恢复的商业勒索流程。

结果就是:

数据被破坏 / 加密
↓
显示勒索信息
↓
受害者付款
↓
攻击者也无法据此还原正确密钥
↓
数据依然无法正常恢复

这也是为什么 NotPetya 常被归类为 Wiper——数据擦除 / 破坏型恶意软件,而不是普通意义上的勒索软件。

这个事件提醒人们:

恶意软件表面展示的“目的”,不一定是真正目的。不要轻易相信黑客给出的条件。

它可能只是把纯粹的“破坏”行为美其名曰“勒索”,或者说,它只是单纯想要受害者交钱,至于之后的事情概不负责。


勒索软件从单一恶意程序升级成企业级入侵行动#

WannaCry 之后,勒索软件继续快速演化。

早期勒索程序更依赖大规模随机感染。

现代勒索攻击则越来越倾向于:

先进入企业网络,再进行长期准备。

攻击者可能通过:

  • VPN 漏洞;
  • RDP 弱口令;
  • 钓鱼邮件;
  • Web 漏洞;
  • 被盗账号;

获得最初访问权限。

随后不会立即加密文件,而是先横向移动、获取管理员权限、寻找备份服务器、窃取数据并关闭安全软件。

最后再同时加密大量设备。

这时,勒索软件已经不再只是一个孤立运行的恶意程序。

它变成了整个网络入侵行动的最后阶段。

同时,“双重勒索”也开始流行:

不付款,不仅不给解密工具,还可能公开已经窃取的数据。


供应链攻击:恶意代码开始藏进“正常软件”#

现代软件开发越来越依赖第三方组件。

一个普通应用背后可能依赖:

  • npm 软件包;
  • Python 库;
  • Java 组件;
  • Docker 镜像;
  • CI/CD 插件;
  • 第三方 SDK。

于是攻击者开始采用另一种思路:

如果一千家公司都使用同一个软件,那么不一定要逐个攻击这一千家公司。

只要攻击它们共同信任的软件供应链即可。

2020 年曝光的 SolarWinds 事件就是这一领域极具代表性的案例。

攻击者影响了软件构建或更新链路,使恶意代码进入正常软件版本。

以 SolarWinds 事件为例,真正进入受害环境的恶意后门后来常被称为 SUNBURST。它并不是靠用户下载“可疑恶意文件”进入系统,而是跟随正常软件更新一起被安装。

这使供应链攻击和传统恶意软件传播方式形成鲜明对比:

传统恶意软件努力伪装成“可信软件”,而供应链攻击则试图直接进入“可信软件本身”。

传统攻击往往发生在用户下载安装软件之后,而供应链攻击则把目标向前移动到了“软件是如何被生产出来的”这一环节。

可以把正常链路理解为:

源代码
↓
构建系统
↓
签名 / 打包
↓
官方更新服务器
↓
用户安装

如果攻击者控制了其中某个关键环节,就可能让恶意代码在发布前进入最终版本。

这样一来,用户看到的可能依然是:

  • 官方网站;
  • 正常版本号;
  • 合法更新程序;
  • 正常安装流程。

但实际安装包中已经包含后门。

用户通过官方渠道安装更新,却可能同时把后门带入企业网络。

这种攻击最危险的地方在于,它利用的是:信任。

陌生程序容易被警惕,但官方更新通常会被认为可靠。

供应链攻击恰恰试图进入这个可信链条内部。

Tip

供应链攻击最值得警惕的一点,并不是“用户下载了来历不明的软件”,恰恰相反:用户可能完全遵循正常流程,从官方渠道安装了看起来可信的更新。 问题发生在信任链更上游的位置。


2021:Log4Shell,一个日志组件震动互联网#

2021 年出现的 Log4Shell(CVE-2021-44228) 是现代漏洞史上的代表性事件。

问题来自 Java 生态中广泛使用的日志组件 Log4j。

很多服务器甚至不知道自己间接使用了它。

Log4Shell 的核心问题出在 Log4j 某些版本会对日志内容中的特殊表达式继续进行解析。

正常情况下,日志组件的职责只是“把字符串记下来”。

例如:

用户登录失败:Alice

理论上,这段内容应该原样写进日志。

但存在漏洞的版本会把某些特殊格式的字符串理解成“需要继续解析的指令”,并可能进一步触发 JNDI 资源查找。

这就导致一个非常危险的边界被打破:

原本只是要被记录的数据,开始影响程序接下来要做什么。

在特定条件下,这种远程资源查找可能进一步导致攻击者控制代码执行流程。

因此,Log4Shell 和 SQL 注入在思想上其实有一点相似:都是本应作为数据处理的内容,被错误地赋予了指令能力。

漏洞曝光后,攻击者迅速开始自动扫描互联网上存在漏洞的服务器。

Log4Shell 很能体现现代攻防节奏究竟有多快。

漏洞公开之后,攻击者可以迅速把公开信息编写成扫描和利用程序;与此同时,防守方则需要完成资产排查、确认依赖关系、升级组件、临时缓解、监控异常请求等一系列工作。

于是双方争夺的不只是“谁懂这个漏洞”,而是:

谁能更快把知识转化成行动。

攻击方希望在补丁和缓解措施普及之前找到更多目标,防守方则希望在大规模利用发生之前确认自己究竟哪些系统受到影响。

一旦成功获得代码执行能力,攻击往往不会停止在“证明漏洞存在”。

攻击者可能进一步下载:

  • 挖矿程序;
  • 远程控制木马;
  • 僵尸网络程序;
  • 勒索软件;
  • 其他后门。

这里也能看出现代恶意软件的一个重要特点:模块化。

最先利用 Log4Shell 的代码可能只负责“打开入口”,真正的恶意功能则由后续下载的程序承担。

例如:

Log4Shell
↓
获得初始执行能力
↓
下载器 / Loader
↓
木马、矿工、勒索程序、Botnet 客户端

所以在现代攻击中,“漏洞利用程序”和“最终恶意软件”往往已经不是同一个东西。

现代攻击链越来越像:

漏洞
↓
初始代码执行
↓
下载器
↓
木马 / 后门
↓
横向移动
↓
窃密 / 挖矿 / 勒索

漏洞只是入口。

恶意软件负责真正完成后续攻击。

Log4Shell 还暴露了另一个现实问题:

企业可能根本不知道自己是否使用了某个存在漏洞的组件。

即使业务应用可能没有直接引用 Log4j,却可能通过框架、库和依赖链间接引入它。

这也推动了 SBOM——Software Bill of Materials,软件物料清单等概念的发展。


攻击面从软件扩展到云、身份系统和硬件#

今天谈到的安全问题,范围已经远远超出传统程序漏洞的范畴。

现代攻击面可能来自:

  • 云平台权限配置错误;
  • OAuth 与身份认证逻辑缺陷;
  • API 越权;
  • Kubernetes 与容器环境配置错误或逃逸漏洞;
  • CI/CD 凭据泄露;
  • 浏览器沙箱逃逸;
  • 虚拟化平台漏洞;
  • 软件依赖漏洞;
  • CPU 微架构问题。

2018 年公开的 Spectre(幽灵漏洞)和 Meltdown(熔断漏洞)就与现代处理器的推测执行机制有关。

现代 CPU 为了提高速度,会尝试提前执行“很可能接下来就要运行”的指令。这种机制叫做推测执行。

即使后来发现猜错了,CPU 也会在逻辑上撤销这些执行结果。

问题在于:

逻辑结果虽然被撤销了,但某些微架构痕迹——例如缓存状态——可能已经留下。

攻击者可以通过测量访问某些内存位置所需的细微时间差,间接推测之前发生过什么。

这就是所谓的侧信道攻击(Side-Channel Attack)。

Note

侧信道攻击并不等于“直接绕过权限读取秘密”。它更像是在观察程序运行时留下的时间、缓存、功耗等痕迹,再从这些痕迹中反推出原本不可见的信息。

什么是侧信道攻击#

传统攻击通常会直接寻找一个“入口”:

缓冲区溢出
SQL 注入
身份验证绕过
权限配置错误

攻击者通过这个入口,直接读取、修改或执行原本不允许进行的操作。

侧信道攻击的思路却完全不同。

它并不一定直接突破权限边界,也不一定让程序执行“错误的功能”。

它观察的是系统运行过程中无意泄露出来的附加信息。

例如:

  • 执行某段代码用了多长时间;
  • 某块数据是否已经进入 CPU 缓存;
  • 芯片执行计算时消耗了多少电力;
  • 设备工作时产生了怎样的电磁辐射;
  • 某些硬件工作时发出了什么声音。

这些信息本来都不是程序准备提供给用户的“输出”。

但攻击者可能通过反复测量和统计,从中推断出隐藏数据。

所以可以把侧信道理解为:

程序没有主动告诉你秘密,但它运行时留下的“痕迹”泄露了秘密。

它和传统漏洞最大的区别,也正在这里。

正常的信息通道可能是:

程序输入
↓
程序处理
↓
程序输出

而侧信道则更像:

程序输入
↓
程序处理
├──→ 正常输出
│
└──→ 时间 / 缓存 / 功耗 / 电磁 / 声音等痕迹
↓
攻击者观察
↓
推测隐藏信息

时间侧信道:程序“快一点”还是“慢一点”也可能泄密#

最直观的一类侧信道是时间侧信道(Timing Side Channel)。

假设一个程序在比较密码时,从第一个字符开始逐个比较:

输入:abcdef
正确:abcxyz

如果前 3 个字符正确,程序就会比“第 1 个字符就错误”的情况多执行几次比较,多消耗一点时间。

理论上,这种差异可能只有极短的时间。

但如果攻击者能够重复请求很多次,并进行统计,就可能发现:

猜错第 1 位 → 平均响应很快
猜对第 1 位 → 平均稍慢
猜对前 2 位 → 又稍慢一点

这样一来,虽然程序从来没有直接告诉攻击者“你猜对了几个字符”,执行时间本身却变成了一种额外的信息通道。

密码、身份验证和密码学实现中都可能出现类似问题。

这也是为什么很多安全敏感代码会采用**恒定时间(Constant-Time)**设计:尽量让不同秘密数据对应的执行路径和耗时保持一致,减少可被观察的差异。

缓存侧信道:CPU 的“记忆”也会留下痕迹#

现代 CPU 的运行速度远高于主内存。

为了避免每次都去较慢的内存中读取数据,处理器会把最近使用的数据保存在速度更快的 Cache——高速缓存 中。

于是,同一份数据可能出现两种情况:

数据已经在 Cache 中
→ 读取很快
数据不在 Cache 中
→ 需要访问更慢的内存
→ 读取较慢

这种时间差对正常用户来说几乎无法察觉,但对程序来说却可以测量。

攻击者因此可能通过观察:

“哪些内存位置现在访问得特别快?”

来反推出:

“受害程序刚才可能访问了哪些数据?”

这就是缓存侧信道的基本思想。

它并不是直接读取另一个程序的秘密,而是观察秘密数据在 CPU 缓存中留下的痕迹。

简化来看:

受害程序访问秘密数据
↓
某些数据进入 Cache
↓
攻击者测量不同位置的访问时间
↓
发现某些位置异常快速
↓
推测受害程序刚刚访问过什么

很多现代微架构攻击都会利用这种原理。

Spectre 与 Meltdown 为什么都离不开侧信道#

回到 Spectre 和 Meltdown。

现代 CPU 为了提高性能,会进行推测执行:

如果处理器认为某条分支很可能会走某个方向,它可能提前执行后面的指令。

如果预测正确,就节省了等待时间。

如果预测错误,CPU 会在逻辑上撤销这些结果。

问题在于:

逻辑结果可以撤销,但微架构中的痕迹未必完全消失。

例如,一段本不应该真正完成的推测执行,可能短暂访问了某个敏感数据,并根据这个数据访问了不同的缓存位置。

即使之后 CPU 宣布:

“刚才那段推测执行无效,结果作废。”

缓存状态可能已经发生变化。

于是就出现这样的过程:

CPU 推测执行
↓
短暂接触敏感数据
↓
根据秘密值访问不同数据
↓
秘密相关的数据进入 Cache
↓
CPU 发现预测错误
↓
逻辑执行结果被撤销
↓
Cache 状态仍然存在差异
↓
攻击者测量访问时间
↓
反推出秘密数据

这一步非常关键:

推测执行负责让“不应该被正常读取的数据”短暂参与计算,侧信道负责把这个秘密带出权限边界。

如果没有侧信道,即使 CPU 在内部短暂接触过秘密,攻击者也未必能够得到它。

因此,Spectre 与 Meltdown 并不能简单理解成“CPU 直接把内存交给攻击者”。

它们真正巧妙的地方,在于:

瞬态执行 + 微架构痕迹 + 侧信道读取。

Spectre 和 Meltdown 的思路并不完全相同#

虽然两者经常被放在一起讨论,但其核心问题并不完全一样。

Meltdown 更接近于利用处理器在权限检查最终生效之前,短暂执行了本不应该执行的内存访问。

可以粗略理解为:

尝试读取高权限内存
↓
CPU 短暂继续执行
↓
秘密影响 Cache
↓
权限检查失败
↓
正常结果被丢弃
↓
通过 Cache 侧信道恢复秘密

而 Spectre 更偏向于欺骗 CPU 的分支预测机制,让受害程序在推测执行阶段沿着一个本来不应该走的路径执行,并留下与秘密相关的缓存痕迹。

可以简化为:

训练 CPU 分支预测
↓
诱导错误推测
↓
受害程序短暂执行错误路径
↓
访问与秘密相关的数据
↓
Cache 状态改变
↓
攻击者测量 Cache
↓
推测秘密

所以,Meltdown 更突出“权限隔离被瞬态执行绕过”,Spectre 更突出“诱导受害程序错误推测执行”。

但两者最终把秘密带出来时,都严重依赖侧信道。

侧信道并不只有“时间”和“缓存”#

侧信道攻击远比 CPU 缓存更加宽泛。

如果一个设备在处理秘密数据时,会在物理世界中留下可测量差异,就可能形成侧信道。

例如:

功耗侧信道#

芯片进行不同运算时,耗电量会略有不同。

如果攻击者能够精确测量智能卡、嵌入式设备或加密芯片的功耗波形,就可能分析其内部正在进行什么运算。

在密码学硬件研究中,这类技术尤其重要。

电磁侧信道#

电子设备运行时会产生电磁辐射。

不同计算活动可能形成不同的电磁特征。

在非常精细的测量条件下,攻击者可能利用这些差异分析设备内部操作。

声学侧信道#

有些设备在不同工作状态下会产生不同声音。

键盘敲击、硬盘活动,甚至某些电子元件在高负载时产生的微弱噪声,都可能成为信息来源。

这类攻击听起来很像科幻,但其背后的思想和缓存侧信道完全一样:

不观察程序“告诉你什么”,而观察程序运行时“无意间泄露了什么”。

为什么侧信道攻击特别难防#

传统漏洞往往可以定位到一段明确的错误代码:

这里少了长度检查
这里没有转义输入
这里错误地开放了权限

修复时,只需要改变相应逻辑。

而侧信道往往来自更深层的系统行为。

例如:

  • 缓存本来就是为了让 CPU 更快;
  • 分支预测本来就是为了提升性能;
  • 功耗是芯片运行必然产生的现象;
  • 执行时间不可能真正做到完全没有任何波动。

也就是说,侧信道经常利用的不是一个单纯的“Bug”,而是:

性能优化、物理规律和安全隔离之间的矛盾。

因此防御也更加复杂。

常见思路包括:

  • 使用恒定时间算法;
  • 避免秘密数据影响可观察的控制流;
  • 在不同安全域之间加强缓存隔离;
  • 对推测执行增加限制;
  • 更新 CPU 微码和操作系统;
  • 在密码学硬件中加入功耗和电磁防护;
  • 对高度敏感环境进行物理隔离。

但这些措施往往都会付出成本。

最典型的成本就是:性能。

很多侧信道之所以存在,恰恰是因为计算机为了跑得更快,采用了缓存、预测执行、乱序执行等优化。

而为了安全重新限制这些优化,就可能牺牲一部分速度。

因此 Spectre 和 Meltdown 之所以具有里程碑意义,不只是因为它们“能偷数据”。

更重要的是,它们向整个计算机行业展示了一个新的安全边界:

即使软件权限检查完全正确,硬件为了提高性能而留下的微小痕迹,也可能成为跨越隔离边界的信息通道。

这类问题已经不再只是“某个程序员写错了一行代码”。

从攻防演化的角度看,这又是一次边界变化。

当软件层面的权限检查、内存保护和沙箱越来越完善时,攻击研究并没有停止,而是继续向更底层寻找可以观察和利用的差异;防守方也不得不把原本只被视为“性能实现细节”的缓存、推测执行和微架构状态纳入安全设计。

于是攻防双方争夺的边界,从“程序允许做什么”,进一步深入到了:

硬件在执行这些程序时,会不会无意间泄露什么。

由此,安全研究关注的范围也从应用程序和操作系统,进一步延伸到 CPU 微架构、硬件实现以及现实世界中的物理现象。


防御也在不断进化#

攻击技术在进化,防御机制同样如此。

而且两者并不是彼此独立发展的。

很多今天习以为常的安全机制,本身就是过去一次次攻击留下的结果;反过来,每增加一道防线,也会改变攻击者下一步选择的路径。

早期程序几乎没有今天常见的内存保护措施。

后来逐渐出现:

  • DEP / NX;
  • ASLR;
  • Stack Canary;
  • CFG;
  • 浏览器沙箱;
  • 权限隔离。

这让现代漏洞利用越来越难依靠单个问题完成整个攻击。

很多攻击需要组合多个漏洞和技术:

信息泄露
↓
绕过 ASLR
↓
获得代码执行
↓
逃逸沙箱
↓
提升权限

这就是所谓的 Exploit Chain——漏洞利用链。

单个漏洞可能被防御机制限制,但多个漏洞组合起来,仍然可能形成完整攻击能力。

这也很好地体现了攻防双方长期演化的关系:

缓冲区溢出普及
↓
Stack Canary / DEP 出现
↓
攻击者寻找绕过方式
↓
ASLR 提高地址预测难度
↓
攻击者结合信息泄露绕过 ASLR
↓
沙箱与权限隔离继续加强
↓
攻击者组合多个漏洞形成 Exploit Chain

安全机制很少能“一劳永逸”地终结某类攻击。

更常见的结果是:

防御提高攻击成本,攻击者再寻找新的组合方式,而新的攻击又推动下一代防御出现。


病毒、蠕虫、木马和勒索软件,到底有什么区别#

随着恶意软件种类越来越多,几个常见概念也有必要区分。

病毒 Virus#

病毒最大的特点是:

依附其他文件或对象,并进行自我复制。

CIH 就是非常典型的文件感染型病毒。

蠕虫 Worm#

蠕虫强调:

独立运行,并通过网络或其他渠道主动传播。

典型代表包括 Morris Worm、Code Red、Slammer、Blaster、Conficker,以及 WannaCry 中的蠕虫传播能力。

木马 Trojan#

木马通常不强调自我复制。

它更重视:

伪装、远程控制、长期驻留和窃取数据。

勒索软件 Ransomware#

勒索软件的核心目标是:

让受害者失去数据或系统访问能力,并索取赎金。

现代勒索攻击还经常在加密之前先窃取数据。

僵尸网络 Botnet#

僵尸网络并不是一种单独病毒,而是一种控制模式。

大量感染设备被统一管理,并用于 DDoS、挖矿、发送垃圾邮件或继续传播恶意软件。


从 CIH 到熊猫烧香:为什么这两个案例值得放在一起看#

如果单独看 CIH 和熊猫烧香,它们都可以被大众简单地称作“电脑病毒”。

但放进整个恶意软件发展史里,它们代表的其实是两个完全不同的时代。

CIH 代表的是:

破坏型文件病毒时代。

攻击者更关注感染、隐藏、复制和破坏效果。

而熊猫烧香代表的则是:

恶意软件开始明显黑产化的时代。

攻击者逐渐发现,保持一台受害计算机继续运行,比直接毁掉它更有价值。

于是目标发生了变化:

CIH:
计算机 = 被破坏的目标
熊猫烧香时代:
计算机 = 可以持续利用的资产

再往后,恶意软件继续沿着这条路线演化:

文件病毒
↓
网络蠕虫
↓
盗号木马
↓
僵尸网络
↓
勒索软件
↓
企业级勒索
↓
完整网络犯罪产业链

从这个角度看,CIH 和熊猫烧香之间相隔的几年,其实正好见证了恶意软件目的从“破坏”向“控制和获利”的转变。


四十年的演化,可以浓缩成一条时间线#

如果把整个发展过程压缩成一条时间线,大致可以看到:

1980s
早期网络漏洞
↓
1988
Morris Worm
漏洞利用开始支持自动传播
↓
1990s
文件病毒、宏病毒、缓冲区溢出逐渐成熟
↓
1998–1999
CIH
文件感染 + 强破坏型病毒
↓
1999
Melissa
宏病毒 + 邮件自动传播
↓
2000
ILOVEYOU
社会工程 + 邮件传播
↓
2001–2004
Code Red / Nimda / Slammer / Blaster / Sasser
网络漏洞驱动的高速蠕虫时代
↓
2005–2007
木马、盗号、僵尸网络与黑产兴起
↓
2006–2007
熊猫烧香
文件感染 + 网络传播 + 黑产化
↓
2008
Conficker
漏洞 + 弱口令 + 僵尸网络
↓
2010
Stuxnet
0day 漏洞 + 工业控制攻击
↓
2010s
APT、木马、勒索软件持续发展
↓
2016
Mirai
IoT 僵尸网络
↓
2017
WannaCry / NotPetya
漏洞利用 + 网络传播 + 勒索 / 破坏
↓
2020s
供应链攻击、企业级勒索、云与身份攻击
↓
2021
Log4Shell
基础组件漏洞 + 自动化后续投毒
↓
今天
漏洞利用链 + 恶意软件模块化 + 完整攻击产业链

这条时间线里最明显的变化,并不是“病毒越来越厉害”这么简单。

真正发生变化的是攻击者的目标。

最早:

病毒想复制自己。

后来:

蠕虫想传播得更快。

再后来:

木马想长期控制机器。

接着:

僵尸网络想把机器变成资源。

而今天:

攻击者往往希望控制整个企业网络,并从数据、勒索、资源或情报中持续获利。


结语:漏洞是入口,恶意软件决定“进去之后做什么”#

如果只研究漏洞,很容易把网络安全理解成“程序员写错了代码”。

如果只研究病毒,又容易把安全理解成“不要运行陌生文件”。

但互联网安全真正的发展过程,其实是两者不断结合。

漏洞决定:

攻击者能不能进去。

恶意软件决定:

进去之后能做什么。

Morris Worm 让人们第一次看到利用网络弱点实现自动传播的可能。

CIH 展示了传统文件病毒惊人的破坏能力。

Melissa 和 ILOVEYOU 证明邮件与社会工程学同样能够制造大规模传播。

Code Red、Slammer、Blaster 和 Sasser 把利用网络漏洞实现的自动化感染推向高峰。

熊猫烧香则见证了恶意软件从“破坏电脑”逐渐走向“控制电脑并获利”的转折。

Conficker 让感染设备成为长期控制的僵尸网络节点。

Stuxnet 将恶意代码的影响带入工业世界。

Mirai 让摄像头和路由器成为攻击资源。

WannaCry 把高速蠕虫与勒索软件结合起来。

而到了 Log4Shell 和现代供应链攻击时代,一个漏洞往往只是完整攻击链中的第一步。

因此,现代安全的目标早已不再只是:

“不要中病毒。”

而是:

即使某个漏洞被利用、某台设备被感染,也要让攻击难以继续扩散,并尽早发现和阻断整条攻击链。

如果把这四十多年的演化史,重新放在“攻防”视角下观察,就会发现几乎所有重要节点都具有相似的结构:

新的攻击方式出现
↓
暴露原有防线的不足
↓
防守方增加新的安全机制
↓
攻击成本提高
↓
攻击者寻找新的入口或绕过方法
↓
下一轮攻防开始

Morris Worm 推动了事件响应体系的发展,网络蠕虫推动补丁和自动更新普及,内存漏洞推动 DEP、ASLR 等保护机制成熟,APT 又推动防守方从“守住入口”转向持续监控和纵深防御,而 Spectre、Meltdown 甚至把这场博弈带到了 CPU 微架构层面。

所以,这段“演化史”说到最后,就是一场“攻防战”:

攻击者不断证明旧防线哪里还不够,而防守方则不断把这些教训变成下一层防线。

这或许才是过去四十多年互联网漏洞与恶意软件发展史留给今天最重要的一条经验。

参考资料#

本文主要参考 Microsoft、CERT/CC、OWASP、CISA、NIST、Apache 等机构发布的安全公告、漏洞说明与技术资料:

  1. Carnegie Mellon University Software Engineering Institute — Fostering Growth in Professional Cyber Incident Management
    介绍 1988 年 Morris Worm 事件以及 CERT/CC 成立的历史背景。
    SEI:Morris Worm 与 CERT/CC 历史

  2. OWASP Cheat Sheet Series — SQL Injection Prevention Cheat Sheet
    介绍 SQL 注入的形成原因、参数化查询以及数据库输入与 SQL 指令混淆的问题。
    OWASP:SQL Injection Prevention Cheat Sheet

  3. OWASP Cheat Sheet Series — Cross Site Scripting Prevention Cheat Sheet
    介绍 XSS 的基本原理以及输出编码、HTML 上下文和浏览器脚本执行之间的关系。
    OWASP:Cross Site Scripting Prevention Cheat Sheet

  4. OWASP Cheat Sheet Series — OS Command Injection Defense Cheat Sheet
    介绍命令注入中用户输入被错误解释为操作系统命令或参数的原理。
    OWASP:OS Command Injection Defense Cheat Sheet

  5. Microsoft Security Bulletin MS08-067 — Vulnerability in Server Service Could Allow Remote Code Execution
    Conficker 等恶意程序所利用的重要 Windows Server Service 远程代码执行漏洞。
    Microsoft:MS08-067

  6. Microsoft Security Intelligence — Win32/Conficker threat description
    介绍 Conficker 的网络传播、弱口令、可移动设备传播以及关闭安全服务等行为。
    Microsoft:Win32/Conficker

  7. Heartbleed — The Heartbleed Bug
    介绍 OpenSSL Heartbeat 长度校验错误及其导致的越界内存读取问题。
    Heartbleed Bug 官方说明

  8. Microsoft Security Bulletin MS17-010 — Security Update for Microsoft Windows SMB Server
    介绍 SMBv1 中可导致远程代码执行的信息处理漏洞,是理解 EternalBlue 与 WannaCry 传播机制的重要资料。
    Microsoft:MS17-010

  9. Microsoft Security Blog — WannaCrypt ransomware worm targets out-of-date systems
    Microsoft 对 WannaCry/WannaCrypt 的传播机制、SMB 漏洞利用以及蠕虫行为的技术分析。
    Microsoft Security Blog:WannaCrypt ransomware worm targets out-of-date systems

  10. Microsoft Security Blog — New ransomware, old techniques: Petya adds worm capabilities
    介绍 2017 年 Petya/NotPetya 事件中的网络传播、漏洞利用以及破坏行为。
    Microsoft Security Blog:Petya adds worm capabilities

  11. CISA — Active Exploitation of SolarWinds Software
    介绍 SolarWinds Orion 供应链攻击事件以及 SUNBURST 后门相关情况。
    CISA:Active Exploitation of SolarWinds Software

  12. Apache Log4j — Release Notes
    Apache 官方关于 CVE-2021-44228、Message Lookup、JNDI 功能以及后续安全修复的说明。
    Apache Log4j:Release Notes

  13. CISA — Mitigating Log4Shell and Other Log4j-Related Vulnerabilities
    CISA、FBI、NSA 等机构联合发布的 Log4Shell 技术说明与缓解建议。
    CISA:Mitigating Log4Shell and Other Log4j-Related Vulnerabilities

  14. NIST Computer Security Resource Center — Side-Channel Attack
    NIST 对侧信道攻击的定义,涵盖执行时间、功耗、电磁辐射和声学信息等侧信道。
    NIST:Side-Channel Attack

  15. NIST CSRC — Side Channels: Attacks, Defences, and Evaluation Schemes
    介绍时间侧信道、功耗分析、电磁侧信道及相关防御方法。
    NIST:Side Channels — Attacks and Defences

  16. Intel — Intel Analysis of Speculative Execution Side Channels
    Intel 对 Spectre、Meltdown 以及推测执行侧信道问题的技术说明。
    Intel:Analysis of Speculative Execution Side Channels

  17. Microsoft Learn — SMB security hardening in Windows Server and Windows Client
    介绍现代 Windows 中 SMB 协议的安全强化措施。
    Microsoft Learn:SMB security hardening

  18. Microsoft Learn — Control SMB signing behavior
    介绍 SMB Signing 的工作方式、配置方法以及其在防止中间人攻击中的作用。
    Microsoft Learn:Control SMB signing behavior

  19. Microsoft Learn — SMB Security Enhancements
    介绍较新 Windows Server 与 Windows 客户端中的 SMB 安全机制和协议增强。
    Microsoft Learn:SMB Security Enhancements

Note

本文以互联网安全技术的发展脉络为主,并非针对单一漏洞或恶意软件的完整技术分析。部分历史事件存在多个病毒变种、漏洞编号或不同厂商命名,因此正文对其工作机制进行了适当简化。若需要进一步研究某一具体漏洞,建议以对应厂商安全公告、CVE 记录及 CERT/CISA 等机构发布的技术资料为准。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

从 Morris 到 Log4Shell:互联网安全四十年攻防简史
https://inn.nightbugclub.cn/posts/study/260920-internet-vulnerability-malware-history/
作者
Eternity_Riguru
发布于
2026-09-20
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
Eternity_Riguru
Wish you have a nice day!
What am I doing?
在线

正在电脑前

公告
因平日较忙,更新频率低,敬请谅解。
分类
标签
最新动态
站点统计
文章
20
分类
4
标签
16
总字数
324,954
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.16.9
文章许可
CC BY-NC-SA 4.0
1
互联网早期:安全并不是第一优先级
2
1988:Morris Worm,让网络攻击第一次实现自动传播
3
1990 年代:病毒与漏洞利用开始同时成熟
4
1998—1999:CIH,破坏型文件病毒时代的代表
5
1999—2000:Melissa 与 ILOVEYOU,邮件和社会工程学接管传播
6
Web 的兴起:Web 应用成为新的漏洞重灾区
7
2001—2004:高速网络蠕虫
Code Red:不需要用户点击的攻击
Nimda:多传播渠道开始出现
SQL Slammer:几百字节代码也能影响全球网络
Blaster 与 Sasser:普通 Windows 用户开始直接感受到漏洞利用型攻击
8
2000 年代中后期:恶意软件开始从“破坏”转向“赚钱”
9
2006—2007:熊猫烧香,从破坏型病毒走向黑产化恶意软件
10
病毒、蠕虫和木马的边界开始模糊
11
僵尸网络:感染本身不再是最终目标
12
2008:Conficker,漏洞、弱口令与僵尸网络的结合
13
2010:Stuxnet,让恶意代码进入物理世界
什么是 0day 漏洞
Stuxnet 的真正目标:核设施中的工业设备
14
APT:漏洞更多只是攻击链的初始入口
15
2014:Heartbleed,基础组件漏洞影响整个互联网
16
2016:Mirai,把摄像头和路由器变成攻击武器
17
2017:WannaCry,把网络蠕虫和勒索软件合二为一
18
NotPetya:看起来像勒索软件,但更接近破坏程序
NotPetya 付款后也几乎无法恢复数据
19
勒索软件从单一恶意程序升级成企业级入侵行动
20
供应链攻击:恶意代码开始藏进“正常软件”
21
2021:Log4Shell,一个日志组件震动互联网
22
攻击面从软件扩展到云、身份系统和硬件
什么是侧信道攻击
时间侧信道:程序“快一点”还是“慢一点”也可能泄密
缓存侧信道:CPU 的“记忆”也会留下痕迹
Spectre 与 Meltdown 为什么都离不开侧信道
Spectre 和 Meltdown 的思路并不完全相同
侧信道并不只有“时间”和“缓存”
为什么侧信道攻击特别难防
23
防御也在不断进化
24
病毒、蠕虫、木马和勒索软件,到底有什么区别
病毒 Virus
蠕虫 Worm
木马 Trojan
勒索软件 Ransomware
僵尸网络 Botnet
25
从 CIH 到熊猫烧香:为什么这两个案例值得放在一起看
26
四十年的演化,可以浓缩成一条时间线
27
结语:漏洞是入口,恶意软件决定“进去之后做什么”
28
参考资料
文章目录
1
互联网早期:安全并不是第一优先级
2
1988:Morris Worm,让网络攻击第一次实现自动传播
3
1990 年代:病毒与漏洞利用开始同时成熟
4
1998—1999:CIH,破坏型文件病毒时代的代表
5
1999—2000:Melissa 与 ILOVEYOU,邮件和社会工程学接管传播
6
Web 的兴起:Web 应用成为新的漏洞重灾区
7
2001—2004:高速网络蠕虫
Code Red:不需要用户点击的攻击
Nimda:多传播渠道开始出现
SQL Slammer:几百字节代码也能影响全球网络
Blaster 与 Sasser:普通 Windows 用户开始直接感受到漏洞利用型攻击
8
2000 年代中后期:恶意软件开始从“破坏”转向“赚钱”
9
2006—2007:熊猫烧香,从破坏型病毒走向黑产化恶意软件
10
病毒、蠕虫和木马的边界开始模糊
11
僵尸网络:感染本身不再是最终目标
12
2008:Conficker,漏洞、弱口令与僵尸网络的结合
13
2010:Stuxnet,让恶意代码进入物理世界
什么是 0day 漏洞
Stuxnet 的真正目标:核设施中的工业设备
14
APT:漏洞更多只是攻击链的初始入口
15
2014:Heartbleed,基础组件漏洞影响整个互联网
16
2016:Mirai,把摄像头和路由器变成攻击武器
17
2017:WannaCry,把网络蠕虫和勒索软件合二为一
18
NotPetya:看起来像勒索软件,但更接近破坏程序
NotPetya 付款后也几乎无法恢复数据
19
勒索软件从单一恶意程序升级成企业级入侵行动
20
供应链攻击:恶意代码开始藏进“正常软件”
21
2021:Log4Shell,一个日志组件震动互联网
22
攻击面从软件扩展到云、身份系统和硬件
什么是侧信道攻击
时间侧信道:程序“快一点”还是“慢一点”也可能泄密
缓存侧信道:CPU 的“记忆”也会留下痕迹
Spectre 与 Meltdown 为什么都离不开侧信道
Spectre 和 Meltdown 的思路并不完全相同
侧信道并不只有“时间”和“缓存”
为什么侧信道攻击特别难防
23
防御也在不断进化
24
病毒、蠕虫、木马和勒索软件,到底有什么区别
病毒 Virus
蠕虫 Worm
木马 Trojan
勒索软件 Ransomware
僵尸网络 Botnet
25
从 CIH 到熊猫烧香:为什么这两个案例值得放在一起看
26
四十年的演化,可以浓缩成一条时间线
27
结语:漏洞是入口,恶意软件决定“进去之后做什么”
28
参考资料