1. 写在前面:为什么一个2017年的漏洞至今还在“作妖”
如果你是做运维或者安全的,一定听说过“永恒之蓝”这个名字。2017年年中,一个名为WannaCry的勒索蠕虫在全球范围内大面积爆发,几乎覆盖当时所有主流Windows系统。一夜之间,大量医疗、制造、教育、政务单位业务停摆,开机就能看到红色勒索界面,文件被加密,数据无法找回——而这一切的源头,正是Windows SMB服务中的一个远程代码执行漏洞,也就是后来被大家叫作“永恒之蓝”的那一组漏洞,官方编号MS17-010,涉及CVE-2017-0143至CVE-2017-0148。
这篇文章想做的“简单分析”,不是教你怎么去攻击别人,而是想帮大家弄清楚三件事:这个漏洞到底是怎么发生的?它为什么能造成这么大影响?以及现在你的内网里如果还有“赤裸裸”暴露着445端口的老机器,应该怎么查、怎么防、怎么收尾。适合的读者包括刚入行的安全工程师、系统运维、网络管理员,也包括只是单纯好奇“永恒之蓝到底是怎么回事”的普通技术爱好者。
我自己在实战中处理过好几次相关事件,复盘之后发现,很多问题的根因其实是共通的:SMBv1没关、补丁漏装、内外网边界端口策略太松。这篇文章里我会把这些细节一并写出来,尽量用大白话讲清楚原理,再给一些能直接用的排查和加固方法。
2. 先搞清楚:永恒之蓝到底是一个什么级别的漏洞
2.1 MS17-010是一组漏洞,不是一个漏洞
很多人把“永恒之蓝”当作一个单一CVE漏洞来记忆,这在实战中会带来很多误导。严格来讲,“永恒之蓝”是一个攻击工具包的内部代号,对应的是微软在2017年3月发布的安全公告MS17-010,其中涵盖了一组SMBv1相关的远程代码执行漏洞。整理一下更直观:
| 漏洞编号 | 漏洞类型 | 简单说明 |
|---|---|---|
| CVE-2017-0143 | SMBv1远程代码执行 | 允许攻击者执行任意代码 |
| CVE-2017-0144 | SMBv1远程代码执行 | 允许攻击者执行任意代码,利用链核心之一 |
| CVE-2017-0145 | SMBv1远程代码执行 | 允许攻击者执行任意代码 |
| CVE-2017-0146 | SMBv1远程代码执行 | 内存破坏导致远程代码执行 |
| CVE-2017-0147 | SMBv1远程代码执行 | 允许攻击者执行任意代码 |
| CVE-2017-0148 | SMBv1远程代码执行 | 内核模式下远程代码执行 |
这组漏洞都位于SMBv1协议的处理链路里,攻击者不需要身份认证,不需要用户交互,只要目标开放了445端口,就可以构造特制数据包远程触发。微软在2017年3月14日的补丁日一次性修复了它们,也就是说,只要你在当时正常打了补丁,这组漏洞基本就堵住了。
那为什么大家更常听到的是“永恒之蓝”而不是“MS17-010”?原因很简单:攻击工具包泄露后,安全社区在分析时沿用了它的内部代号EternalBlue,传播过程中大家叫顺口了。同一个漏洞,学术界和厂商叫CVE编号或公告号,实战圈和新闻圈叫“永恒之蓝”。两者指的是同一件事。
2.2 触发条件有多“廉价”
理解一个漏洞的破坏力,先要看它的“触发成本”。我们拿几种常见漏洞类型做个对比:
| 漏洞类型 | 是否需要交互 | 是否需要凭证 | 触发入口 |
|---|---|---|---|
| 钓鱼文档漏洞 | 需要用户打开文档 | 否 | 邮件附件、聊天消息 |
| Web RCE漏洞 | 无 | 通常需要 | HTTP端口 |
| 永恒之蓝 | 无 | 无 | 445端口,握手后即可触发 |
“无交互、无凭证、远程可触发”三位一体,让它天然具备被制作成蠕虫的基础。WannaCry实际就是这么干的:先扫描开放445端口的主机,用永恒之蓝打进去,植入后门,然后继续扫描下一批主机,同时把勒索载荷释放到本机并加密文件。整个过程不需要任何用户名密码,也不需要欺骗用户单击任何链接,一台机器感染后可以在几小时内扩散到整个网段。
3. 漏洞原理:SMB协议处理中的一处“长度误会”
3.1 SMBv1为什么是“老刺头”
SMB(Server Message Block)是Windows下用于文件共享、打印共享、命名管道通信的协议族,标准端口是445。SMBv1是最早的版本,上世纪80年代就有了。当年网络环境简单,设计者几乎没怎么考虑安全性,后来虽然推出了SMBv2和SMBv3,但出于兼容性考虑,Windows默认仍保留着SMBv1组件——这正是永恒之蓝能成功的前提。
SMBv1最大的问题是协议状态机复杂、消息类型多,每种消息都有独立的解析逻辑。安全研究里有个经验:协议解析代码越复杂、兼容分支越多,就越容易藏漏洞。SMBv1就是这种典型。
打个比方,SMBv1像一栋老房子里的管道系统,几十年下来各种管线层层叠叠,表面上看都能用,但只要某个阀门型号不匹配,水压一大就可能爆管。永恒之蓝的利用点,就藏在这套老管道的某个阀门里。
SMB请求有多种类型,常见的有协商协议、建立会话、连接树、事务请求等。其中事务请求又分Trans和Trans2两类,用来处理文件属性、磁盘查询、扩展属性等功能。问题恰恰出在一个很小的处理函数上。
3.2 溢出核心:FEA列表的转换函数
SMB_COM_TRANSACTION请求可以携带一个参数块,里面包含文件扩展属性(FEA,File Extended Attributes)列表。在Windows内核驱动srv.sys中,处理这个参数块的关键函数负责把一套老旧格式的FEA列表转换成NT格式,相关分析里通常称为SrvOs2FeaListToNt。不同版本的Windows里函数名可能略有差异,但逻辑是相近的。
这个转换函数存在一个非常典型的“长度不一致”缺陷:
- 分配内存时,函数按照原始FEA列表的总长度来计算缓冲区大小;
- 真正逐条复制时,函数又按照转换后的每个FEA条目进行计算;
- 当某些FEA条目在格式转换后“变长”时,总量就会超过预先分配的缓冲区,复制过程会一路写穿缓冲区边界,形成经典的堆溢出。
打个比方:仓库管理员按“进货时每箱10件”的规格腾出了100个货位,但入库时货物在途中被重新包装,每箱变成了15件,结果货位不够,后面的货只能硬塞到隔壁仓库。隔壁仓库放的东西当然就被挤坏了。
有了堆溢出之后,攻击者可以通过精心构造的FEA条目布局和内存布局操纵,覆盖缓冲区后面的内核对象。现代Windows有DEP、ASLR、SMEP等防护机制,但这套利用链通过反复调整堆布局和对象伪造,绕过了这些缓解措施,最终实现在内核态执行任意代码,拿到SYSTEM权限。
从防御视角看,理解这个溢出点最有价值的结论是:漏洞发生在srv.sys这个内核态网络驱动里,一旦被攻破,攻击者拿到的是系统最高权限,不是普通用户权限。这意味着后续可以装驱动、关杀软、创建后门、横向内网扫描,基本为所欲为。
3.3 为什么能“无声无息”打进来
永恒之蓝的触发点非常靠前,在SMB会话建立后、身份认证之前就可以发送特定的Transaction请求。这意味着:
- 不需要提供账号密码;
- 不需要目标机器上运行任何特殊服务之外的软件;
- 服务器端在处理请求时直接进入漏洞流程;
- 整个过程对用户毫无感知,不会弹窗、不会出现明显卡顿。
这也是防御端很难提前发现的原因。很多单位连445端口都直接暴露着,扫描器随便一扫就能发现一堆有漏洞的机器。攻击者只需要“广撒网”,不需要针对特定目标做什么侦察,命中率就相当可观。
3.4 后门DoublePulsar的作用
永恒之蓝利用成功后,默认会加载一个名为DoublePulsar的后门程序。DoublePulsar的特点是驻留在内核态,不落地任何文件,重启后消失,传统杀软很难感知它的存在。攻击者可以通过发送特定SMB命令与它通信,远程开启进程、读写内存、加载驱动等。
WannaCry的实际流程是:永恒之蓝打进来 → 植入DoublePulsar → 释放勒索模块加密文件 → 用相同手法继续扫描传播。
对防御方来说,检测DoublePulsar可以利用SMB协议的特定通信特征,现在主流入侵检测规则里都有覆盖。但前提是流量侧有镜像或全流量审计能力,很多内网恰恰缺这个。
4. 影响面有多大,为什么说它是“核弹级”
4.1 影响版本矩阵
永恒之蓝影响的范围,几乎横跨整个Windows产品线:
| 受影响系统 | 备注 |
|---|---|
| Windows XP | 已停止支持,当时处于“完全裸奔”状态 |
| Windows 7 / Server 2008 R2 | 受影响最严重的大头,存量巨大 |
| Windows 8 / 8.1 | 部分受影响 |
| Windows 10 | 早期版本受影响,当时新系统也中招 |
| Windows Server 2003 / 2008 / 2012 / 2016 | 服务器群体主力受害 |
当时微软甚至为已停止支持的Windows XP破例发布了修复补丁,这足以说明问题的严重性。要知道,停止支持的意思是官方不再提供任何安全更新,为一个“已退休”的产品发补丁,在微软历史上都是极少见的事。
4.2 从“单点利用”到“蠕虫爆发”的距离
一个远程RCE漏洞如果只是单点利用,影响还算可控。但永恒之蓝有两个特性叠加后,效果就完全不同了:
- 可远程、无交互、无需认证;
- 利用成功后能加载内存后门,继续扫描内网。
这两个特性天然适合蠕虫化。WannaCry传播速度惊人,就是因为在利用成功后,恶意代码马上开始扫描随机IP和当前网段其他主机的445端口,形成“指数级”扩散。如果不做断网隔离,单台机器感染可以在几小时内蔓延到整个办公网络。
我记得之前处理过一起制造业客户的事件,最初只是一台放在角落里的老旧工控机中招,半天之内产线上的管理系统全部瘫痪,MES系统数据库服务器也被加密。最后只能停产三天恢复,损失相当惨重。这类事故的根源基本都是同一个:内网里有一台没打补丁、开着SMBv1的机器,而内网之间没有任何隔离。
4.3 行业影响与长期危害
WannaCry爆发后,很多单位才开始重视SMB端口收敛和补丁管理。但实际上,永恒之蓝的“后遗症”至今仍在:
- 大量内网老机器从未打补丁,SMBv1仍然开启;
- 潜伏在主机中的DoublePulsar后门可能被其他攻击者“唤醒”利用;
- 内网隔离粒度不足,一台机器被攻破基本等于整个网段沦陷。
这几年红蓝对抗和攻防演练中,永恒之蓝仍然是出镜率极高的突破口。很多防守方以为补丁都打了,结果一扫描,发现某个“无人认领”的段的Windows 7机器还敞着445。这个漏洞像一根刺,只要不拔掉,随时可能再扎一次。
5. 被入侵后有哪些表现,怎么排查
5.1 主机侧的可疑症状
如果一台机器被永恒之蓝成功利用过,可能出现以下现象:
- 系统卡顿、异常重启,严重时出现蓝屏(溢出触发崩溃);
- System进程CPU占用异常,因为SMB服务在内核态跑;
- 出现陌生svchost进程或DLL加载,行为可疑;
- 文件被加密,扩展名被修改,桌面或目录里出现勒索说明文件;
- 安全软件被静默关闭(拿到SYSTEM权限后可以强制终止进程)。
这里要提醒一句:很多正常机器被蠕虫“扫描”时并无明显症状,只有利用成功才会植入后门。不要因为机器没感觉异样就认为安全,端口扫描可能只是攻击的第一步,后续利用可能发生在一周甚至一个月之后。
5.2 日志排查思路
Windows日志排查建议按这个顺序走:
- 查看安全日志:重点关注4625(登录失败)和4624(登录成功)中登录类型为“3”的网络登录事件。大量来自同一IP的失败或成功登录,往往说明该IP正在进行扫描或爆破。
- 查看系统日志:关注内核驱动、网络服务的异常报错,比如srv.sys相关事件,以及系统崩溃记录。
- 查看SMB服务状态:不能只看进程有没有跑,要看是否启用了SMBv1。
PowerShell下可以这样快速查:
Get-SmbServerConfiguration | Select EnableSMB1Protocol Get-SmbClientConfiguration | Select EnableSMB1Protocol查看当前与445端口建立的连接:
Get-NetTCPConnection -LocalPort 445 | Where-Object State -eq Establishednetstat -ano | findstr "445"如果你发现内网某台机器与大量其他主机同时保持着445端口的连接,这基本就是蠕虫扩散的典型行为特征。
5.3 流量侧排查:看这几类特征
流量侧的排查重点可以放在这几个方面:
- 445端口扫描行为:同一源IP在短时间内向网段内大量目标IP发起TCP 445连接,即使没有完整建立,也是扫描特征;
- 异常SMB请求:Transaction消息中FEA数量或长度异常,payload大小和结构不合理;
- 连接关系异常:主机在短时间内与大量其他主机建立SMB连接,符合蠕虫扩散规律;
- 后门通信特征:如果怀疑DoublePulsar,可以在抓包中观察SMB会话是否存在固定规律的“响应脉冲”。
这些需要抓包条件配合。有全流量审计平台最好,没有的话在核心交换机上做端口镜像,用Wireshark也能抓出来。需要重点强调的是,流量侧排查的黄金窗口是事件发生后尽快做,日志和流量留存时长就那么多,晚了数据就没了。
6. 修复与加固:从打补丁到纵深防御
6.1 第一优先级:修复补丁
MS17-010的修复就是打对应系统的安全补丁。网上能搜到每个系统的KB编号,比如Windows 7 SP1和Server 2008 R2对应KB4012212。确认补丁是否安装,可以这样查:
systeminfo | findstr /i "KB4012212"wmic qfe | findstr "4012212"如果输出中包含该编号,说明补丁已安装。如果没有,需要尽快安排补丁窗口。
给生产系统打补丁前,建议先在测试机验证兼容性,特别是工业控制、医疗设备、老旧业务系统这类环境。我见过不止一次:补丁打完之后业务系统直接起不来,最后又回滚的情况。但这不是不打补丁的理由,而是流程问题。你可以不立即打,但不能永远不打。
6.2 第二优先级:禁用SMBv1
SMBv1早就该退役了。对于不需要兼容老客户端的内网,完全可以关闭。Windows Server 2012 R2及以后的系统,用PowerShell:
Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force Set-SmbClientConfiguration -EnableSMB1Protocol $false -ForceWindows 10/11也可以用上面的命令,或者用DISM关闭功能:
dism /online /norestart /disable-feature /featurename:SMB1Protocol关闭后建议重启再确认一次状态:
Get-SmbServerConfiguration | Select EnableSMB1Protocol那种“必须保留SMBv1”的兼容性理由,大多数时候其实是历史包袱。真遇到个别老设备必须要用,就把那台设备单独划到一个隔离VLAN里,限制它能访问的IP范围,做好记录和定期复查。
6.3 边界与内网的双重收敛
打完补丁、禁用SMBv1之后,还需要做端口收敛。445端口的问题不解决,下一个SMB漏洞出现时你仍然会暴露。
- 边界防火墙:默认拒绝来自未授权外部IP的445端口访问;
- 内网ACL/VLAN:把生产网段、办公网段、测试网段按业务需求隔离;
- 同一VLAN内不必要的Windows文件共享也要关闭,关闭打印机共享同理;
- 业务必须用SMB时,仅允许特定IP互访,并开启SMB签名(SMB Signing)增强抗中间人攻击能力。
端口收敛的逻辑就一句话:默认拒绝,按需放行。很多人一听到“默认拒绝”就头大,觉得会影响业务。但你完全可以在可控范围内配置白名单,把真正有需求的IP放行,剩下的全部丢掉。这才是做安全的正常姿势。
6.4 加固清单与自查脚本
这里给一份可以直接“抄作业”的加固清单:
- 所有Windows主机安装MS17-010补丁,并确认补丁编号在systeminfo输出中;
- 禁用SMBv1,除非真有硬兼容需求并在例外清单里记录原因;
- 边界防火墙默认拒绝外部访问445端口;
- 内网分段:办公、生产、测试使用不同VLAN和ACL;
- 安排定期漏洞扫描,重点检查445端口暴露的主机;
- 监控侧启用SMB漏洞利用和蠕虫行为检测规则;
- 重要系统做异地备份,且备份链路和生产网络隔离。
我们之前给某公司做应急时,第一步就是全网扫描445端口,结果发现超过三成的主机都开着。协调业务窗口停服、统一打补丁、关闭SMBv1,一周后复查,还有漏网之鱼——因为有几台机器根本没人认领,成了“孤儿资产”。这也说明加固不是打一次补丁就完事,资产管理、补丁台账、定期巡检缺一不可。
7. 实战经验:关于永恒之蓝的常见误区和我的习惯
7.1 误区一:打了补丁就万事大吉
打补丁只堵住了MS17-010这组漏洞,但内网依然可能被攻击者利用SMB弱口令、其他SMB漏洞(比如后续出现的SMBv3漏洞)进入。单一漏洞修复不等于整体安全,排查和加固要全面做。我见过不少单位,把MS17-010补丁打完之后就觉得自己“安全了”,结果半年后因为内网一台机器口令太弱,照样被拖进内网横向扩散。
7.2 误区二:内网主机不用开防火墙
很多运维图省事,内网防火墙策略做得非常开放,主机之间任意端口互访。这直接导致永恒之蓝在内网横向传播时“一路绿灯”。建议主机之间不要无条件互信,至少在关键网段之间做访问控制。特别是服务器区、数据库区和办公区之间的策略,必须严格一点。
7.3 误区三:封了公网445就安全了
WannaCry更主要的传播场景其实发生在内网。攻击者通过钓鱼邮件、U盘、第三方接入等方式进入内网后,再开445扫描,边界防火墙完全感知不到。所以内网本身也要有检测和隔离能力,不能把安全全部寄托在边界防火墙上。
7.4 我自己的几个小习惯
做了这么多年排查,我保留了几个固定动作:
第一,在巡检脚本里加一条SMBv1状态检查,每周自动跑一遍,结果直接发到工作群。硬件设备可能被替换,但SMBv1是否被重新开启,往往被忽略。
第二,对全网的端口开放清单做“白名单”管理,445端口必须单独审批。任何新上线的Windows主机,默认状态下445端口不应该对全网开放。
第三,每次处理完一个安全事件,都写一份简短复盘日志,记录时间线、根因、处置动作和后续改进点。不是为了给谁看,是为了下次遇到类似问题时能直接翻出历史记录,明白上次是怎么做的、哪里做漏了。
这个漏洞的分析讲到这里,核心的来龙去脉已经清楚了。最后再提醒一句:如果你只需要记住一条,那就是先检查自己的内网里还有没有开着445、没打补丁、又启用了SMBv1的机器——如果有,在你读这篇文章的这段时间里,它可能已经被扫描器光顾过了。