图1 组件关系示意图
Equation组织攻击时,选择Fanny或DoubleFantasy或TripleFantasy作为攻击前导,当确认被攻击端是攻击者的预期目标后,会使用更复杂的组件EquationDrug或GrayFish。
小神童论坛网分析小组目前将重点放在攻击前导组件(DoubleFantasy)、更复杂的组件(EquationDrug和GrayFish)。同时对具有硬盘固件重新编程功能的nls_933w.dll进行分析。
3 组件DoubleFantasy分析
组件DoubleFantasy是用来确认被攻击目标的,如果被攻击的目标属于被Equation组织感兴趣或关注的领域,那么更加复杂的其他组件就会从远端注入到被攻击的机器中。
友商报告已经对组件DoubleFantasy进行了详细分析,小神童论坛网分析小组原本计划对组件DoubleFantasy进行分析验证,但在验证的过程中,分析小组发现该组件是以往分析过的,并找到了其他的关联的恶意代码;同时,小神童论坛网也发现了友商报告未见披露的信息。
3.1 检测安全软件
组件DoubleFantasy枚举注册表键值,查找系统是否安装了安全软件,查询的安全软件列表存在资源节中,使用0x79异或加密。在友商报告中给出了其检测是否存在的安全软件列表,共计10种,而小神童论坛网分析小组发现,实际上该组件一共检测13种安全软件的存在,除友商报告披露的10种产品外,还有360、BitDefender和Avira三家厂商的产品。
鉴于其中360安全卫士主要用户均在中国,这也进一步验证了中国也是Equation组织攻击的目标之一。
3.2 回传信息
DoubleFantasy收集系统信息,并回传给攻击者,回传格式为:
000:MAC地址001:IP地址......019:当前时间
回传的详细信息如下:
标号 |
说明 |
标号 |
说明 |
标号 |
说明 |
000 |
MAC地址 |
007 |
系统补丁信息(CSDVersion,例如sp1) |
014 |
网络连接类型 |
001 |
IP地址 |
008 |
CurrentBuildNumber(例如2600) |
015 |
安装的软件信息 |
002 |
样本版本号 |
009 |
系统CurrentVersion(5.1) |
016 |
未知 |
003 |
样本id |
010 |
ProductID |
017 |
此值不存在 |
004 |
代理设置信息 |
011 |
位置信息1 |
018 |
32位或64位 |
005 |
注册信息1
(RegisteredOwner) |
012 |
位置信息2 |
019 |
当前时间
|
006 |
注册信息2
(RegisteredOrganization) |
013 |
系统目录 |
|
|
3.3 通讯协议
DoubleFantasy的被控端返回包格式是第一字节不加密,后面的数据加密。举例0x42指令如下:
0x42指令分支详细功能
功能:重新上线,初始化通讯密钥,删除自身,清理感染痕迹。
控制端发包格式:第一字节为指令代码0x42,第二字节为指令分支,分别有3种:00立即重新上线,01初始化通讯密钥,Sleep 60秒后重新上线,02删除自身,清除感染痕迹。
被控端返回包格式:无。
3.4 新的版本、C&C、密钥
友商报告给出了相关组件的版本、C&C列表和密钥,经小神童论坛网进一步分析,获得了更多相关信息。下文中绿色为友商报告中信息,红色(加粗)为小神童论坛网分析出的新的信息。
版本列表:
8.1.0.4 (MSREGSTR.EXE)
008.002.000.006
008.002.001.001
008.002.001.004
008.002.001.04A (subversion "IMIL3.4.0-IMB1.8.0")
008.002.002.000
008.002.003.000
008.002.004.000
008.002.005.000
008.002.005.001
008.002.006.000
011.000.001.001
012.001.000.000
012.001.001.000
012.002.000.001
012.003.001.000
012.003.004.000
012.003.004.001
013.000.000.000
C&C如下:
advancing-technology[.]com
avidnewssource[.]com
businessdealsblog[.]com
businessedgeadvance[.]com
charging-technology[.]com
computertechanalysis[.]com
config.getmyip[.]com - SINKHOLED BY KASPERSKY LAB
globalnetworkanalys[.]com
melding-technology[.]com
myhousetechnews[.]com - SINKHOLED BY KASPERSKY LAB
newsterminalvelocity[.]com - SINKHOLED BY KASPERSKY LAB
selective-business[.]com
slayinglance[.]com
successful-marketing-now[.]com - SINKHOLED BY KASPERSKY LAB
taking-technology[.]com
techasiamusicsvr[.]com - SINKHOLED BY KASPERSKY LAB
technicaldigitalreporting[.]com
timelywebsitehostesses[.]com
www.dt1blog[.]com
www.forboringbusinesses[.]com
Ign***list.com
Dat***cemgmt.net
Imp***today.com
Bud***nessnews.com
新的密钥:
37 08 EF 89 29 A7 4B 6B AB 3E 5D 03 F6 B0 B5 B3
66 39 71 3C 0F 85 99 81 20 19 35 43 FE 9A 84 11
8B 4C 25 04 56 85 C9 75 06 33 C0 5E C2 08 31 F6
32 EC 89 D8 0A 78 47 22 BD 58 2B A9 7F 12 AB 0C
组件DoubleFantasy通常是受害者被Equation组织感染的第一步,通过与后门的通信以及对不同系统参数的检查来确认受害者的信息。受害者一旦被确认,Equation组织将使用更复杂的组件EquationDrug或Grayfish。
4 组件EquationDrug分析
组件EquationDrug是一个很复杂的模块。其存活时间有近10年,后来被GrayFish升级给代替了。小神童论坛网在分析中发现两个模块中的一些文件名称有相同处,从混淆加密等方面来看也有多处手法相同。它们都是从资源解密、解压缩和释放文件。分析中发现在资源里有一个SYS和一个VXD文件。VXD是Windows 9x下的驱动机制,所在可以认定这个模块也有感染Windows 9x下的能力。其EquationDrug是一个插件平台,它具有安装与卸载插件功能。
图2 组件EquationDrug的创建与调用关系图
模块名称 |
功能 |
msnadt.exe |
文件功能主要为释放文件、解密资源、判断系统类型、注入代码到指定进程和加载驱动等功能。 |
MSDIRECTX.EXE |
创建INSTV3.BAT并运行自删除。 |
MSCFG32.exe |
加载MSCFG32.DLL,添加和修改注册表。 |
MSCFG32.DLL |
该文件会添加和修改注册表,释放unity.dll文件。与驱动文件有关系,含有网络功能。 |
unity.dll |
有大量文件操作和注册表操作 |
MSNDSRV.SYS
MSSVC32.VXD |
功能基本相同,但VXD是在windows9.x下用的,主要功能是hook、网络监听和写文件等。还会判断系统中是否有MSlog32.dat,有就打开写入数据,没有就创建一个新的。 |
INSTV3.BAT
INSTV4.BAT |
自删除文件。 |
4.1 检测安全软件
其枚举注册表键值,查找系统是否安装了安全软件,查询的安全软件列表存在资源节中。
其所检测的安全软件比DoubleFantasy组件更多,且类型也更加丰富,但同时其检测的中国安全软件是瑞星(Rising),但并未检测当前更为流行的360。因此也可以验证前文关于这个组件已经被更新组件替代的结论。相关检测的注册表键值如下:
Zone Labs\TrueVector\
Zone Labs\ZoneAlarm\
KasperskyLab\
Network Ice\BlackIce\
Agnitum\Outpost Firewall\
Sygate Technologies, Inc.\Sygate Personal Firewall\
Norman\
Data Fellows\F-Secure\
PWI, Inc.\
rising\
Softwin\
network associates\tvd\shared components\on access scanner\behaviourblocking\FileBlockEnabled_27!=0
network associates\tvd\shared components\on access scanner\behaviourblocking\FileBlockEnabled_28!=0
network associates\tvd\shared components\on access scanner\behaviourblocking\FileBlockEnabled_29!=0
network associates\tvd\shared components\on access scanner\behaviourblocking\FileBlockEnabled_30!=0
McAfee\ePolicy Orchestrator\Application Plugins\VIRUSCAN8600
Sophos\
CA\CAPF\
CA\HIPSEngine\
Cisco\
Symantec\IDS\
Symantec\Norton 360\
Symantec\Internet Security\SuiteOwnerGuid\
Symantec\Norton AntiBot\
Symantec\Symantec Endpoint Protection\
Tiny Software\Tiny Firewall\
CyberMedia Inc\Guard Dog\
McAfee\Guard Dog\
McAfee\McAfee Firewall\
McAfee\Personal Firewall\
McAfee.com\Personal Firewall\
Network Associates\McAfee Fire\
Kerio\
BullGuard Ltd.\BullGuard\
TheGreenBow\
Panda Software\Firewall\
TrendMicro\PC-cillin\
ComputerAssociates\eTrust Suite Personal\pfw\
Grisoft\Firewall\
4.2 驱动模块MSNDSRV.SYS分析
1. 驱动初始化的时候从注册表中遍历了所有的网卡,然后调用函数NdisRegisterProtocol向NDIS库注册了一个NDIS协议相关的结构。注册后该驱动就可以收到本机上的所有的网络流量,这一点类似于WinPcap的捕包机理。相关代码如下:
2. 修改了KeServiceDescriptorTable中的函数的地址。
图3 原始的KeServiceDescriptorTable中的函数地址
图4 修改后的KeServiceDescriptorTable中的函数地址
修改后的函数地址只是包含一个JMP指令。 如果KeServiceDescriptorTable中的函数不是它要hook的目标则直接跳回原始函数的地址,否则跳到驱动自己的函数中去。
如函数nt!NtAcceptConnectPort在KeServiceDescriptorTable中它的地址是820742b1。
该处的指令如下:
820742b1 2eff25b8420782 jmp dword ptr cs:[820742B8h] |
820742B8就是NtAcceptConnectPort对应的地址。而函数NtTerminateProcess在KeServiceDescriptorTable中的地址是0x81cf9ebd.该处的指令为:
81cf9ebd 2eff25c49ecf81 jmp dword ptr cs:[81CF9EC4h] |
81CF9EC4中包含的地址为b1fd6eae,该地址指向驱动的一个函数。目前驱动hook的函数如下:
NtClose
NtCreateFile
NtCreateKey
NtCreateProcess
NtCreateProcessEx
NtCreateThread
NtEnumerateKey
NtOpenFile
NtOpenKey
NtOpenProcess
NtQueryAttributesFile
NtQueryDirectoryFile
NtQueryDirectoryObject
NtQueryFullAttributesFile
NtQueryKey
NtQuerySystemInformation
NtSetInformationFile
NtTerminateProcess
5 组件GrayFish分析
GrayFish是Equation组织中最复杂的攻击组件,是EquationDrug的新一代版本,小神童论坛网分析小组认为其最重要的特点是:不依靠文件载体,而是完整的存在于注册表中,依靠bootkit在操作系统启动时执行,这一机制穿透了安全产品以文件为检测对象的机制,也穿透了相关基于白名单和可信计算的解决方案。
组件GrayFish的资源段中包含13个加密资源,均通过同一段解密算法进行解密:
解密后的13个文件中有5个驱动文件(sys)、2个动态链接库文件(dll)、4个包含注册表数据的文件、1个含有字符串“services.exe”的配置文件及1个加密的数据文件。
动态调试后发现,其中3个驱动文件hrilib.sys、msndsrv.sys及netvt.sys是由原始样本释放,包含网络驱动及注册表相关操作函数。mscfg32_ks.dll调用mscfg32.dll,拥有创建远程线程、获取系统信息、创建和删除注册表键值等功能。除已释放的三个驱动文件外,资源102中含有对注册表进行操作的函数,而DesertWinterDriver.sys中包含对IoControlCode的比较,具体功能有待分析。
另外,原样本会生成批处理用以删除自身,该批处理文件名与EquationDrug用以自删除的文件名完全相同,这也说明二者之间具有密切的联系。
6 硬盘固件重新编程模块nls_933w.dll分析
nls_933w.dll是具有硬盘固件重新编程能力的模块,由于硬盘固件是一个小神童论坛网分析小组之前缺少储备的领域,因此分析进展非常缓慢。从目前分析来看,当nls_933w.dll模块被其他程序调用后,nls_933w.dll从自身资源释放win32m.sys驱动文件,win32m.sys驱动文件负责与硬盘控制器进行通信,它能够判断硬盘控制器类型,如:IDE、SATA等,根据不同类型的硬盘控制器发送对应的控制指令。因此只要攻击者熟悉各硬盘厂商规定的ATA指令,那么就可以对硬盘固件进行恶意篡改。
图5 修改硬盘固件的流程图
动态调试后小神童论坛网分析小组发现,该模块调用函数DeviceIoControl与win32m.sys进行交互。在win32m.sys中,小神童论坛网分析小组发现多个IoControlCode并分析了它们所对应的功能。
图6 IoControlCode所对应的功能图
小神童论坛网分析小组发现,当IoControlCode为0x870021D0时,nls_933w.dll对硬盘控制器发送ATA控制指令:0xEC,获取硬盘相关信息。
图7 获取硬盘相关信息
调用DeviceIoControl前后内存中的数据对比,调用后返回硬盘信息:
其他的IoControlCode所对应的功能及ATA指令有待进一步分析和发现。
7 攻击硬盘固件的机理分析
7.1 硬盘的结构和工作原理
不论是传统的机械硬盘还是固态硬盘,其总体的结构都是相似的。硬盘主要由处理器、缓存、Boot ROM和主存储介质等几部分构成,对于机械硬盘,还有电机驱动电路和磁头控制电路等。其简化原理框图如下图所示:
图8 硬盘原理框图
由于硬盘的电路板上已经具有了CPU、内存和ROM,硬盘可以看做是一个小型的计算机系统,在固件的控制下可以有自己的行为。目前常见的硬盘处理器都是基于ARM核心的,新型的硬盘控制器甚至采用多核结构来保证高速的数据传输。
硬盘通电时,处理器执行片内的Loader代码,这部分代码会加载Boot ROM到缓存中,并执行(对硬盘上的嵌入式处理器来说,就是内存)。Boot ROM可能存放在主控的片内FLASH,独立的I2C EEPROM,SPI FLASH芯片或者固态硬盘上的NAND FLASH阵列中。Boot ROM得到控制权之后,会依次初始化基本外设,初始化主存储介质,从主存储介质上加载固件主体,启动IDE/SATA总线接口驱动模块,并进入待命状态,此时计算机即可对硬盘进行操作。
1) 传统机械硬盘
对于目前大部分的机械硬盘来说,其固件的主体部分通常存放在盘片上的隐藏扇区中,Boot ROM按照校准数据初始化磁头组件之后,从隐藏扇区中读取固件数据,并将控制权转交给固件主体,固件主体完成自身初始化之后,加载并启动总线接口驱动模块。至此,硬盘完成上电启动过程。
机械硬盘的内部结构如图所示:
图9 机械硬盘组成与结构
(http://jingyan.baidu.com/article/ab0b5630d88efdc15bfa7d60.html)
硬盘的数据存储在磁盘盘片上,硬盘工作时,主轴带动盘片高速旋转,读写磁头悬浮于盘片上方几微米处,通过巨磁阻效应来进行读写操作。传动手臂通过强磁铁与线圈构成的音圈电机进行寻道,以定位要读写的内容。图中的返利局弹簧装置是给传动手臂提供回复力的,该装置能够保证硬盘在断电的时候,磁头能够自动归位到Park区。Park区有一块柔软的支撑垫,可以在硬盘不工作时固定读写手臂,以免因外界震动而划伤盘片。
2) 固态硬盘
与机械硬盘相比,由于没有机械结构,固态硬盘的结构要简单不少,通常的固态硬盘都可以用下面的图来描述:
图10 固态盘及其控制器结构框图
(《JMF608SATA III NAND Flash Controller datasheet》)
图中左边的框是固态硬盘的控制器,右边是板载外设和NAND FLASH阵列,部分型号的控制器还需要外置的Data Buffer RAM,也就是缓存。从图中可以看出,控制器本身就可以构成一个完整的计算机系统,其引导过程与机械硬盘类似,在此就不再重复了。
3) 硬盘的接口规范
目前常见的IDE和SATA硬盘都遵循ATA指令集,PC机通过发送ATA命令来对硬盘进行读写操作。
ATA技术是一个关于IDE(Integrated Device Electronics)的技术规范族。最初,IDE只是一项以把控制器与盘体集成在一起为主要意图的硬盘接口技术。 随着IDE/EIDE得到的日益广泛的应用,全球标准化协议将该接口自诞生以来使用的技术规范归纳成为全球硬盘标准,这样就产生了ATA(Advanced Technology Attachment)。ATA发展至今经过多次修改和升级,每新一代的接口都建立在前一代标准之上,并保持着向后兼容性。除了读写命令以外,硬盘还支持一些高级功能,比如自我监测功能(SMART),容量设置(HPA)、噪音管理(AAS)等。详见《ATA/ATAPI Command Set - 2 (ACS-2)》(一部500多页的大部头标准文档!)。
7.2 硬盘的信息安全脆弱性
特别要值得注意的是,目前大部分硬盘都支持固件升级功能(通过下载微码命令或者厂商的私有命令实现),用户可以通过厂商规定的ATA指令来对硬盘驱动器上的固件进行更新。这使得硬盘厂商无需召回有固件bug的产品,而可以在用户系统上通过软件工具升级固件,修补缺陷。例如,希捷2008.12月的硬盘有故障,官方发布了固件更新工具和使用说明,使用户刷新固件解决问题。类似的还有硬盘厂商西部数据的C1门事件。
下图以Seagate SandForce SF-2200系列固态硬盘为例,说明硬盘固件的升级过程:
图11 Seagate SandForce SF-2200系列固态硬盘固件升级流程图
这种通过主机软件在系统(In System)升级固件的机制使用很方便,但也意味着存在着固件被恶意篡改的可能性。而且这种篡改可以是通过软件操作,在用户毫不知情的情况下进行。
如前文所述,硬盘本身就是一套完整的嵌入式系统,其内部的固件独立于计算机软硬件而运行。固件完全决定了硬盘的读写操作行为,甚至可以在主机不知情的时候自主处理数据。如果攻击者在硬盘的固件中设计了精巧的代码,则可以对用户的读写操作进行拦截和干扰,或者通过这种手段获得系统的最高控制权,而所有这一切都是在硬盘上完成的,计算机前面的用户、计算机上的软硬件根本无法感知这一过程,甚至知道也无法干预这样的动作发生。
图12 Jasmine开发板结构框图
以OpenSSD项目(一个以研究性质的开源硬盘项目)中的Jasmine开发板为例,如果攻击者对某款硬盘的控制器的结构非常了解,包括片上的外设地址空间等信息。则改攻击者可以通过精心构造的修改版固件来对控制器的某些特定的行为进行拦截,并在数据传输途中对缓存DRAM中的数据进行修改。比如拦截ATA读取命令20h,在读取指定扇区时篡改缓存中的数据,使计算机实际获得的数据与磁盘上存储的内容不符,进而实现自下而上的攻击效果。这种攻击方式对来自硬盘的数据流的改写完全绕过了计算机系统,因此可以在重装系统甚至低格硬盘之后仍然保持其危害性。
8 小结
时间总是让人觉得似曾相识,2月16日,农历腊月二十八,还有两天就是春节了,关于方程式攻击组织的相关信息浮出水面。这让我们想起2003年农历小年的Slammer蠕虫、2004五一节的震荡波蠕虫、以及去年国庆节前的“破壳”漏洞。但不同的是,此前事件冲击的是我们的应急速度,而方程式考验的是我们综合储备与能力深度,以及分析耐心。
对小神童论坛网的分析团队来说,这是第一次在发布一篇分析报告时如此惴惴不安。在2003年发布Dvldr(口令蠕虫)分析报告时,我们是那样急切,希望用户更快看到我们提供的解决方案;在发布震网分析报告时,我们是那样盲目,自以为我们的工作已经基本足够;在发布火焰系列组件分析报告时,我们是那样放任——既然庞大到分析不过来,就接力式的分析-发布好了。但这一次,完全不同,因为我们一度被卡住了,不因加密、驱动、隐藏,而是因为“硬盘固件”,对于那些经过长期准备而施于一点的攻击来说,防御者搞清问题的关键往往去取决于愿意付出多少人力与时间。
我们自以为是敏锐的,我们很早就在关注嵌入式与固件,我们大讲威胁的泛化,但当威胁真正出现于面前之时,我们才发现对手更加先验和强大,而我们的所谓敏锐何其幼稚。
而同样令我们忧心忡忡的是,相关事件的报告正在不断的走形。很多用户向我们求证和询问“是不是所有硬盘都已经放入了后门木马”。
因此尽管我们的分析工作还在持续之中,我们依然要凭借经验给出下列结论或判断:
1、 硬件设备的固件可更新机制,是软硬件系统发展的必然结果,这种机制本身不能被称之为后门。同时对更多带有固件系统来说,如果没有更新机制,那么将导致有问题的版本不能得到补丁,即可能带来更大的运维成本,也反而可能是一个重要的安全隐患。
2、 综合小神童论坛网和友商以及其他机构目前分析结果来推测,相关攻击中写入固件的行为发生于前导恶意代码回传主机信息,并被远端判定为有价值目标的情况下,即其并非一个普遍行为,而是一个高等级、有条件的入侵行为。
3、 通过长期的分析摸索,攻击者完全可以独立实现相关机理,并不一定需要入侵硬盘厂商获取技术文献,甚至靠硬盘厂商主动提供技术文献。
4、 其写入硬盘固件,关键是用于实现潜伏与长期存在,但上层的作业能力依然存在于主机系统中,而且可以通过网络灵活获取其他作业模块。
5、 鉴于相关国家此前的行为,我们也有理由怀疑,同样的组件,可能被用于物流链劫持,即在特定目标采购、返修主机或硬盘的过程中注入。但基于其作业手法和风险分析,我们有理由认为,对方程式这样的对手来说,这种Bootkit+固件的作业手法,通常不会进行批量作业。
6、 但后续我们同样要警惕的是Bruce Schneier所警告的 “越来越多战争中的战术行为被应用于更广泛的网络空间环境中”,而且新的手法一经曝光就会对黑产产生强烈的启迪效应,从而使威胁泛滥。
7、 相关攻击确实体现了相关供应链的安全盲点,对于硬盘固件是否有有效的签名验证机制,而同时已经写入硬盘的固件,目前来看我们没有找到看到低成本的无条件读取的接口。类似的设计就给安全分析人员进行检测验证带来了困难。
防御阵地的规划,不能依赖于臆想对手。客观看待安全与发展的关系,深入具体的分析威胁,研判对手的策略和路径,永远是我们应对威胁的支点。