从DNS和sinkhole视角看WannaCry蠕虫

编注：本文来源自《中国计算机学会通讯》2017年第7期《WannaCry勒索蠕虫专刊》，作者是360网络安全研究院李丰沛。在本博客发布时，文章的字句和排版略有调整，以适应本技术博客。我们将该文章发布在本技术博客的动机之一，是因为这篇文章中对WannaCry的感染情况做了一个定量分析，本技术博客的后续其他分析文章可以参考做一个基准。


域名系统(Domain Name System, DNS)数据作为全网流量数据的一种采样方式，可以在大网尺度对域名做有效的度量和分析。我们利用DNS数据，在过去数年里对多个安全事件，包括Mirai等僵尸网络、DGA等恶意域名，以及黑色产业链条进行跟踪和分析。对于最近爆发的WannaCry蠕虫病毒，利用DNS数据进行分析，也是很有意义的。


众所周知，WannaCry蠕虫病毒有一个开关域名，即www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com，该域名相关详细内容见《WannaCry勒索蠕虫专刊》其他文章。在蠕虫感染过程中，有效载荷通过445端口上的 MS17-010漏洞投递并成功启动后，会尝试访问特定域名的网页。如果成功访问网页，则随即退出，蠕虫会被压制，不会进一步发作；如果访问网页失败，蠕虫会开始破坏动作，并随后弹框勒索赎金。本文首先从我们手头的DNS数据视角，就开关域名和其他域名的访问情况，描绘本次WannaCry蠕虫病毒在国内的感染和防御情况。


尽管在注册开关域名时，Kryptos Logic Vantage (www.kryptoslogic.com)的研究人员并没有意识到这个域名的重要作用，但实际上，正是这个开关域名成功抑制了WannaCry蠕虫的蔓延，研究人员因此自嘲说“意外地拯救了世界”。得益于Kryptos Logic Vantage对我们的信任，我们获得了关键域名sinkhole的部分日志数据。本文的第二部分，将基于sinkhole日志的统计信息，分析WannaCry的感染情况。



从DNS视角看WannaCry在国内的感染和防御情况


这里，有必要先介绍一下我们在DNS方面“看见”的能力，从而向读者确认我们所见的数据能够代表中国地区。我们及合作伙伴的DNS数据源每日高峰期处理超过100万次/秒的DNS请求和响应，客户来源覆盖国内各地理区域、行业、运营商等不同领域。


在这次WannaCry事件中，我们估算能够看到全国大约10%的相关DNS流量。如果将整个国内互联网视为一个复杂系统，DNSPAI则是对DNS流量的一个采样，而全部的DNS流量是对整个复杂系统在协议维度的一个采样。在这个尺度上，即使只有1%的采样比也是非常惊人的。通过合理设定数据处理管道和充分运用大数据分析技术，我们能够对中国大陆地区的网络安全情况有一个较为全面的了解。


WannaCry在国内的感染趋势


1. 早期感染阶段


5月12日（周五）15:20（北京时间，下同），我们看到了首个访问该域名的DNS请求。此时的域名解析是不成功的，自然无法访问到目标网页，机器一旦感染蠕虫，就会发作。这个阶段的DNS访问曲线如图1所示。




图1 早期感染阶段DNS访问曲线


这段时间又可以划分为如下若干更小的时间片。


 * 15:00～17:00之间，每个小时的感染数量分别是 9，25和202，每个小时扩大约一个数量级，这是极早期快速感染阶段；
 * 17:00～22:00之间，每小时新增感染达到了一个较高水平，最高达到2800/小时，这是第一次高峰阶段；
 * 22:00～23:00之间，感染速度逐渐下降，这应该是夜间更多机器关机导致，可以归纳为夜间自然下降阶段；


仔细观察这段时间的感染情况，可以得出以下结论：


 * 我们有理由认为15:00附近就是国内蠕虫最初感染发作的时间，尽管我们看到的仅是国内DNS数据的采样而非全部。这是因为最初的感染速度非常小，为个位数，并且在随后的每个小时内扩充约1个数量级，如果我们把时间向前追溯，就可以得到这个结论。
 * 压制域名的上线有重大意义：在整个早期感染阶段，蠕虫扩张的速度非常快，如果不是压制域名争取了时间，所有后续的防御行动都会困难很多。事实上，周五这天晚上22:00附近就是WannaCry感染速度的历史最高水平，即使是后来的周一早上上班大开机的时刻也没能超过这个水平。


