行业新闻

SolarWinds供应链攻击事件带来的启示

SolarWinds供应链攻击事件带来的启示

一、概述

2020年12月13日,美国网络安全公司FireEye发布分析报告称,SolarWinds旗下的Orion基础设施管理平台的发布环境遭到黑客组织UNC2452入侵,黑客对文件SolarWinds.Orion.Core.BusinessLayer.dll的源码进行篡改添加了后门代码,该文件具有合法数字签名会伴随软件更新下发,这些后门会执行命令,包括传输文件、执行文件、分析系统、重启设备和禁用系统服务的功能。这项攻击可能早在2020年年初就开始了。

FireEye称已在全球多个地区检测到攻击活动,包括北美、欧洲、亚洲和中东的一些政府、咨询、技术公司。SolarWinds已在其官方网站发布安全公告,公布受影响版本为2019.4 HF 5 - 2020.2.1,并提示用户升级至2020.2.1 HF 1版本。

SolarWinds公司创办于1999年,主要生产销售网络和系统监测管理类的软件产品,为全球30万家客户服务,覆盖了政府、军事、教育等大量重要机构和超过9成的世界500强企业。Solarwinds Orion是一款功能强大的网络性能监控程序。

二、事件分析

SUNBURST后门

SolarWinds.Orion.Core.BusinessLayer.dll是Solarwinds Orion程序框架的SolarWinds数字签名组件,这次事件包含一个后门,该后门通过HTTP与第三方服务器进行通信,此SolarWinds Orion插件的木马版本叫SUNBURST。

后门安装后它会检索并执行称为“作业(Jobs)”的命令,这些命令包括传输文件、执行文件、分析系统、重启设备和禁用系统服务的功能。该恶意程序将其网络流量伪装成 Orion Improvement Program (OIP) 协议,并将监控结果存储在合法的插件配置文件中,允许其融入合法的SolarWinds活动。后门使用了多种伪装技术来逃避杀毒软件等检测工具。

1629185392_611b65701580d54bedbd1.png?1629185392282

图1:SolarWinds数字签名程序的后门

从2020年3月到5月,多个更新文件被植入了木马,并用数字签名进行了签名,发布到SolarWinds更新网站上,一旦安装了更新文件,恶意的DLL将被合法的solarWind可执行文件SolarWind.BusinessLayerHost.exe或SolarWinds.BusinessLayerHostx64.exe(取决于系统配置)加载。

长达两周的休眠期后,该恶意软件将试图解析avsvmcloud[.]com的一个域名。该域名返回一条CNAME记录,里面包含命令和控制记录(Command and Control 简称C2)。恶意通信被设计成模拟正常的SolarWinds API通信。在获得最初的访问权限之后,黑客使用各种技术来掩饰他们的操作,同时他们也在横向移动(图2)。他们很少用非法的命令和操作,而更喜欢用合法的凭证和远程访问来访问受害者的环境。

1629185410_611b65829f38e968e9536.png?1629185410908

图2:主要战术

深入恶意软件分析

SolarWinds.Orion.Core.BusinessLayer.dll(b91ce2fa41029f6955bff20079468448)是Orion软件框架中由SolarWinds签名的插件组件,其中包含经过混淆的后门,该后门通过HTTP与第三方服务器进行通信。这个后门的主要特性如下:

执行子域域名生成算法(DGA)来改变DNS请求;

CNAME响应指向恶意软件要连接到的恶意域名;

通过代理服务器地址逃避工具对恶意软件的检测行为;

指挥和控制合法的“计划任务”;

代码通过使用伪装的变量名和绑定合法组件来隐藏身份。

传播和安装

经过系统管理员配置SolarWinds网站的更新程序来进行下载和传播,该更新程序做了合法的签名,该文件最早签署于2020年3月24日。

初始化

当被感染了木马的更新程序更新后的12到14天后,才会执行该木马程序;确切的阈值是从一个间隔中随机选择的。最初执行Initialize初始化方法,然后进行复杂的计算得到一个哈希值,此哈希与名为businesslayerhost.exe的进程匹配。从磁盘读取并检索XML字段appSettings之前,程序将创建执行一个管道来作为守护进程。恶意代码将修改appSettings的值,重新进行持久化。然后检查计算机是否加入域,然后通过一个复杂的算法生成一个用户id,然后从config中读取appSettings的ReportWatcherPostpone键来查找初始合法值。木马最后调用方法Update完成初始化工作。

DGA和阻止列表

后门使用域生成算法(DGA)确定其控制服务器,以构造和解析avsvmcloud[.]com的子域名。Update方法负责初始化生成这些随机控制子域的密码,这些子域与以下内容之一串联,以创建要解析的主机名:

