导语:在一项独家研究中,Check Point研究人员对朝鲜本土的反病毒软件SiliVaccine进行了一项深入调查。其中有意思的一幕是SiliVaccine代码的一个关键组成部分是趋势科技(一家日本软件公司)10年前的历史版本。

一、背景

这次调查始于我们的研究团队收到了一个非常罕见的朝鲜SiliVaccine反病毒软件样本,来自于一位专注于朝鲜技术的自由记者Martyn Williams

2014年7月8日,威廉姆斯先生收到了该软件,来自名为Kang Yong Hak的人发送的可疑电子邮件中的链接,此人的邮箱目前已无法访问。经过仔细观察,我们的团队发现了几个有趣的元素。

被称为日本工程师的Kang Yong Hak发送的奇怪电子邮件中包含一个到Dropbox托管的zip文件的链接,该文件包含SiliVaccine软件的副本以及一个韩文说明文档指导如何使用该软件以及可疑的外观文件冒充SiliVaccine补丁。

二、趋势AV扫描引擎

在对SiliVaccine的引擎文件进行详细的取证分析后,我们的团队发现SiliVaccine和属于趋势科技的大型反病毒引擎代码的完全匹配,趋势科技是一家完全独立的日本网络安全解决方案供应商。此外,SiliVaccine的作者很好地隐藏了这种完全匹配编码。由于趋势科技是一家日本公司,日本和朝鲜没有任何正式的外交或政治关系,这是一个令人惊讶的发现。

当然,防病毒的目的是阻止所有已知的恶意软件签名。然而,对SiliVaccine的深入调查发现,它旨在忽略一个特定的签名,此签名通常会被阻止,也被趋势科技检测引擎阻止。虽然目前还不清楚这个签名究竟是什么,但显然朝鲜政权并不想让用户知道它。

三、捆绑恶意软件

在Marytn收到的SlitVaccine软件中也发现了JAKU恶意软件。这不一定是反病毒的一部分,但可以针对像威廉姆斯先生这样的记者。

简而言之,JAKU是一个高度适应的的僵尸网络,已经感染了大约19,000名受害者,主要通过恶意BitTorrent文件共享。然而,它早被发现专门针对和追踪韩国和日本的个人受害者,包括国际非政府组织(NGO)成员、工程公司、学者、科学家和政府雇员。

我们的调查发现,虽然JAKU文件是通过'宁波高新区致电电力科技有限公司'签发的证书签名的,该公司同时为另一个知名的APT组织Dark Hotel签名文件。JAKU和Dark Hotel都被归于朝鲜攻击者。

四、与日本的关系

除了来自一位声称的日本发件人的包含朝鲜反病毒副本的初始电子邮件外,我们的研究人员还发现了与日本的其他关系。

在调查过程中,我们发现了撰写了SiliVaccine的公司的名称,其中两家是PGI(Pyonyang Gwangmyong信息技术)和STS Tech-Service。 

然而,除了这些关系之外,日本和朝鲜之间是没有任何官方外交关系的敌对关系。

STS技术服务公司是朝鲜的一家公司,它以前曾与其他公司合作,其中包括以“银星”和“白玉兰”为名的公司,这两家公司都位于日本。

五、总结

这一次对SiliVaccine的调查可能会引起对这个神秘王国IT安全产品和运营的真实性和动机的怀疑。

虽然溯源在网络安全中一直是一项艰巨的任务,但我们的研究结果提出了许多问题。然而,显然SiliVaccine的创造者和支持者有着阴暗动作和可疑目的。

下面是调查的完整技术细节。

———————————————————————————————————————————

目录

Architecture and Overview
File Scanning Engine
Trend Micro’s Response
Pattern Files
Detection Naming Renaming Scheme
Malware Whitelisting
Kernel Drivers
Authorship Background
The Mysterious Patch File

———————————————————————————————————————————

第一章 框架及概述

SiliVaccine具有相当古典的反病毒结构。它由用户和内核模式组件组成,所有这些组件一起工作,用于针对给定的静态恶意软件签名库(称为模式文件)扫描文件或内存。通常,扫描可以根据需要或实时进行,每个扫描组成一个独立的组件来相应地处理扫描行为。无论哪种方式,所有这些都是通过在产品核心中的单一逻辑来实现的,即所谓的引擎。

