翻译:https://decoded.avast.io/davidalvarez/new-diamorphine-rootkit-variant-seen-undetected-in-the-wild/
恶意软件中的代码重用现象非常普遍,尤其是对于那些开发难度大或难以用完全不同的代码实现的恶意软件组件。通过监控源代码和编译后的代码,我们能够有效地发现新型恶意软件并追踪野外环境中现存恶意软件的演变情况。
Diamorphine是一个广为人知的Linux内核rootkit,它支持多个版本的Linux内核(2.6.x、3.x、4.x、5.x和6.x)和多种处理器架构(x86、x86_64和ARM64)。简而言之,一旦加载,该模块就会变得隐蔽,隐藏所有攻击者在编译时指定的特殊前缀开头的文件和文件夹。此后,攻击者可以通过发送信号与Diamorphine交互,执行如下操作:隐藏或显示任意进程,隐藏或显示内核模块,并提升权限至root用户。
在 2024 年 3 月初,我们发现了一种新的 Diamorphine 变种,在野外未被检测到。在获得样本后,我检查了.modinfo 部分,并注意到它伪装成合法的 x_tables Netfilter 模块,并针对特定的内核版本(内核 5.19.17)进行了编译。
![]() |
---|
图1:.modinfo信息 |
通过Radare2分析工具列出的函数,我们可以发现所分析的恶意软件样本中包含了Diamorphine,例如module_hide、hacked_kill、get_syscall_table_bf、find_task、is_invisible和module_show等函数。此外,模块中还包含了其他函数(如a、b、c、d、e、f和setup),表明该样本已经被武器化,具有更多的有效载荷。
![]() |
---|
图2:Radare2分析工具列出的函数信息 |
由于Diamorphine是一个广为人知的开源Linux内核rootkit,本博客文章将重点介绍其新增的功能:
要部署这个Diamorphine的变种,我们需要一个内核版本为5.19.17的Linux操作系统。通过使用Radare2工具,我们可以找到合适的Linux发行版。根据编译器信息,Ubuntu 22.04版本是部署这个rootkit的理想选择。
![]() |
---|
图3:Ubuntu 22.04 |
实际上,我在网上发现有人使用Ubuntu Jammy版本来运行这个程序,而且这种特定Diamorphine恶意软件源代码中的符号版本,部分与我们在VirusTotal上发现的新Diamorphine变体中的符号版本相匹配(例如,module_layout符号与版本不符,但unregister_kprobe符号与之匹配)。
![]() |
---|
图4:变体中的符号版本 |
因此,当Ubuntu Jammy(即Ubuntu 22.04 LTS版本)发行版具有合适版本的内核符号时,就可以将内核rootkit插入其中(具体符号版本信息可参见内核的Module.symvers文件,这是Diamorphine变种将要插入的位置)。
模仿Netfilter的X_Tables模块是一个巧妙的策略,因为这样做的话,注册Netfilter钩子不会引发警觉,毕竟与Netfilter的交互是正常行为。
在内核模块的初始化函数init_module中,rootkit创建了一个名为xx_tables的设备,用于在用户空间和内核模式的rootkit之间传递信息。
![]() |
---|
图5:xx_tables设备 |
秉承Linux系统中“一切皆文件”的设计哲学,字符设备在初始化时会设置一个文件操作结构,该结构定义了xx_tables设备所支持的操作。在文件操作结构中定义的“g”函数,专门用来处理用户空间向设备写入数据的请求。
![]() |
---|
图6 |
该函数通过xx_tables设备,从用户程序所在的内存区域读取命令。它使用Linux内核提供的_copy_from_user
函数,将数据安全地从用户空间复制到内核空间。
![]() |
---|
图7 |
为了确保安全,rootkit 会验证从用户程序运行的内存区域发送的数据是否为空。这个数据结构包括两个部分:数据的长度和指向数据位置的指针。
![]() |
---|
图8 |
最后,如果从用户模式空间发送的输入是字符串“exit”,则调用 rootkit 的 exit_
函数,该函数将恢复系统、释放资源并从内存中卸载内核模块。
![]() |
---|
图9 |
exit_
函数退出函数负责正确地恢复系统并从内核内存中卸载rootkit。它执行以下操作:
新的Diamorphine rootkit实现了支持IPv4和IPv6的“魔术数据包”功能。协议族被设置为NFPROTO_INET,这意味着它适用于IPv4和IPv6网络协议。
![]() |
---|
图10 |
netfilter_hook_function 依赖于对 a、b、c、d、e 和 f 函数的嵌套调用,用于处理魔术数据包。魔术数据包的要求包括使用 XOR 密钥 0x64 加密值 "whitehat
" 和 "2023_mn
"。
![]() |
---|
图11 |
如果数据包符合要求,则从中提取任意命令并执行到受感染的计算机中。
![]() |
---|
图12 |
Diamorphine rootkit的原始系统调用拦截实现是这样的:
![]() |
---|
图13 |
即便是在新的Diamorphine变种中代码完全相同,也需要指出它被特别配置来隐藏所有包含特定字符串的文件和文件夹。
![]() |
---|
图14 |
我们经常发现新的Linux内核rootkit实现了未被检测到的魔术数据包(例如Syslogk、AntiUnhide、Chicken等)
![]() |
---|
图15 |
在这个新的Diamorphine野外版本中,威胁行为者增加了一项设备功能,允许从内存中卸载rootkit内核模块,并且增加了魔术数据包功能,使得在受感染系统中执行任意命令成为可能。
067194bb1a70e9a3d18a6e4252e9a9c881ace13a6a3b741e9f0ec299451c2090
Diamorphine Linux内核rootkit IoC、Yara 搜寻规则和 VirusTotal 查询位于我们的 IoC 存储库中。
https://github.com/avast/ioc/tree/master/Diamorphine
11 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!