appsync-api.eu-west-1[.]avsvmcloud[.]com

appsync-api.us-west-2[.]avsvmcloud[.]com

appsync-api.us-east-1[.]avsvmcloud[.]com

appsync-api.us-east-2[.]avsvmcloud[.]com

下一步获得本机的进程名称、服务名称和驱动程序的路径列表,并通过算法对每个值进行哈希处理,并对照事先定义硬编码进行检查。如果找到了正在运行的进程在列表中,则更新进程将退出,然后木马将继续尝试执行其他方式,直到执行通过为止。然后通过注册表设置禁止启动杀毒软件启动。如果在系统中找到安装的软件,则可能会影响DGA算法在生成的值方面的行为。如果有任何服务被转换为禁用,则Update方法将退出并稍后重试。如果所有的列表测试都通过了,则示例尝试解析api.solarwins.com来测试网络的连接性。

网络命令和控制(C2)

如果所有阻止列表和连接性检查均通过,则样本将通过其DGA在while循环中开始生成域。样本将延迟生成域之间的间隔时间,时间是随机的;此时间间隔可以是1到3分钟,30到120分钟或在错误条件下最长420到540分钟(9小时)范围内的任意随机值。生成域的DNS A记录根据控制恶意软件行为的IP地址的硬编码范围列表进行检查。以下范围内的记录将终止恶意软件,并更新ReportWatcherRetry 配置,防止下次进行执行:

10.0.0.0/8

172.16.0.0/12

192.168.0.0/16

224.0.0.0/3

fc00:: - fe00::

fec0:: - ffc0::

ff00:: - ff00::

20.140.0.0/15

96.31.172.0/24

131.228.12.0/22

144.86.226.0/24

一旦在CNAME DNS响应中成功检索到一个域,该样本将通过调用HttpHelper.Initialize方法产生一个新的执行线程,该线程负责通信和调度。HTTP线程通过SetTime命令控制配置的时间开始。HTTP线程将在调用之间至少延迟1分钟。恶意软件在请求数据时使用HTTP GET或HEAD请求,在命令输出数据发送到服务器时使用HTTP PUT或HTTP POST请求。当请求内容小于10000字节时使用PUT方法;否则使用POST方法。If-None-Match HTTP报头包含先前计算的userID的XOR编码表示,并附加一个长度相同的随机字节数组。

所有HTTP POST和PUT请求都包含一个JSON包,并且包含 “userId”,“sessionId”和“steps”项。“steps”字段包含具有以下键的对象列表:“Timestamp”、“Index”、“EventType”、“EventName”、“DurationMs”、“Succeeded”和“Message”。发送到服务器的恶意软件响应消息经过压缩和单字节异或编码,然后在“steps”数组中的“Message”字段中分割。每个“Message”值都是Base64单独编码的。并非“steps”数组中的所有对象都会导致恶意软件消息,“Timestamp”字段中的整数必须设置为0x2位,以确定恶意软件消息中使用了“message”字段的内容。时间戳字段中位0x2为空的Step对象包含随机数据,在组装恶意软件响应时被丢弃。

在观察到的恶意流量中,这些HTTP响应试图进行伪装,他们看起来像与.NET程序集相关的XML,但是命令数据实际上分布在许多GUID和HEX字符串中。通过使用以下正则表达式搜索HEX字符串,可以从HTTP响应主体中提取命令"\{[0-9a-f-]\}"|"[0-9a-f]"|"[0-9a-f]"。命令数据分布在多个字符串中,这些字符串伪装成GUID和HEX字符串。响应中的所有匹配子字符串都将针对非HEX字符进行过滤,合并在一起并进行HEX解码。第一个DWORD值显示消息的实际大小,紧随其后的是消息,其后是可选的其他垃圾字节。使用消息的第一个字节对提取的消息进行单字节XOR解码,然后对其进行DEFLATE解压缩。第一个字符是ASCII整数,它映射到JobEngine枚举,并带有由空格字符分隔的可选附加命令参数。

然后根据命令值将命令发送到JobExecutionEngine,如下所述。

支持的命令

序号命令运作方式
0

Idle

无操作。

1

Exit

终止当前线程。

2

SetTime

设置主事件循环执行之间的延迟时间。延迟以秒为单位,并且在[.9 * delay>,1.1 * delay>]之间随机变化。如果延迟小于300,则在下一次执行循环时将其加倍,这意味着它应稳定在[5,10]分钟左右的间隔内。还有第二个无关的延迟例程,该例程会延迟[16hrs,83hrs]之间的随机间隔。

3

CollectSystemDescription

分析本地系统,包括主机名,用户名,操作系统版本,MAC地址,IP地址,DHCP配置和域信息。

4

UploadSystemDescription

对指定的URL执行HTTP请求,解析结果并将组件与未知的哈希值进行比较。格式化报告并发送到C2服务器。

5

RunTask

使用给定的文件路径和参数启动新进程

6

GetProcessByDescription

返回流程清单。如果未提供任何参数,则仅返回PID和进程名称。如果提供了参数,它还将返回流程所有者的父PID,用户名和域。

7

KillTask

通过PID终止给定的过程。

8

GetFileSystemEntries

给定路径和可选的匹配模式,将递归列出文件和目录。

9

WriteFile

给定文件路径和Base64编码字符串,将Base64解码字符串的内容写入给定文件路径。使用追加模式进行写入。写入后延迟[1s,2s]。

10

FileExists

测试给定的文件路径是否存在。

11

DeleteFile

删除指定的文件路径。

12

GetFileHash

在给定路径上计算文件的MD5,并以十六进制字符串形式返回结果。如果提供了参数,则为文件的预期MD5哈希值,如果计算出的MD5不同,则返回错误。

13

ReadRegistryValue

从支持的配置单元之一读取任意注册表。

14

SetRegistryValue

从任一受支持的配置单元写入任意注册表。

15

DeleteRegistryValue

从支持的配置单元之一中删除任意注册表。

16

GetRegistrySubKeyAndValueNames

返回给定注册表路径下的子项和值名称的列表。

17

Reboot

系统重启

可以通过MITRE ATT&CK技术进行对应检查:

ID描述

T1012

查询注册表

T1027

混淆的文件或信息

T1057

流程发现

T1070.004

文件删除

T1071.001

网络协议

T1071.004

应用层协议:DNS

T1083

文件和目录发现

T1105

入口工具转移

T1132.001

标准编码

T1195.002

损害软件供应链

T1518

软件发现

T1518.001

安全软件发现

T1543.003

Windows服务

T1553.002

代码签名

T1568.002

域生成算法

T1569.002

服务执行

T1584

损害基础设施

行为分析和防御

TEARDROP和BEACON恶意软件

在得到的多个样本中,发现了不同的手法,在最新的一个样本中发现了以前没有遇到过的只在内存中运行的程序,我们叫TEARDROP,运行在Cobalt Strike BEACON中。TEARDROP是一个只在内存中运行的一个程序,它生成一个线程,并读“gracious_truth.jpg”文件,该文件可能是一个伪装的JPG头文件。接下来,它检查HKU\SOFTWARE\Microsoft\CTF是否存在,使用自定义循环XOR算法进行解码,然后使用类似于PE的自定义文件格式将嵌入代码加载到内存中。TEARDROP的代码是一种新型代码,在之前的代码中从来没有遇见过。

检测机会:

可以通过FireEye HX: MalwareGuard和WindowsDefender的告警信息来检查是否有次木马。

比如:file_operation_closed

file-path*: “c:\\windows\\syswow64\\netsetupsvc.dllactor-process:pid: 17900Windows Defender Exploit Guard保护日志如下:Process”\Device\HarddiskVolume2\Windows\System32\svchost.exe” (PID XXXXX) would have been blocked from loading the non-Microsoft-signed binary‘\Windows\SysWOW64\NetSetupSvc.dll’

环境伪装:

攻击者先在受害者环境中找到合法的主机名,然后在其命令中加上合法的主机名信息。这使得攻击者比较容易逃避检查。

检测机会:

攻击者会在RDP SSL证书中会泄露其主机名,这样可以在网上扫描数据中识别出来。这为防御者提供了一个检测机会。通过查找发起网络扫描的主机名中可以发现恶意IP地址(注意:IP扫描历史记录中通常显示IP在默认的(WIN-*)主机名和受害者主机名之间切换)。将网上扫描数据中标识的IP列表与远程访问日志进行关联分析可能会在环境中识别出攻击。

受害者国家/地区的IP地址

攻击者对IP地址的选择也进行了优化,以逃避检测。攻击者主要利用虚拟服务器进行通讯,这些虚拟服务器和受害者通常来自同一个国家。

检测机会:

如果合法用户和攻击者用不同的ip进行访问的时候,两个ip地址的传输速率是不一样的。如果识别出一个恶意的登录地址,可以检查这个ip地址的其他操作,有助于发现其他问题。可以做登录ip基线检查(Aviation Safety Network ASN)。

横向移动

一旦攻击者使用入侵的凭据获得对网络的访问权限,他们就会使用多个不同的凭据进行横向移动,用于横向移动的凭据始终与用于远程访问的凭据不同。

检测机会:

防御可以检查所有的登录活动,并分析同一个源用不同账号登录的情况,这种情况在业务上不多见,不过在国内这种情况大多是堡垒机。

临时文件替换和临时任务修改

