拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Windows Server修复CVE-2016-2183:禁用3DES与RDP弱加密套件

Windows Server修复CVE-2016-2183:禁用3DES与RDP弱加密套件 上周例行漏洞扫描一台Windows Server 2016的3389端口直接亮红灯报的就是CVE-2016-2183也就是SWEET32漏洞。这个洞不涉及什么暴力利用问题出在系统SSL/TLS底层还允许3DES这类64位分组的旧加密算法参与握手。对Windows来说只要SChannel密码套件里还开着3DES扫描器就会在3389端口上把它揪出来。这篇文章结合我实际修过的环境把这个漏洞的基本原理、它和远程桌面端口的关联讲清楚重点给出两套修复方案注册表快速禁用弱算法以及组策略指定密码套件顺序。最后附上验证命令和几次踩坑记录。运维、安全同事都可以直接照着操作尤其是那些内外网都开着RDP的Windows服务器这个整改迟早要过。1. 漏洞背景CVE-2016-2183到底是什么为什么盯上33891.1 SWEET32一句话讲清楚问题根源CVE-2016-2183被业界称为SWEET322016年公开影响范围非常广。它针对的不是某个厂商的产品而是所有还在使用64位分组密码block cipher的TLS实现受影响最典型的就是3DES和Blowfish。64位分组听上去很抽象我打个比方。加密数据不是一口气全部处理而是切成固定大小的块一块一块地加密。64位分组意味着每块只有8个字节。块太小会带来一个概率问题当传输的数据量足够大时两块不同明文可能加密出相同的密文这就叫碰撞。攻击者不需要在目标机器上装任何东西只要被动抓取大量密文再用生日攻击那套概率统计方法去碰撞分析就能逐步还原部分明文信息。按照公开论文的数据触发一次完整攻击大约需要客户端和服务器之间持续传输785GB的数据。听起来门槛很高但如果是一台内网核心服务器长时间跑业务流量这个量级并不算遥不可及而且整个过程完全是被动监听很难被察觉。所以这个漏洞在合规检查里几乎必查不能拖。1.2 为什么3389端口RDP会被牵连3389是Windows远程桌面的默认监听端口。RDP建立连接的时候如果安全层配置为SSL或者协商模式底层走的就是Windows的SChannel安全提供程序和浏览器访问HTTPS用的是同一套TLS握手体系。也就是说SChannel支持哪些密码套件RDP的TLS握手就可能会用到哪些。问题就出在这里。老版本的Windows系统包括Server 2008、2012甚至部分2016默认SChannel配置里3DES和RC4这些弱算法并没有被关掉。哪怕你在远程桌面设置里把安全层选成了“SSL”扫描器去探测3389端口时依然能从TLS握手返回的套件列表里看到3DES于是CVE-2016-2183就报出来了。换句话说漏洞本身是通用TLS层面的缺陷只是因为3389恰好开着RDP服务扫描结果会把这个端口作为受影响的实例列出来。1.3 “原理扫描”和真实攻击的差别很多扫描报告会标注“【原理扫描】”这个词值得解释一下。原理扫描不是拿实际攻击流量去打你的机器而是通过TLS握手阶段协商到的协议版本和密码套件列表来做风险判断。打个比方安检员看到行李清单里写了打火机不需要真的点着火才没收——清单上有就说明存在风险。这个特性决定了修复思路非常明确把弱算法从服务器的“密钥清单”里移除。只要TLS握手时服务器不再提供3DES和RC4扫描器自然就不会报这个漏洞了。2. Windows加密体系SChannel、密码套件与RDP安全层2.1 SChannel是什么配置到底在哪里SChannel是Windows自带的“安全支持提供程序”Security Support Provider负责实现SSL和TLS协议。IIS跑HTTPS、RDP走TLS、一些应用程序的加密通信底层都经过SChannel。最重要的是它的启停完全由注册表决定管理员可以直接干预。关键注册表路径有两条建议先手动打开regedit熟悉一下HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers—— 控制加密算法3DES、RC4、AES等的启用状态HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols—— 控制协议版本TLS 1.0、1.1、1.2、1.3的启用状态Ciphers子键下的每个子项对应一种算法子键里有个Enabled的DWORD值0代表禁用1代表启用。明白这个结构之后修复就变成了一次注册表编辑工作。2.2 RDP安全层的几个等级远程桌面连接的安全性由“安全层”控制常见选项有三种RDP安全层最老的方式使用RDP自带的加密协议不走TLS安全性最差SSLTLS通过SChannel走TLS握手TLS版本和密码套件取决于系统配置协商NLA客户端和服务器协商一般会优先使用TLS如果你的服务器安全层选的是“SSL”或“协商”那么TLS握手时SChannel的当前配置直接决定扫描结果。很多运维同事把这个选项改成“SSL”就以为安全了实际上只要3DES还开着扫描照样报警。2.3 补丁更新为什么不能完全消除告警CVE-2016-2183公布后微软确实在后续更新里做过一定程度的默认策略调整但并没有在旧系统上一刀切禁用3DES和RC4。原因很现实Windows生态里有大量老客户端、老业务系统它们可能只支持这些旧算法。如果系统层面强行关闭很多存量应用会直接无法通信。所以微软选择把决定权交给管理员补丁保证“可以修”但是否修、什么时候修由你通过注册表或组策略来落地。这也是为什么有些系统补丁打得很全扫描器却依然报CVE-2016-2183——因为系统层面没有实际禁用弱算法。3. 方案一注册表禁用弱算法快速应急3.1 动手前的备份与回滚准备修改注册表前务必备份。我见过有人在生产服务器上直接删子键结果RDP断连最后只能通过物理控制台去恢复。正确的操作是先导出SCHANNEL分支作为回滚文件。具体做法以管理员身份运行regedit定位到HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL右键导出保存一份.reg文件。这样即使改错了双击导入备份就能恢复。另外如果你的云平台支持创建快照改之前给系统盘打一个快照更稳妥。3.2 禁用3DES和RC4的具体操作定位到HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers在Ciphers下找到或新建对应算法的子键然后在子键下新建DWORD32位值名称为Enabled数值设为0。需要重点处理的算法子键子键名称对应算法建议操作3DES3DESSWEET32直接相关Enabled 0RC4 128/128RC4 128位Enabled 0RC4 40/128RC4 40位Enabled 0RC4 56/128RC4 56位Enabled 0RC4 64/128RC4 64位Enabled 0DES 56/56单重DESEnabled 0如果不熟悉注册表编辑器也可以直接做成.reg文件导入。把下面内容保存为disable-weak-ciphers.reg然后双击导入Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\3DES] Enableddword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 128/128] Enableddword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 40/128] Enableddword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 56/128] Enableddword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 64/128] Enableddword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\DES 56/56] Enableddword:00000000注意导入之后必须重启系统才能完全生效。部分资料说重启相关服务就可以但SChannel的套件加载在系统启动阶段就完成了实测下来重启最可靠。3.3 顺手调整哈希算法与密钥交换算法既然已经打开注册表了建议把哈希和密钥交换也一起检查。扫描器界面上报CVE-2016-2183只提3DES但完整的安全基线还会检查MD5和过时的密钥交换算法。在HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes下把MD5子键的Enabled设为0在SCHANNEL\KeyExchangeAlgorithms下可以按需禁用PKCS。需要注意禁用MD5和PKCS对老客户端的兼容性影响更大建议先在测试机上验证不要直接在核心生产环境上一把梭。做运维最重要的原则是一次只改一个变量出问题能马上定位。3.4 重启后用命令确认重启完成后用PowerShell查看当前系统支持的密码套件确认不再输出3DES/RC4Get-TlsCipherSuite | Select-Object Name如果列表里已经没有包含3DES或RC4的套件名说明本地配置已经生效。不过需要注意这个命令是在本机看系统配置而扫描器是从远端探测的逻辑不完全一样后面第5节我会专门讲怎么在远端验证。4. 方案二组策略指定密码套件顺序彻底修复4.1 打开SSL密码套件顺序配置注册表禁用适合快速整改但只做禁用系统里依然可能存在其他偏弱的套件组合。更彻底的方案是用组策略指定一套“白名单”密码套件顺序让SChannel在握手时只会使用你允许的套件。操作路径运行gpedit.msc打开本地组策略编辑器找到“计算机配置 - 管理模板 - 网络 - SSL配置设置”双击右侧的“SSL密码套件顺序”选择“已启用”在“SSL密码套件”输入框里粘贴你允许使用的套件列表注意用英文逗号分隔确定后重启系统这套方案最大的优势是可控性强也方便通过域控批量下发。如果你管理几十台服务器只需要把组策略对象GPO挂到对应OU上就能统一整改不用每台机器手动改注册表。4.2 用PowerShell生成合规套件列表手动敲几十个套件名很容易出错而且不同Windows版本的SChannel支持的套件名有差异。我推荐先在目标机器上用PowerShell生成一份过滤后的列表再粘贴到组策略里。# 查看全部套件 (Get-TlsCipherSuite).Name # 过滤掉弱算法生成白名单 $weak 3DES|RC4|DES|NULL|SEED|CAMELLIA $allowed (Get-TlsCipherSuite).Name | Where-Object { $_ -notmatch $weak } $allowed -join ,执行完最后一条命令把输出的逗号分隔字符串复制到组策略输入框里。这样生成的列表一定是目标系统支持的不会出现写了套件名但系统不认的情况。4.3 套件顺序配置的几个注意点配置顺序时有几个容易踩的坑提前说明第一组策略里的套件列表不是随便排列的系统会按照你写的顺序优先协商排在前面的套件。所以建议把安全性最高、性能也好的TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384这类套件放在最前面。第二老系统如Windows Server 2008默认可能没有“SSL密码套件顺序”这个组策略项需要手动导入ADMX模板。如果环境里没法导入那就只能用注册表方案或者评估升级系统。第三改完组策略同样要重启系统。之后你可以用rsop.msc查看策略结果确认“SSL密码套件顺序”已经生效。5. 验证与复扫从本地到远端5.1 本地先做TLS握手检查系统重启后先在另一台机器上用OpenSSL主动向3389端口发起TLS握手这一步能直观看到服务器实际选择了哪个密码套件。openssl s_client -connect 服务器IP:3389 -tls1_2如果配置正确输出里Cipher字段会显示类似TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384这样的强套件。如果看到Cipher is 3DES-EDE-CBC之类的信息说明服务器端配置还没生效或者有中间设备缓存了旧的TLS参数。5.2 用Nmap枚举远程支持的套件本地握手测试只能看到连接成功后服务器选择的套件看不到完整的套件列表。想确认服务器到底还支不支持3DES/RC4推荐用Nmap的ssl-enum-ciphers脚本nmap -p 3389 --script ssl-enum-ciphers 服务器IP这个脚本会列出目标RDP服务支持的所有TLS密码套件并标注强度等级。如果列表里已经没有3DES、RC4并且没有弱或中等强度的红色标识说明修复已经完成可以提交复扫了。注意Nmap扫出来的结果可能和你本机SChannel配置不一致原因在于扫描器探测到的套件列表来自TLS握手中的ServerHello消息。如果中间有负载均衡、防火墙或RDP网关做了SSL卸载最终结果可能取决于中间设备而不是Windows系统本身。5.3 测试RDP实际连接改完配置后最容易被忽略的就是RDP功能测试。很多情况下弱算法是禁成功了但某个老客户端因为只支持3DES直接连不上远程桌面。在正式变更窗口内从另一台Windows机器发起远程桌面连接确保能正常弹出登录界面并进入桌面这个验证不能省。测试的时候建议分别测两台客户端一台用最新Windows 10/11一台用老系统如果有的话综合验证兼容性。6. 常见问题与排查实录6.1 改完RDP连不上怎么办实际运维中改完注册表或组策略后RDP断连的情况并不少见。原因基本是三种现象可能原因处理办法远程桌面直接无法连接误禁了实际需要使用的AES套件检查Ciphers子键下Enabled0的算法列表恢复AES连接后闪断或反复要求输入密码组策略套件列表写入了系统不支持的套件名重新生成合规列表更新组策略TLS版本被误禁在Protocols下禁用了TLS 1.2确认Protocols\TLS 1.2下服务器和客户端都是Enabled1如果远程桌面已经连不上优先利用物理控制台或云平台的VNC登录。恢复手段有两个一是导入之前导出的注册表备份二是把组策略里“SSL密码套件顺序”改为“未配置”让系统回到默认状态。6.2 复扫还在报3DES怎么办有的同事反馈明明本地已经看不到3DES了扫描器复扫还是报CVE-2016-2183。这里需要排查几个环节先用netstat -ano | findstr :3389确认3389端口上监听的进程是不是TermServiceRDP服务。如果监听进程不是系统RDP而是某个第三方程序那么它可能自带加密实现并不受SChannel配置控制修改Windows自身的套件自然没用。另一个常见情况是网络里存在SSL网关或VPN设备它们提前终结了TLS连接扫描器探测到的是网关的套件配置不是Windows服务器本身的。这种情况下需要同步在网关设备上做整改光改Windows没用。6.3 老系统与老客户端的兼容性把3DES和RC4全部禁用后最直观的影响就是老客户端无法建立RDP连接。Windows XP时代的远程桌面客户端很多只支持RC4套件你在服务器端禁掉RC4它就彻底连不上了。如果业务环境里确实存在这类老客户端我的建议是保留一台独立跳板机老客户端先连跳板机再由跳板机去访问目标服务器。跳板机可以单独配置允许弱算法但限制在内网使用不直接暴露给外部扫描。目标服务器则按照严格基线整改两边互不妥协。6.4 3389端口暴露面管理最后说一个和CVE-2016-2183整改配套的建议。就算这个漏洞修好了也不建议把3389端口直接暴露到公网。RDP历史上出过不少高危漏洞端口暴露本身就是风险。更稳妥的做法是通过堡垒机统一入口远程桌面只允许从堡垒机IP访问开启NLA网络级别身份验证避免在未认证阶段暴露更多信息限制远程桌面用户组成员避免普通用户拥有登录权限定期检查RDP相关事件日志留意异常登录记录我个人的习惯是漏洞扫描整改只是安全基线的一部分。改完CVE-2016-2183顺手把TLS 1.0和TLS 1.1也禁用掉只保留1.2及以上版本这样后续再扫TLS相关的其他隐患也能少报几条。如果系统版本较新还可以把TLS 1.3打开性能和安全性都会有明显提升。这个整改过程看起来复杂实际上就是“看懂原理 - 备份 - 修改 - 验证 - 复扫”这几步。只要按顺序来每台Windows服务器基本40分钟左右就能处理完。批量维护的时候把注册表脚本和组策略模板提前准备好效率会高很多。
返回列表