1. 永恒之黑漏洞:一个让Windows 10瞬间“破防”的幽灵
大家好,我是老张,在安全圈里摸爬滚打了十几年,见过形形色色的漏洞,但像“永恒之黑”(CVE-2020-0796)这样,能直接让一台正常开机的Windows 10电脑瞬间被远程控制的,还真不多。它不像那些需要你点击个链接、打开个文件的漏洞,这个漏洞的可怕之处在于,只要你的电脑开着,并且网络能通,攻击者就能像幽灵一样,悄无声息地溜进来,拿到你电脑的最高权限。今天,我就带大家把这个漏洞掰开揉碎了讲清楚,从它到底是怎么产生的,到我们如何亲手在实验环境里复现它,最后再聊聊怎么防。整个过程,我会尽量用大白话,就算你是刚入门的小白,跟着我的步骤也能看懂、能操作。
这个漏洞的官方名字叫CVE-2020-0796,但安全圈更喜欢叫它“永恒之黑”或者“SMBGhost”。为啥叫“永恒之黑”?这算是对之前那个大名鼎鼎的“永恒之蓝”(EternalBlue)漏洞的一种“致敬”,两者都利用了Windows的SMB协议,破坏力都极其惊人。SMB协议你可能听着陌生,但我说“网上邻居”、“文件共享”你肯定就懂了。咱们在局域网里访问另一台电脑的共享文件夹,靠的就是这个SMB协议。可以说,它是Windows网络里最基础、最核心的服务之一。
“永恒之黑”影响的范围非常精准,主要是Windows 10的1903和1909版本,以及对应的Windows Server 2019。微软在2020年3月紧急发布了补丁。这意味着,如果你的系统是这些版本且没打补丁,那么从2020年3月到现在,你的电脑可能一直处于“裸奔”状态。攻击者完全不需要你的账号密码,就能远程执行任意代码。我当年第一次在内部测试环境验证这个漏洞时,看着自己好端端的Win10虚拟机突然蓝屏,紧接着又被远程添加了用户,那种震撼感至今记忆犹新。下面,我们就一层层揭开它的面纱。
2. 漏洞原理深潜:SMB协议压缩机制中的“数学错误”
要理解这个漏洞,我们得先聊聊SMB 3.1.1协议引入的一个新特性:数据压缩。这个功能的初衷是好的,为了提升大文件传输的效率,在传输前先压缩一下,接收端再解压。问题就出在这个“解压”的环节上,代码在处理压缩数据包时,犯了一个非常低级的“数学错误”——整数溢出。
2.1 关键数据结构:SMB2压缩变换头
当SMB客户端或服务端要发送一个压缩消息时,它会在原始数据前面加一个“压缩变换头”(Compressed Transformation Header)。这个头里有两个至关重要的字段:
OriginalSize:原始数据未压缩时的大小。Offset:压缩后的数据在这个数据包中开始的位置。
接收方(比如服务端)拿到数据包后,会先读取这个头,然后根据 Offset 找到压缩数据的起始位置,再根据 OriginalSize 来申请一块内存,用于存放解压后的数据。听起来流程很正常,对吧?魔鬼藏在细节里。
2.2 漏洞触发点:缺乏校验的整数溢出
漏洞的核心代码逻辑简化后大概是这样的:
// 伪代码,演示漏洞逻辑
uint32_t OriginalSize = ReadFromPacket(); // 从数据包头部读取OriginalSize
uint32_t Offset = ReadFromPacket(); // 从数据包头部读取Offset
// 计算解压缓冲区大小
uint32_t AllocSize = OriginalSize + Offset;
// 申请内存
char* DecompressedBuffer = (char*)SrvNetAllocateBuffer(AllocSize);
// ... 进行解压操作 ...
问题就出在 AllocSize = OriginalSize + Offset 这一行。这里有一个致命的假设:两个32位无符号整数相加,结果永远不会超过32位所能表示的最大值(约42亿)。但是,在计

5264

被折叠的 条评论
为什么被折叠?