攻击者使用临时文件替换技术,他们用攻击程序替换了合法程序,执行完成后还原了原始文件。他们通过更新现有的合法任务执行其工具,然后将计划任务回复到原始的配置。在使用完后他们通常会删除恶意的后门。

检测机会:

防御者可以检查SMB会话的日志,这些会话显示对合法目录的访问,并在短时间内遵循delete-create-execute-delete-create模式。此外,防御者可以监视现有的计划任务,通过检查临时任务和使用频率来分析任务的异常。还可以监视任务后产生了新的或未知的二进制文件。

解决办法

Solarwinds建议所有客户立即升级到Orion最新版本,该版本目前可通过SolarWinds门户获得。

如果你无法使用solarwind的建议,则可以采用以下缓解技术:

1.确保solarwind服务器被隔离/控制,直到进行进一步的检查和调查。这应该包括屏蔽Solarwinds服务器的所有互联网出口。

2.如果Solarwinds基础设施不是处于隔离状态,可以考虑采取以下步骤:

2.1限制与solarwind服务器终端的连接范围;2.2限制在solarwind服务器上拥有本地管理员特权的帐户的范围;2.3使用SolarWinds程序阻止来自服务器或其他终端的互联网出口;2.4更改有权访问SolarWinds服务器/基础结构的帐户的密码;2.5如果solarwind用于管理网络基础设施,可以考虑对网络设备配置进行检查,以防止意外/未经授权的修改。

三、启示

攻击是不确定的,当遇到攻击不要慌,并不是说收到攻击者时完全束手无策,攻击者进行执行恶意代码行为时,DNS解析中,进程的创建时,任务的修改时,横向移动的过程中等行为还是有可能会被发现。所以在日常工作中可以加强安全运营,检查常用攻击行为,尤其是登录行为和横向移动的行为,检查本机的进程任务等;通过持久的运营来对抗不确定性的攻击。供应链的安全问题,更加考验运营人员的能力。普通的安全事件,我们可能根据进程上下文和域名访问情况就能完全判定。但供应链类安全事件,我们需要观察更多的行为才能得出判断。当然,对于安全检测系统而言,也需要提供更丰富的关联来支持研判。

如何检测安全威胁事件?需要安全管理分析平台进行全面采集、分析及处理网络中的日志、流量,找出问题所在,看清全部真相,让网络威胁无处遁形。通过海量日志及流量分析能有效发现安全威胁事件的蛛丝马迹,防患于未然并可作为事后溯源取证分析的重要依据。分析的准确性取决于是否制定了行之有效的告警规则,告警规则与攻击思路是否吻合。攻防一体,只有了解尽可能多的攻击思路与攻击方式,才能制定出合理的防御检测思路,完善丰富的告警知识库。针对SolarWinds供应链攻击事件,我们根据FireEye对外发布的检测思路细化了如下检测规则:

可以设置企业内部资产IP白名单,通过资产扫描发现资产的主机信息、账号和组、安装软件、运行进程、端口服务、网络连接、定时任务等详情信息,通过基线比对判断发现入侵行为,当出现新接入IP时产生告警。

如果攻击者使用统一国家的IP来访问被入侵的设备,企业可以通过账户异常来检测到这个攻击。实际检测中要结合设备环境信息和账户操作习惯信息来判定,例如源IP在短时间内大量访问同一个目标IP,不符合日常行为规律,通过基线对比产生告警或者设置统一IP同时访问多个账户进行告警等。

攻击者通过获取的凭证进入网络后,他们会使用多个不同的账户凭证进行横向移动。这里可以通过检测是否有一个系统对多个系统使用多个不同账号进行批量登录尝试的行为,可以基于多维度关联分析模型产生告警。

攻击者先把被控机器上合法的文件替换成他们的恶意文件,然后执行恶意文件,之后再把合法文件替换回去。这种情况可以针对这种短时间内创建执行删除再创建的行为进行时序告警,通过时间轴上动态行为的变化追踪判定属于高风险威胁场景。

攻击者把原来合法的计划任务替换成他们要执行的文件,执行完再恢复到原始计划任务。监控这种临时的计划任务修改,通过频率分析来识别这种异常计划任务更改。

对于高权限账户的行为需要做审计,针对比如创建账户,添加任务,添加凭证等操作,要记录整个会话,谁通过什么方法,做了什么高危操作。这个操作是否异常。这样才能在相应的时候进行上下文关联。因此可以通过设置时序告警,关联分析账户的操作行为、操作时间、凭证内容等要素及时发现风险。

参考及来源:FireEye《Highly Evasive Attacker Leverages SolarWinds Supply Chain to Compromise Multiple Global Victims With SUNBURST Backdoor》。

关闭