从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