2. 域名压制阶段


开关域名于周五23:30左右上线，开始了对WannaCry的压制。这段时间也可以继续细分为如下若干时间片段。


 * 压制域名同步到全网阶段。由于DNS本身的缓存，压制域名虽然最早于23:30左右上线，但是这个案例中还需要大约30分钟才能让全网所有节点都能感知到。在这30分钟里，全网范围内DNS应答中，NXDOMAIN（域名不存在）和A（回应IP地址）两种类型同时存在。前者在回落，后者在上升。域名上线后大约5～10分钟时，两条曲线出现十字交叉，域名上线30分钟后，NXDOMAIN被压制到地板附近（见图2）
 * 平稳控制阶段。NXDOMAIN被压制以后，过度到了平稳控制阶段。在这个阶段，一方面，微软补丁更新和安全社区的共同努力减少了感染机器的数量；另一方面，总有机器因为各种原因被新增感染。总体而言，总感染量处于动态平衡状态，并且会随着时间推移最终平稳下降。从既往其他类似情况看，下降过程也许会耗费数年，并且往往会出现以周为单位的规律性波动（见图3）。




图2 压制域名同步到全网阶段



图3 平稳控制阶段


在这个阶段，有以下情况值得一提。


在5月17日以后，DNS数据中信噪比逐渐下降，逐渐变得不再适合用来做分析和度量。这主要是由于开关域名被媒体和公众大量关注，越来越多的针对开关域名的访问是来自浏览器而非WannaCry。


尽管如此，每天的DNS访问曲线仍然是不多的风向标之一。在感染的早期，每个人都无法预测WannaCry的后续发展趋向，只能严密监视域名访问情况。白天相对夜晚有个波峰，这是正常现象；周日的波峰比周六更高一些，没人知道这是个什么样的兆头；直到周一早晨9:00的波峰开始回落，确认周一读数小于周五，我们才能基本认为感染情况大体得到控制；随后，在周三和周四感染情况有所反弹，每个人的心又提到嗓子眼；直到再下一周数据整体回落，我们才能最终确认局势受控，从应急状态回到平稳的工作状态。


WannaCry不同变种感染情况对比


随着时间推移，不断有WannaCry的不同变种被曝光，有的样本去掉了对开关域名的检测（但是幸运的是该样本被改坏了，无法正常启动），有的样本使用了不同的开关域名，但是从DNS数据层面来看，除了原始版本，其他版本并没有得到广泛传播。


我们至少捕获到以下WannaCry变种样本：


 * hxxp://www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com
 * hxxp://www.ifferfsodp9ifjaposdfjhgosurijfaewrwergwea.com
 * hxxp://www.udhridhfowhgibe9vheiviehfiehbfvieheifheih.com
 * hxxp://www.iuqssfsodp9ifjaposdfjhgosurijfaewrwergwea.com
 * hxxp://www.ayylmaotjhsstasdfasdfasdfasdfasdfasdfasdf.com


对应域名的DNS访问曲线如图4所示。


 * 传播的主体，是iuqerf的原始版本；
 * ifferf版本有少量传播，比原始版本小了一个数量级；
 * 其他版本只有零星访问或者干脆没有访问。




图4 对应域名的DNS访问曲线


变种版本的感染范围远小于原始版本，也许可以归为补丁防御工作开始启动。无论如何，可以预期后续变种如果仅仅修改了开源域名，并不会比 ifferf版本带来更大影响。总体而言，在这个案例中，非原始版本的WannaCry的感染情况不值得引起安全社区的密切关注。


微软WSUS补丁更新服务的访问情况


微软补丁是本次WannaCry防御体系的关键，理应获得比WannaCry变种更多的关注。查询微软WSUS服务的官网可知，WSUS服务与下列域名访问有关：


 * hxxp://windowsupdate.microsoft.com
 * hxxp://download.windowsupdate.com
 * hxxp://download.microsoft.com
 * hxxp://test.stats.update.microsoft.com
 * hxxp://ntservicepack.microsoft.com


