数字签名攻击报告:正在摧毁软件身份“信用体系”的安全危机
背景
近期,360公司核心安全事业部发现全球范围内的利用软件数字签名的恶意攻击呈活跃趋势,黑客的攻击目标涉及软件开发商、个人用户和重要的政府、企事业单位;攻击形式多样,包括盗用、冒用软件开发商的合法数字签名和流行软件投毒的大规模定向攻击等。在这些攻击中,黑客的首要攻击目标是软件开发商,围绕软件的数字签名进行各种形式的攻击,如在企业发布的合法数字签名软件安装包中植入恶意代码,用户从正规渠道下载官方正规软件主动中招;盗用和冒用企业数字签名批量制作“合法”的木马病毒,逃避杀毒软件的查杀等。利用软件数字签名的恶意攻击日趋严峻,这类攻击比常规的木马病毒更具威胁,广大用户极难分辨,也容易被检测机制不严格的安全软件放行,严重危害网络安全。
软件签名安全简介
“数字签名”是指可以添加到文件的电子安全标记。使用它可以验证文件的发布者以及帮助验证文件自被数字签名后是否发生更改。如果文件没有有效的数字签名,则无法确保该文件确实来自它所声称的源,或者无法确保它在发布后未被篡改。比如windows系统中内置的UAC(User Account Control用户账户控制)功能,就会在要求用户在执行可能会影响计算机运行的操作或执行更改影响其他用户的设置的操作之前,需要用户提供权限进行交互确认,在打开文件时的安全提示中显示程序的发布者供用户参考。
如没有软件数字签名的程序,UAC会显示发布者未知,交互提示框是黄色,提示用户该程序无法验证发布者,运行下去是有安全风险的。
图1
而包含正常数字签名的交互提示框是蓝色的,会标注已验证的的发布者,提示用户如果信任发布者可以放心运行下去。
图 2
一个正规的已经打上数字签名的程序,可以在程序文件的属性中查看到,便于用户识别确认。
图3
流行数字签名攻击形式分析
由于数字签名安全的校验文件的身份和完整性,所以数字签名天生成为了各种正规软件的“身份证”,基于正规厂商和用户之间的信任关系,以及厂商和厂商间的信任关系,大部分安全厂商对有数字签名和正规身份的程序默认是信任的。而黑客则针对这一信任关系进行攻击,他们会攻击合法软件的发布流程,利用各种疏忽或漏洞在合法的签名软件包中植入恶意代码 ,甚至直接盗取和冒用合法软件开发商的数字签名,从而绕过安全产品的检查进行非法攻击,攻击破坏了厂商和用户之间的信任关系,也损坏了软件开发商的信誉,同时也对安全软件的查杀带来了一定的阻碍。目前这类攻击开始越演愈烈,主要分为以下三个形式。
软件供应链攻击形式
这类攻击的主要形式是在厂商的正规签名软件包中植入恶意代码,比如近日的NetSarang系列软件关键网络通信组件nssock2.dll被植入了恶意代码,厂商在发布软件时并未发现恶意代码,并给被感染组件打上了合法的数字签名随新版软件包一起发布,由于该软件被程序员和网络运维管理人员广泛使用,由此引发了该软件用户“主动”中招的大规模定向攻击事件。
图4
被植入恶意代码的nssock2.dll文件,拥有2017年7月13日的NetSarang公司数字签名,如图:
图5
盗用签名攻击形式
黑客会盗用厂商数字签名直接签发木马病毒,或者利用已签名程序的安全漏洞发起攻击。如近期出现的恶性病毒“Kuzzle”,该病毒采用多种技术手段躲避安全软件的查杀,直接盗用了某公司的数字签名用于签发病毒,同时还利用了某安全厂商的已签发数字签名驱动加载执行代码,该病毒会感染用户计算机的主引导记录(MBR)和卷引导记录(VBR),劫持浏览器首页牟利,同时接受病毒作者的远程指令进行其他破坏活动。
被恶意利用的正规签名驱动如图:
图6
图7
冒用签名攻击形式
黑客冒用知名公司的身份资料,在境外申请知名公司的数字签名签发恶意程序,这种攻击方式让软件厂商无辜躺枪。近期360集团核心安全白名单分析团队发现黑客通过伪造知名公司的资料,在境外证书颁发机构申请相应公司数字证书,用于大量签发恶意私服和木马程序,多家知名公司躺枪。被冒用签名所签发的恶意程序如图:
图8
数字签名攻击影响面分析
黑客针对软件数字签名进行攻击,不仅成功对用户发动了攻击,还对厂商的信誉造成了损害。基于对软件厂商的信任,用户主动下载更新软件中招,攻击得到广泛传播;同时签发的有“身份证”的木马病毒,因为信任关系短时间内不易被安全软件查杀。
以下为抽样统计Xshell后门的用户活跃量,实际数据预计会比抽样数据扩大5倍,每天Xshell后门的主动使用受害者数以万计。
图9
同期,还有一些正规公司的签名被冒用来签发其他恶意程序,时间轴从今年初跨越至今,一些公司信誉严重受损。
图10
根据360大数据监测统计,今年新增冒用样本数量约400个,感染量约35万。下图所示是2017年8月份之前的受害者地域分布图,其中沿海一带以浙江、辽宁和广东传播最多,内陆则以四川和湖南居多 。
图11
数字签名攻击典型案例技术分析
Xshellghost技术分析
近日,NetSarang旗下的Xmanager、Xshell、Xftp和Xlpd等在全球流行使用的服务器远程管理软件曝出被多家杀毒软件报毒查杀的情况,经过360集团追日团队调查分析确认,NetSarang旗下多款软件的关键模块被植入了高级后门,这是一起入侵感染供应链软件的大规模攻击事件,我们将其命名为“XshellGhost”(xshell幽灵)。该程序是一个精密的定向攻击平台,所有的功能模块实现均为shellcode形式,客户端攻击通过感染供应链软件和各个shellcode模块,实现了无自启动项、无落地文件和多种通信协议的远程控制,后门潜伏于受害者电脑等待黑客在云控制平台下发shellcode数据执行,黑客在云端甚至可能通过上传的用户信息进行选择性的定向攻击。
远程控制步骤分析
XshellGhost的远程控制主要分为5个步骤:
1. Xshell等软件启动加载被感染组件nssock2.dll,解密shellcode1执行。
2. Shellcode1解密Shellcode2执行如下功能:
a) 创建注册表项,上报数据到每月对应的DGA域名当中;
b) 通过发往知名的域名解析器当中上传用户信息给攻击者;
c) 将接收的数据写入到创建的注册表项当中;
d) 通过获取的key1和key2解密Shellcode 3并执行;
3. Shellcode3会创建日志文件并写入信息,启动系统进程Svchost.exe,修改其oep处的代码,并注入shellcode形式的Root模块执行。
4. Root模块的初始化过程中,会加载并初始化Plugins、Config、Install、Online和DNS等功能模块,然后调用函数Install->InstallByCfg以获取配置信息,监控注册表并创建全局互斥体,调用Online-> InitNet;
5. 函数Online-> InitNet会根据其配置初始化网络相关资源,向指定服务地址发送信息,并等待云端动态下发代码进行下一步攻击。
图12
后门功能模块分析
此次攻击的所有模块调度加载实现方式都是通过shellcode形式,采用了模块化的方法进行统一管理。后门主要分为基础管理模块 (ROOT)、插件功能模块(Plugins)、C&C配置模块(Config)、代码安装模块(Install)和网络通信模块(Online)这5个模块。
ID |
名称 |
状态 |
100 |
Root |
已知 |
101 |
Plugins |
已知 |
102 |
Config |
已知 |
103 |
Install |
已知 |
104 |
Online |
已知 |
网络通信模块分析
网络通信管理模块(Online)是本次攻击的关键模块,在本次攻击事件当中我们已经发现了DNS模块,其它几个网络模块(TCP、HTTP、UDP、HTTPS、SSL)虽然在代码当中有所体现,但是在shellcode当中尚未主动运行,各个网络模块的函数接口及其作用如下表所示:
ID |
名称 |
作用 |
1 |
空指针 |
|
2 |
GetConObj |
返回该种网络通信时所使用到的对象 |
3 |
Start |
发送初始化数据包 |
4 |
Recv |
接受消息 |
5 |
Send |
发送消息 |
6 |
Shutdown |
发送shutdown数据包 |
7 |
Close |
关闭连接 |
各个网络模块的功能的展开和运行依赖于Online模块提供的函数接口列表:
ID |
名称 |
作用 |
1 |
OpByCmd |
根据命令实现收集机器的硬件信息等功能 |
2 |
InitNet |
根据配置文件初始化网络模块 |
3 |
GetConPluginObj |
根据传入的Shellcode的ID获取对应的通信Shellcode对象,调用通信对象的第2个接口函数GetConObj获取该Shellcode通信定义的对象 |
4 |
Start |
调用传入的Shellcode指针所对应的第3个函数(传入的shellcode为通信模块,第3个函数统一为发送初始化数据包); |
5 |
Recv |
调用传入的Shellcode指针所对应的第4个函数(传入的shellcode为通信模块,第4个函数统一为接收消息) |
6 |
RecvLoop |
根据传入的大小,多次调用Recv,获取要接受的数据 |
7 |
RecvTrans |
调用RecvLoop转换后获取到要接受的数据大小,循环调用RecvLoop获取所有数据,最终调用Root的TransDataEx |
8 |
Send |
调用传入的Shellcode指针所对应的第5个函数(传入的shellcode为通信模块,第5个函数统一为发送消息) |
9 |
SendLoop |
根据传入的大小,多次调用Send,发送完所有数据 |
10 |
SendTrans |
根据时间转换数据格式,SendLoop |
11 |
RecvSend |
创建线程进行对应Shellcode的(Recv和Send)操作 |
12 |
Shutdown |
调用传入的Shellcode指针所对应的第6个函数(传入的shellcode为通信模块,第6个函数统一为发送shutdown数据包) |
13 |
Close |
调用传入的Shellcode指针所对应的第7个函数(传入的shellcode为通信模块,第7个函数统一为关闭连接);减少对应Shellcode的引用计数 |
14 |
GetId |
获取传入的Shellcode所对应的ID |
InitNet在读取网络代理配置以后每隔1秒调用功能A,如果功能A返回20000,则函数彻底结束,功能A逻辑:
图13
功能B逻辑,用于等待云端下发代码执行:
图14
此次攻击已知使用的通信模块是DNS模块,该后门基于DNS隧道技术进行通信:
ID
|