软件签名安全简介
“数字签名”是指可以添加到文件的电子安全标记。使用它可以验证文件的发布者以及帮助验证文件自被数字签名后是否发生更改。如果文件没有有效的数字签名,则无法确保该文件确实来自它所声称的源,或者无法确保它在发布后未被篡改。比如windows系统中内置的UAC(User Account Control用户账户控制)功能,就会在要求用户在执行可能会影响计算机运行的操作或执行更改影响其他用户的设置的操作之前,需要用户提供权限进行交互确认,在打开文件时的安全提示中显示程序的发布者供用户参考。
如没有软件数字签名的程序,UAC会显示发布者未知,交互提示框是黄色,提示用户该程序无法验证发布者,运行下去是有安全风险的。
图1
而包含正常数字签名的交互提示框是蓝色的,会标注已验证的的发布者,提示用户如果信任发布者可以放心运行下去。
图 2
一个正规的已经打上数字签名的程序,可以在程序文件的属性中查看到,便于用户识别确认。
图3
流行数字签名攻击形式分析
由于数字签名安全的校验文件的身份和完整性,所以数字签名天生成为了各种正规软件的“身份证”,基于正规厂商和用户之间的信任关系,以及厂商和厂商间的信任关系,大部分安全厂商对有数字签名和正规身份的程序默认是信任的。而黑客则针对这一信任关系进行攻击,他们会攻击合法软件的发布流程,利用各种疏忽或漏洞在合法的签名软件包中植入恶意代码 ,甚至直接盗取和冒用合法软件开发商的数字签名,从而绕过安全产品的检查进行非法攻击,攻击破坏了厂商和用户之间的信任关系,也损坏了软件开发商的信誉,同时也对安全软件的查杀带来了一定的阻碍。目前这类攻击开始越演愈烈,主要分为以下三个形式。
软件供应链攻击形式
这类攻击的主要形式是在厂商的正规签名软件包中植入恶意代码,比如近日的NetSarang系列软件关键网络通信组件nssock2.dll被植入了恶意代码,厂商在发布软件时并未发现恶意代码,并给被感染组件打上了合法的数字签名随新版软件包一起发布,由于该软件被程序员和网络运维管理人员广泛使用,由此引发了该软件用户“主动”中招的大规模定向攻击事件。
被植入恶意代码的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个模块。
网络通信模块分析
网络通信管理模块(Online)是本次攻击的关键模块,在本次攻击事件当中我们已经发现了DNS模块,其它几个网络模块(TCP、HTTP、UDP、HTTPS、SSL)虽然在代码当中有所体现,但是在shellcode当中尚未主动运行,各个网络模块的函数接口及其作用如下表所示:
各个网络模块的功能的展开和运行依赖于Online模块提供的函数接口列表:
InitNet在读取网络代理配置以后每隔1秒调用功能A,如果功能A返回20000,则函数彻底结束,功能A逻辑:
图13
功能B逻辑,用于等待云端下发代码执行:
图14
此次攻击已知使用的通信模块是DNS模块,该后门基于DNS隧道技术进行通信:
该模块发送的数据包有3种类型:
1.初始化数据包,大小为0x18
图15
2.Data数据包,大小0x8+
图16
3.关闭数据包, 大小0x8
图17
其发送函数如下:
图18
图19
图20
在调用DNS模块2号函数返回自定义对象时,其调用了GetAdaptersAddresses获取适配器的DNS
图21
最多收集0x10个DNS,随后在调用该模块第3号函数时,其使用收集到的DNS,合并Config文件中的4个DNS地址,循环往每一个DNS发送查询,等到到任何一个返回数据,或者超时,并记录下第一个返回应答的DNS数据包,以后再次发送的时候,只会给第一个返回应答的DNS发送数据。
图22
图23
在发送数据包时,会将数据嵌套到DNS协议中发送,其中数据会编码成特定的字符串,添加在要配置文件中的CC DNS URL前,实现DNS隧道通讯。
图24
盗用签名攻击和白利用攻击的典型案例
刷机精灵官方主程序被利用,伪装成“照片.exe”,通过QQ传播,会加载一个伪造的ShuameManager.dll。
图25
伪造的ShuameManager.dll盗用“北京财联融讯信息技术有限公司”数字签名:
图26
伪造的ShuameManager.dll和刷机精灵官方的ShuameManager.dll有相同的导出函数“StartShume”供主程序调用,恶意ShuameManager.dll的导出函数内部代码是循环休眠:
图27
真正的恶意代码其实在ShuameManager.dll刚载入时就已经启动,并且采用拼接字符串的方式来隐藏敏感API调用,直接创建一个工作线程:
图28
工作线程的任务是解密一个加密的文件“coonfig.dat”,内存解密出一个dll文件,然后进行加载:
图29
解密的算法是简单的加法和异或运算,初始key是9:
图30
经过循环9次解密后,coonfig.dat文件在内存里解密出一个dll,工作线程接着准备加载调用其导出函数“InitMyEntry”:
图31
首先判断解密出来的文件格式是否满足条件,符合PE格式则进行解析分配对应大小的内存进行装载:
图32
接着就是根据PE格式的映射原理进行解析和装载,然后调用dll的入口点函数进行初始化:
图33
解密后的dll装载初始化完后,接着查找其导出函数“InitMyEntry”地址最后直接跳转执行:
图34
分析到这里,可以看出ShuameManager.dll其实就是一个加密程序内存装载器,采用了一系列对抗手法来规避查杀,具体执行的恶意活动取决于coonfig.dat解密出来的程序。ShuameManager.dll配套的coonfig.dat,其中一个功能是调用一款第三方工具NirCmd.exe来进行添加开机启动项,命令参数为:
图35
而启动的目标程序Elantech.exe只是伪装“触控板”的文件名,实际上是一个和上述被利用的“刷机精灵”类似的程序,Elantech.exe主要有两类,其中一类是yy游戏官方的程序:
图36
yy的程序被利用来加载的恶意dll是“VideoSdk.dll”,“VideoSdk.dll”和伪造的ShuameManager.dll采用相同的解密key和loader框架,并且同样带有盗用的“北京财联融讯信息技术有限公司”数字签名,最终都是加载coonfig.dat导出的InitMyEntry函数来进行恶意活动。另一类Elantech.exe程序是一款韩国杀毒软件“安博士”的升级程序,该程序被利用来加载名为“AhnUpCtl.dll”的dll,功能和手法都和上述类似,这里就不再赘述。
2017年签名冒用攻击大追踪
冒用方式
签名冒用的利用方式360已经分析披露过多次,这里简单再说明一下。下图是官方正常数字签名与冒用数字签名的样本对比,两者都显示数字签名正常且签名主体均为“上海**软件有限公司”。左图是该公司官方的程序签名,而右图则是冒用的数字签名,其是冒用签名的作者伪造该公司资料在国外签发机构“Go Daddy”申请的数字证书。
图37
目前为止,发现的冒用签名主要都是通过“Go Daddy”和“Startfield”两家国外签发机构申请的,今年新增的8种冒用签名如下所示,其中每种签名对应若干张数字证书,且部分证书目前已被颁发者直接吊销:
图38
样本分析
下面主要分析带冒用签名的劫持类私服程序,由于其他恶意程序传播受限这里暂不分析。
(一)流程框架
360截获的带冒用签名的劫持类私服程序种类较多且更新频繁,其劫持组件也是经常变化,不过总体的功能框架相对不变。样本的整个运行过程如下所示,部分程序模块在玩家电脑上采用随机文件名,图中的备注名(如[msvcs.dll])是其对应在私服服务器上的模块名称。
图39
从前文的流程图看,本模块主要进行两条劫持流程,首先进行的是流程图的上半部分,母体是dnetsup.dll,最终通过安装文件过滤驱动进行劫持,紧接着进行流程图的下半部分,母体是drvsup.dll,最终通过安装tdi过滤驱动进行劫持。
(二)文件过滤流程劫持DNS
首先是文件过滤流程,过程基于dotnet(.Net)的运行环境,所以dnetsup.dll先判断并安装dotnet环境,然后通过注册通用类库的方式来得到程序运行机会。一旦注册成功,之后每次用户启动浏览器,浏览器进程都会被“注入”该劫持模块(donetset2/4),从而执行其中的程序代码,通过我们的行为监控工具查看,可以看到IE浏览器的进程树下多出了两个子进程,这两个子进程其实是注入其中的劫持模块donetset2.dll创建的(见下文):
图40
当该组件的工作例程开始运行时,就进行文件过滤驱动的安装或启动,并下载一份hosts列表保存到dida.mid这个文件来进行本地DNS劫持,上文看到浏览器的进程树即是下载完劫持列表文件后调用cmd的ipconfig命令进行DNS缓存刷新:
图41
下载的列表格式与系统hosts文件一致,主要用于劫持安全软件和竞争对手的DNS请求:
图42
本模块安装的驱动程序是从资源里释放的,dHelperKit.dll负责和文件过滤驱动的通信操作。驱动程序出自EldoS公司的一款名为“CallbackFiler”的产品,该产品实际上是专门为开发人员提供文件系统过滤功能的程序库:
图43
dHelperKit.dll负责控制驱动库完成劫持的功能。该模块的导出函数“kitStartCbfltfs”通过“CallbackFiler”提供的API来操作文件过滤驱动cbfltfs3.sys,借助其对文件系统的的过滤功能来劫持DNS。具体实现的方式是添加一个文件名(路径)重解析的回调函数,设置请求的目标文件名(路径)为本地hosts文件的路径,在系统进程访问到该文件路径时重定向到一个新的控制路径(dida.mid文件的路径):
图44
待重新下载dida.mid列表文件后调用命令刷新DNS缓存,此时负责网络服务的进程svchost会将新的hosts列表刷入本地DNS缓存,安全软件或竞争私服等程序在联网时默认先查询DNS缓存,发现缓存列表里存在相关记录项就会导致该域名解析被重定向,从而实现屏蔽或劫持网络的作用。此时检查系统的hosts文件将看不到任何异常,然而通过ping命令便能验证出DNS已被劫持:
图45
由于目标域名劫持后重定向到一个本机回环地址(127.0.0.1),所以屏蔽了对劫持域名(ip***360safe.com)的网络请求,此目的为干扰安全软件的正常联网。当然要进行劫持的域名都是由云端分配控制的,劫持列表可以随时更换,例如下面是一组被劫持的知名游戏网站,均被劫持到某一固定的ip地址(139.***.246.167):
图46
(三)TDI过滤流程劫持网络流量
接下来分析tdi过滤流程,最终实现通过驱动劫持用户的网络流量。母体drvsup.dll通过IsWow64Process判断系统环境,选择下载x64或者x86版本的tdi驱动到本地保存为mstd32.sys:
图47
下载后按照正常启动服务的方式直接启动该驱动程序:
图48
一旦驱动加载起来,后面的流程全靠该驱动独立完成,无需与应用层程序进行其他交互。驱动每次启动时重新下载一份劫持列表tdipaddr.dll到内存,并将其解析到链表中方便后面进行劫持过滤:
图49
下载的列表经常发生变化,并且同时存在多种不同的传播版本,对不同类型的知名网址进行劫持,如下是截获的其中一个版本,其中包含大量知名的游戏公司官网,均被劫持到某搜索引擎的一个服务器ip(14.***38):
图50
后面过滤IO请求时,将以该列表去匹配当前网络访问的host:
图51
满足过滤规则的所有网络IO请求会被标记,待相应的请求响应后对接收到的数据进行修改,添加301重定向响应头或者嵌入html框架来实现劫持,最后将修改后的内容返回给请求联网的应用层程序(如浏览器)处理:
图 52
例如我们通过浏览器正常访问盛大游戏官网时如下:
图53
而驱动劫持后访问盛大游戏官网则会发生跳转,将其劫持到某搜索引擎(或其他地址,根据云端列表来控制),阻碍用户正常访问游戏网站。从360浏览器的抓包工具可以看出劫持方式是嵌入一个指向搜索引擎地址的html框架:
图 54
对劫持过程进行双机调试,也能观察到访问盛大游戏官网时驱动程序劫持的过滤过程:
图55
最后发现驱动程序还注册了一个关机回调,在系统关机时改变驱动文件名,重写驱动文件来增加自身的隐蔽性。驱动的路径如下图所示,可以看到文件名为8位随机字母:
图56
重写驱动文件后将新的驱动路径注册成一个开机自启动的服务,以保证在用户电脑上的劫持活动得以延续。
图57
总结和安全建议
2017年初始至今,黑客从盗用正规公司的数字签名制造有“身份证”的木马病毒,以及有组织有预谋地入侵厂商污染软件发布流程,最后甚至使用社会工程学伪装厂商身份冒用数字签名,针对软件数字签名的攻击,无所不用其极,拥有良好信誉的软件厂商和众多软件用户已经成为黑客的主要攻击目标。
软件开发商的数字签名属于软件自身的“身份证”,软件身份被恶意利用,会对公司的商业信誉带来恶劣影响,同时也破坏了该厂商的在软件安全体系的可信身份,使安全厂商和用户都不再信任其软件身份,软件厂商将损失大量的用户。
因此,软件厂商有义务保护好自己的数字签名,如果发现数字签名被攻击应及时公告用户处置,并采取有效措施减少用户的损失。
此外,网民也应该认识到,数字签名只是识别软件身份的一种方式,软件拥有数字签名并不能代表绝对安全,针对有“身份”的软件仍然需要提高警惕,使用检测机制严格、可靠的安全软件防御恶意攻击。