简单查询可知，download.windowsupdate.com的访问量最大，我们选用这个域名的DNS访问情况来代表补丁更新情况，如图5所示。



图5 download.windowsupdate.com域名的DNS访问情况


通常而言，补丁更新分发的高峰是在“星期二补丁日”的第二天。按照惯例，微软是在每个月第二周的星期二发补丁，第二天（周三）是中国区用户更新的高峰时间。但是这一次，5月15日（周一）当天出现了一个波峰。这种情况可以理解为系统网络管理员、个人在经过周六和周日的宣传后，大量用户在周一更新了微软补丁。


从这个意义上来说，这一次整个安全社区在周六、周日紧急行动起来，向社会和公众说明情况，提供防御手段和解决方案，是非常必要的。如果错过了周六和周日宣传准备的时间窗口，周一早上的开机时刻也许就是灾难时刻。



从sinkhole视角看WannaCry的感染情况


如前所述，得益于Kryptos Logic Vantage对我们的信任，我们获得了域名sinkhole的关键日志。这段数据覆盖了全球，是WannaCry事件中全球视角的唯一权威数据。Kryptos Logic Vantage授权我们展示部分统计信息。


我们得到的sinkhole数据，发生在北京时间5月12日23:40～5月16日8:10，缺失了5月13日10:30～5月14日00:20之间的数据。这段数据显示，开关域名共计被访问了266万次，涉及16万个独立来源IP。


Sinkhole与DNS数据对比分析


将sinkhole数据与DNS数据放在一起对比，可以清晰地进行分析。如图6所示，蓝色部分为sinkhole数据，红色部分为DNS数据。DNS数据在纵轴上缩放了10倍，以便清晰地展示数据的趋势。




图6 sinkhole数据与DNS数据对比分析


按时间顺序解读图6，可以得知：


 * 域名刚刚上线后的5个小时之内是sinkhole访问的历史高峰，每分钟约3500次；
 * 上线6小时后sinkhole访问数量开始持续回落，到北京时间5月14日6时许降低到高峰时段的十分之一，到15日3时为最低点，约为历史高峰水平的三十分之一。可以认为，域名上线，有效压制了蠕虫的发展；


以上观察结果与之前DNS数据观察结果一致。我们猜测，缺失的14个小时的数据，趋势也是一直在下降。


来源端口和Windows动态端口范围设定


除了时序方面，来源端口方面的数据分布也引起了我们的注意。端口49150前后的来源访问次数差别非常大，端口1024前后也有一个局部的暴涨。图7～9分别是全端口分布、端口49150附近数据缩放以及端口1024附近数据缩放。




图7 全端口分布



图8 端口49150附近数据缩放



图9 端口1024附近数据缩放


我们查到，Windows操作系统对动态端口范围有如表1所示的设定。


表1 Windows操作系统对动态端口范围的设定




基于以上事实，我们有如下推测。


 * 相当比例机器被感染的时机，发生在Windows刚刚启动完成的阶段，这时动态端口几乎都没有被使用，操作系统按照预设范围由低到高，给请求分配了范围下限附近的端口；
 * 处在下限边缘但很少被使用到的端口，例如，49152/49153/49154和1024/1025/1026/1027，也许是被操作系统自身在启动过程中用掉；
 * 绝大部分被感染版本是Windows Vista/Windows 7/WindowsServer2008及以后版本，之前版本感染的不多。


致谢


我们特别致谢Kryptos Logic Vantage，不仅因为他们允许我们获得sinkhole的日志，从而得以从更多角度深入WannaCry蠕虫病毒；更主要是因为Kryptos Logic Vantage的sinkhole在此次案例中，为所有安全社区工作者争取了宝贵的时间，维护了所有人（也许病毒作者除外）的利益。


参考文献


[1] Windows服务器系统的服务概述和网络端口要求[OL].https://support.microsoft.com/zh-cn/help/832017/service-overview-and-network-port-requirements-for-windows