下图给出了包含SiliVaccine及其相互作用的各种元素的总体概述,然后简要介绍了每个组件及其目的:

图1: SiliVaccine的框架

(一)库

· SVKernel.dll:文件扫描引擎是AV中最重要的组件。它具有检测文件类型的核心功能,对其进行解析并通过其各节查找恶意指示符。后者以签名的形式出现,为引擎指定并描述识别恶意软件系列或样本的各种属性。这些文件存储为一组34个文件——从SVPatt00.spf到SVPatt33.spf,并且可以在运行期间由引擎读取和解释。引擎的所有功能都通过20个DLL导出函数(SVFunc001——-SVFunc020)公开,而后者又供执行扫描任务的可执行文件使用。在下面的章节中会更深入地介绍模式文件和引擎本身。

· SVRegSrv.dll:这是安装包的一部分,它负责部署或卸载部分AV组件。该DLL提供3个导出函数(除了DllMain),每个都采取不同的操作过程:

1.RegService: 由SiliVaccine的MSI安装程序调用,用于激活软件的主要组件。通过执行exe,将SVDealer.exe注册为服务并将ststdi2.sys作为驱动程序加载来完成的。除此之外,它还为隔离文件和扫描日志创建目录,并为AV的所有其他组件(例如安装路径,可在HKLM\SOFTWARE\STS Tech-Service\SVaccine的AppPath键中找到)创建基本注册表值。

2.RemoveAllComponent: 删除之前安装的所有组件,即可执行文件、DLL、隔离目录、扫描日志和注册表项。

3.UnRegService: 找到所有与“SiliVaccine 4.0”,“SiliVaccine 4.0 Update”和“SiliVaccine 4.0 Patch”相关的活动窗口,并通过发布WM_CLOSE窗口消息关闭它们。此外,它通过其窗口类('SVTRAY')查找托盘应用程序并关闭它,卸载sys和SVFilter.sys驱动程序并删除SVDealer.exe服务。

有趣的是,最后2个函数从来没有被调用过,因为安装文件中的软件没有卸载工具。

· SVShell.dll:一个用作外壳扩展的COM类,用于注册SiliVaccine上下文菜单处理程序(如下图所示)。该处理程序允许在单击鼠标右键时扫描特定文件;但是,如果这样做不会有实际行动。

 

图2: SiliVaccine的上下文菜单项

(二)服务

· SVDealer.exe:用户模式组件注册为负责执行实时扫描任务的服务。为此,它加载一个名为SVFilter.sys的文件系统过滤器驱动程序,该驱动程序拦截各种文件系统活动并向SVDealer组件发出信号,以便触发它扫描文件并以判决报告。扫描本身是通过调用SVKernel.dll(SVFunc018)的相应导出来完成的。在接下来的章节中给出了更深入的解释。

(三)GUI组件

· SVTray.exe:作为托盘图标出现的最基本的GUI组件,它不断在系统上运行。与托盘应用程序相对应的菜单(通过右键单击该图标打开)允许打开SVMain.exe或SVUpdate.exe组件,或激活\禁用实时保护功能。

· SVMain.exe:用户通过它与软件进行交互的主窗口,该窗口允许对特定文件\目录进行手动扫描或更改各种设置,如文件白名单,更新计划等。还允许打开SVUpdate.exe实用程序。

图3 & 4: SVMain GUI 与 SVTray菜单

· SVUpdate.exe:一个更新实用程序,它与DPRK内的Intranet服务器通联,以便轮询二进制可执行文件或特征文件的新版本。
所通联的服务器可以硬编码,在本样本中为10.10.1.16 \ 10.250.2.33,或者在SVMain组件中手动配置。AV客户端和更新服务器之间的通信协议基于HTTP,并带有一些特殊的附加内容,例如'User-Dealer'字段,它作为普通'User Agent'字段的补充

图5: 在更新请求时附加到HTTP头部的自定义字段

使用SVDiffUpd.exe的自定义比较工具检查接收到的每一个更新文件的完整性。

(四)命名管道

· CommWithMainPipe:用于将SVMain的进程ID传递给SVDealer,然后通过IOCTL将其传递给SVFilter驱动程序。驱动程序将此ID号注册为全局变量(以及SVDealer的PID)。在访问系统上的任何文件时,过滤驱动程序会检查关联进程的PID,如果是AV组件(即SVMain或SVDealer),则允许访问。

· CommWithTrayPipe:用于通知托盘应用程序新连接的可移动媒体。为此,SVDealer使用GetLogicalDrives函数生成当前可用驱动器的位掩码,并监视它的变化。一旦检测到更改,SVDeresize将文件系统过滤器驱动程序附加到新驱动器,设置一个名为RemovableMediaInsertEvent的全局事件,并将驱动器索引作为位掩码通过命名管道传递给SVTray。反过来,循环监控管道数据的托盘应用程序设置一个名为MemoryScanEvent的全局事件来发送信号,并将新的驱动器索引位掩码作为窗口消息发送到'SVTRAY'窗口。

(五)驱动

· sys:文件系统过滤器驱动程序,它与实时保护服务(SVDealer.exe)进行通信。拦截文件系统上的某些动作,以便将控制传递给上述过程以进行先期扫描。并根据扫描结果确定该行为是否应该发生。

· sys:一个在内存扫描时与SVMain交互的驱动程序,在此情形下,它提供了与扫描进程相关的各种细节,这些细节只能通过内核模式访问。

· sys:拦截系统TDI客户端发送的所有TCP数据包的TDI驱动程序。驱动程序记录数据结构中的所有连接,并允许其他实体通过IOCTL查询它。

值得注意的是,上面提到的一些组件(即:SVKernel,SVDealer和所有的GUI组件)受到Themida和Unopix(加壳程序)的保护。虽然Themida的使用在商业软件中很常见,但在此处使用它有点令人费解;这是因为它很难脱掉,并且对逆向工程提供了非常稳固的缓解。考虑到SiliVaccine在朝鲜市场没有竞争对手这一事实,目前尚不清楚为什么该软件必须得到如此的保护。后面可能会提供使用它的可能解释。

第二章 文件扫描引擎

SiliVaccine的核心元素之一就是扫描引擎。这实际上是一个名为SVKernel.dll的DLL,它负责对文件或进程内存执行扫描,以确定它是否是恶意的。在前一种情况下,它还将基于被称为模式文件的签名库提供检测名称(即为该文件触发的签名的名称)。这可能是该软件中最重要的组件,并且正在由AV的其他实用程序加载,以便自行调用扫描。

如前一节所述,引擎二进制文件(以及其他几个文件)包含Themida 2.x和Unopix 0.94,这两种高效软件保护程序都允许虚拟化部分代码并提供各种逆向工程缓解措施。这使得生成的安装的二进制文件难以分析。尽管如此,我们能够解包样本,因为几乎没有代码的任何部分被虚拟化,而且只启用了很少的保护功能。

查看解压后的二进制文件,我们发现在名为vsapi32.dll找到了在互联网上的另一个文件中出现的字符串。事实证明,这是由趋势科技编写的专有文件扫描引擎,趋势科技是日本网络安全厂商AV解决方案。他们的引擎与SiliVaccine中的引擎具有完全相同的目的,并且很相似。

为了评估这两个文件之间的相似度,我们进行了二进制比较。令人惊讶的是,它们之间共享了大量的代码。事实上,根据非常强的标准(例如相同的函数哈希,相同的伪代码等),多达1,691个函数具有100%的匹配。下图概述了这一发现,该图显示了比对过程的一些结果。

图6: SVKernel.dll和vsapi32.dll之间二进制比对的结果

从上图中可以看出,SVKernel的一些导出函数与vsapi32导出的函数完全匹配。事实上,至少17个SVKernel导出函数要么与vsapi32中的导出函数完全相同,要么是对这些函数的包装。下面一张表格显示了两个引擎导出函数之间解析的映射,以及为SiliVaccine特别编写的其他几个映射:

下图显示了几个主要导出函数中代码的相似性。第一个对应于设置扫描任务所需的所有参数的函数。尽管这两个函数中的逻辑实际上是相同的,但在所使用的内部数据结构中存在一些变化,这通过相应结构的分配大小而变得明显。这可能表明,对结构进行了一些修改以适应SiliVaccine引擎的实现。

图7: SVKernel.dll和vsapi32.dll中病毒扫描功能的比较

下一个比较是初始化整个扫描期间使用的内部配置结构中的字段的函数。此处更新的特定字段是与扫描日志文件的ID相对应的字段。功能之间可以看到一个重要区别——SiliVaccine版本使用内联版本的memset和memcpy函数,而趋势科技引擎实际调用libc函数。此功能内联发生在整个代码的几个相似位置,并且表明可能趋势科技源代码已重新编译为原始引擎中未使用的优化。

图8: 比较SVKernel.dll和vsapi32.dll中专有数据结构的初始化函数

与此类似,我们可以观察到初始化内部扫描信息结构的SVFunc004。在这种情况下,我们再次见证函数内联———这次是memcpy和strcpyfunctions。更重要的是,如果我们查看放入结构中的数据,我们可以看到其中一个字段包含引擎的实际版本,该版本在二进制文件中进行了硬编码。因此,我们可以推断SiliVaccine的作者使用的趋势科技引擎为8.910-1002。虽然这个版本的信息可以在线获得,但它的后续版本(版本8.95)和版本8.87(前一版本)很难找到。也可以说这个引擎版本是在2008年8月发布的,并且仍然部署在我们正在研究的SiliVaccine版本中,这个版本已知为2013年。

图9:比较SVKernel.dll和vsapi32.dll中的扫描信息结构的初始化函数

最后,来看看SVFunc006的扫描清理功能,它可以去除各种AV文件和内存工件,这是我们发现趋势科技和SiliVaccine的引擎之间的关键区别。如果我们看看函数的SVKernel版本,我们可以发现一个本地函数调用,用于卸载和清理名为SVIO.sys的传统SiliVaccine驱动程序。该版本的AV中不存在此驱动程序,与vsapi32和趋势科技无关。

图10: 扫描清理

第三章 Trend Micro的响应

在这一点上,有必要提一下,我们已经联系趋势科技了解其引擎被SiliVaccine使用的情况。趋势的反应非常迅速,并与我们的团队高度合作。他们的回应如下:

趋势科技了解了Check Point对'SiliVaccine'朝鲜反病毒产品的研究,Check Point向我们提供了一份用于验证的软件副本。虽然我们无法确认该副本的来源或真实性,但它显然已合并了有10多年历史的在各种产品中广泛使用的趋势科技扫描引擎模块。趋势科技从未在朝鲜或与朝鲜做过生意。我们相信,模块的此类使用完全没有许可且是非法的,我们也没有看到证据显示涉及到源代码。扫描引擎版本相当陈旧,多年来已经通过各种OEM交易被广泛整合到趋势科技和第三方安全产品的商业产品中,因此SiliVaccine的创建者获取的途径目前尚不清楚。趋势科技对软件盗版采取强烈立场,但在这种情况下,法律追究没有效力。我们不认为此类涉嫌侵权的使用会对我们的客户构成任何重大风险。

趋势科技指出,广泛许可的库被盗用可能是SiliVaccine使用他们的扫描引擎超过10年的版本的主要原因,我们的团队还对旧版SiliVaccine进行了其他分析,表明这不是一次性事件。

第四章 模式文件

SiliVaccine的恶意软件签名存储在一系列称为模式文件的文件中。深入研究这些文件可以发现它们实际上是趋势科技的模式文件(lpt $ vpn文件),经过加密后分为2MB每块。这并不奇怪,因为SiliVaccine使用趋势科技的扫描引擎。

图11: 构成SiliVaccine使用的整体签名库的文件列表,称为模式文件

这些模式文件使用一种自定义加密协议进行加密,使用稍微修改的SHA1哈希算法。虽然理解加密算法本身是一个很大的挑战,但它并不是真的必要,因为解密后的模式文件可以简单地从内存中转储出来:

图12: 包含解密模式文件的内存转储

关于解密过程的一个有趣事实是解密“密钥”.

密钥似乎是随机英文字母的组合。但是,如果在语言设置为“韩语”时在韩语——英语键盘上键入,则会得到韩文短语,该短语可以直接翻译为“模式加密”。

SVKernel的导出函数SVFunc019负责读取,解密和解析模式文件。它通过读取每个文件,将其解密并将其附加到存储完整解密缓冲区的全局缓冲区来实现:

图13: 模式文件加载和解密代码

SVMain和SVDealer调用专有的SVFunc019函数来加载和解密模式文件,并使用趋势科技的代码(SVFunc007——VSReadPatternInFile)来解析和加载签名本身。

源链接

Hacking more

...