Symbiote

来源:岁月联盟 编辑:猪蛋儿 时间:2022-07-04

symbiote-linux-threat-intezer-blog-graphic-1024x475px.png

几个月前,Intezer的安全研究人员Joakim Kennedy和BlackBerry威胁研究与情报团队发现了一种新出现的且从未被检测到的 Linux恶意软件,研究人员已将其命名为 Symbiote。

Symbiote 与通常遇到的其他 Linux 恶意软件的不同,它需要感染其他正在运行的进程才能对受感染的设备发起攻击。它不是一个运行以感染设备的独立可执行文件,而是一个共享对象 (SO) 库,它使用 LD_PRELOAD (T1574.006) 加载到所有正在运行的进程中,然后通过寄生的方式潜入设备实施攻击。一旦它感染了所有正在运行的进程,它就会获得攻击目标的 rootkit 功能、获取凭证的能力和远程访问能力。

LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入程序,从而达到特定的目的。

Symbiote的首次出现

最早发现 Symbiote 是在 2021 年 11 月,它似乎是针对拉丁美洲的金融部门而编写的。一旦感染成功,它就会隐藏起来。由于恶意软件隐藏了所有文件、进程和网络构件,因此在受感染的设备上执行实时取证可能不会发现任何问题。除了 rootkit 功能外,该恶意软件还为攻击者提供了一个后门,以使用硬编码密码以设备上的任何用户身份登录,并以最高权限执行命令。

截止发稿时,研究人员还未找到足够的证据来确定 Symbiote 是否被用于高度针对性或广泛的攻击。

Symbiote 的一个特殊之处是其 Berkeley Packet Filter (BPF) 挂钩功能。 Symbiote 并不是第一个使用 BPF 的 Linux 恶意软件。例如, 方程式组织(Equation Group)开发的高级后门一直在使用 BPF 进行隐蔽通信。然而,Symbiote 利用 BPF 隐藏受感染设备上的恶意网络流量。当管理员在受感染的设备上启动任何数据包捕获工具时,BPF 字节码被注入内核,定义应该捕获哪些数据包。在这个过程中,Symbiote 首先添加它的字节码,这样它就可以过滤掉它不希望数据包捕获软件看到的网络流量。

逃避检测

Symbiote非常隐蔽,该恶意软件被设计为通过LD_PRELOAD指令由链接器加载。这允许它在任何其他共享对象之前加载。由于它首先被加载,才可以从为应用程序加载的其他库文件中“劫持导入”。 Symbiote 使用它通过挂钩 libc 和 libpcap 函数来隐藏它在设备上的存在。逃避检测过程如下图所示。

1.png

Symbiote逃避检测技术

Host 活动

Symbiote 恶意软件除了隐藏自己在设备上的存在外,还隐藏与可能与其一起部署的恶意软件相关的其他文件。在二进制文件中,有一个 RC4 加密的文件列表。调用挂钩函数时,恶意软件首先会动态加载 libc 并调用原始函数。此逻辑用于所有挂钩函数。具体示例如下图所示。

2.png

从 libc 解析 readdir 的逻辑

如果调用应用程序试图访问 /proc 下的文件或文件夹,恶意软件会删除其列表中进程名称的输出。下面列表中的进程名称是从我们发现的样本中提取的。

3.png

如果调用应用程序没有尝试访问 /proc 下的内容,则恶意软件会从文件列表中删除结果。从我们检查的所有样本中提取的文件显示在下面的列表中。一些文件名与 Symbiote 使用的文件名相匹配,而其他文件名与疑似是受感染设备上的攻击者使用的工具的文件名相匹配。该列表包括以下文件。

4.png

通过LD_PRELOAD将Symbiote加载到进程中的一个后果是,像 ldd 这样的工具(一种打印每个程序所需的共享库的实用程序)会将恶意软件列为加载的对象。为了解决这个问题,恶意软件挂钩 execve 并在环境变量 LD_TRACE_LOADED_OBJECTS 设置为 1 的情况下查找对该函数的调用。 ldd 的手册页是这样解释其中原因的:

通常情况下,ldd 调用标准动态链接器,并将 LD_TRACE_LOADED_OBJECTS 环境变量设置为 1。这会导致动态链接器检查程序的动态依赖关系,并找到加载满足这些依赖关系的对象。对于每个依赖项,ldd 显示匹配对象的位置和加载它的十六进制地址。

当恶意软件检测到这一点时,它会像 ldd 一样执行加载程序,但它会从结果中删除自己的条目。

网络活动

Symbiote 还具有隐藏受感染设备上的网络活动的功能。它使用三种不同的方法来实现这一点。第一种方法涉及挂钩 fopen 和 fopen64。如果调用应用程序尝试打开 /proc/net/tcp,恶意软件会创建一个临时文件并将第一行复制到该文件。然后,它扫描每一行,以确定是否存在特定端口。如果恶意软件在它正在扫描的一行中找到了它正在搜索的端口,它就会跳到下一行。否则,该行被写入临时文件。一旦原始文件被完全处理,恶意软件就会关闭文件,并将临时文件的文件描述符返回给调用者。本质上,这给了调用进程一个清除的结果,它排除了恶意软件想要隐藏的所有网络连接条目。

Symbiote 用来隐藏其网络活动的第二种方法是劫持任何注入的数据包过滤字节码。 Linux 内核使用扩展的 Berkeley Packet Filter (eBPF)来允许基于用户域进程提供的规则进行数据包过滤。过滤规则以内核在虚拟机 (VM) 上执行的 eBPF 字节码的形式提供。因为内核直接执行过滤,这最大限度地减少了内核和用户空间之间的上下文切换,从而提高了性能。

如果受感染设备上的应用程序尝试使用 eBPF 执行数据包过滤,Symbiote 会劫持过滤过程。首先,它挂钩了 libc 函数 setsockopt。如果使用选项 SO_ATTACH_FILTER 调用该函数,该选项用于在套接字上执行数据包过滤,它会在调用应用程序提供的 eBPF 代码之前添加自己的字节码。

代码片段 1 显示了由 其中一个Symbiote 样本注入的字节码的注释版本。如果它们符合以下条件,则字节码被释放: