大家好!我是大聪明-PLUS

我介绍了 PT Expert Security Center 为开源动态恶意软件分析系统 DRAKVUF 开发的新插件,并演示了如何使用这些插件在PT Sandbox中检测当前的 Linux 威胁。

以下是对流行的 Linux 恶意软件监控工具、DRAKVUF 中的插件以及使用它们进行恶意软件分析的简要评测。

Linux 中的监控工具

通常,我们需要收集操作系统事件,用于构建端点检测与响应系统或在沙箱环境中分析恶意软件。我们将重点讨论后一种情况,并探讨常用 Linux 恶意软件监控工具的不足之处。

审计

Auditd是社区中最受欢迎的解决方案之一,因为它安装过程简单、语法清晰,并且能够分析系统调用和文件系统事件。然而,auditd 并非完美无缺,它也存在一些缺点:

  • 缺乏统一的消息格式。运行 auditd 的程序可以发送任何格式的消息。这不如例如仅使用 JSON 格式方便。

  • 事件并非按 ID 号顺序显示。例如,先显示 645,然后是 646,接着又是 645。这会使工作变得复杂且缓慢。

  • 规则灵活性不足。Auditd不提供对整个内核的访问权限,而只允许访问 API。当您需要编写比系统调用拦截器更复杂的代码时,这会非常不方便。

  • 系统面临被入侵的风险。恶意软件一旦获得 root 权限,就能禁用日志系统。在这种情况下,整个分析系统将失效。

inotify 和 fanotify

Linux 系统还有其他恶意软件监控工具,例如inotifyfanotify,但它们也并非完美无缺。例如,inotify_event 结构无法提供关于进程的完整信息:专家会收到事件通知,但触发该事件的程序仍然是个谜。为了解决这个问题,Linux 内核开发者建议使用 fanotify:事件包含文件和进程描述符。然而,即使是这些信息也仍然不够:触发安全事件的程序名称仍然未知。

eBPF

构建隔离环境的另一个工具是eBPF。如今,它不仅是一套数据包过滤器,更是一个功能齐全的虚拟机,允许您使用 C 语言编写任意复杂度的程序——从网络流量监控到系统性能和安全分析,无所不能。这些程序通过 BPF_MAP 进行交互,BPF_MAP 是一个用户空间和内核空间程序共享的哈希映射。

eBPF 整合了 auditd、inotify 和 fanotify 的功能。它利用 Linux 的 kprobe 机制,可以拦截任何内核函数,并向上探测任何用户空间函数。然而,即便如此,也无法消除该工具明显的缺陷:

  • 与称为辅助函数的特殊 BPF 函数紧密结合;

  • 对程序的执行时间有保证,不允许使用除常量循环之外的任何循环;

  • Linux 内核 5.2 之前的版本指令数限制为 4096,而较新的版本指令数限制最高可达 100 万。

我们开发了哪些插件?

DRAKVUF 是一款动态恶意软件分析系统。它与 Xen 虚拟机管理程序协同工作,允许在隔离环境中同时分析多台虚拟机。LibVMI(虚拟机自省)组件负责分析系统状态。它不仅允许读取虚拟内存,还允许修改虚拟内存。这种方法可以安全地执行恶意代码。

DRAKVUF模块化系统可通过各种插件进行增强,从而在分析潜在危险代码时提供更大的灵活性。如果现有插件不足以进行恶意软件分析,您可以像Positive Technologies一样,自行编写插件。

Procmon 是 DRAKVUF 的一个新插件,由 PT Expert Security Center 开发,旨在监控 Linux 系统中的新进程。为了解释其工作原理,我将回顾一下 Linux 内核中进程的创建过程以及它存储的信息。

在 Linux 系统中,要启动任何程序,都需要调用 exec 系列函数之一。需要注意的是,execve 和 execveat 系统调用并不会创建新进程,而是通过替换栈、堆和数据段来替换当前程序实例。fork 和 clone 调用则负责创建独立的进程。下图展示了 Linux 系统中创建新进程的过程:

正在运行的进程想要调用 whoami 命令,因此它调用 libc 库中的系统函数,该函数会调用 fork。execve 系统调用仅在收到新的进程 ID 后才会发生。

为了存储所有进程的信息,Linux 内核使用 task_struct 结构体——一个允许访问系统中的每个进程的链表。该结构体是对进程的抽象,允许访问进程 ID (PID)、父进程 ID (Parent PID)、子进程信息、简称以及其他有关正在运行进程的信息。

进程启动过程中涉及的另一个结构体是 linux_binrpm(Linux 二进制程序)。它允许访问文件描述符指针、解释器名称和权限提升信息。该结构体与 task_struct 的主要区别在于其用途。linux_binrpm 存储有关待启动进程的信息,而 task_struct 则描述系统上已运行的进程。

procmon 插件拦截的是 begin_new_exec 函数,而不是 execve 系统调用。这是因为 execve 中关于被启动程序的信息有限。begin_new_exec 函数体执行的是 execve 调用所期望的进程替换。因此,通过在调用开始时拦截该函数,我们可以获得父进程的信息以及 linux_binprm 结构,进而获取子进程的信息;而当函数返回时,我们就能获得新启动的程序的信息。

为了演示 procmon 插件的功能,我在 Ubuntu 20.04(Linux 内核 5.15)上启动了两个进程:uname 和 whoami。ProcessName 字段包含启动进程的名称,ImagePathName 字段包含被启动进程的名称。该插件还会从 linux_binprm 结构中提取命令行和其他字段。这些信息足以用于构建进程图等操作。

文件跟踪器

DRAKVUF 系统的另一个插件是 filetracer。它允许您记录 Linux 系统中的文件系统事件。在开发和测试过程中,我们遇到了自动检测 Linux 内核版本的问题。这是由于内核版本 5.12 发布后,函数中参数的顺序发生了变化。为了解决这个问题,我们在代码中添加了一个特殊的方法 drakvuf_get_kernel_version,用于获取当前的内核版本。

为了更好地理解插件的工作原理,我建议您查看拦截到的 `do_truncate` 方法的处理程序代码。除了执行其主要任务之外,我们用于确定内核版本的方法还允许您控制从函数接收参数的过程。

文件追踪器的逻辑比 Procmon 简单得多。结果令人印象深刻:事件包含了程序操作的必要信息,使我们能够判断它是否具有潜在恶意。使用该插件,我们可以获取读取文件的进程名称、文件名及其方法、权限以及文件在系统中的位置。

还有什么?

我只提到了我和我的团队为 DRAKVUF 开发的两个插件,但实际上还有很多。当然,所有这些插件都旨在获取有关恶意软件运行的全面信息。例如,syscalls 插件用于监控系统调用,而 rebootmon 插件用于监控重启事件。

此外,目前还有两个插件正在开发中:

  1. filextractor - 用于从样本运行期间创建或下载的虚拟机中提取文件。

  2. socketmon——用于监控程序网络活动。这款插件是流量监控的绝佳补充,它允许专家追踪特定请求是由哪个进程发起的。

我们的 DRAKVUF 插件如何分析进入 PT Sandbox 的恶意软件

为了演示插件的工作原理,我们将以它们如何检测 Linux 系统上的三种恶意软件家族为例:XorDDoS、BPFDoor 和 Mirai。恶意软件分析是一项耗时的工作,因此在演示中,我重点关注了恶意软件的关键行为特征。

XorDDoS

XorDDoS 的主要特性之一是将恶意软件固定在临时目录 tmp 中。

图中左侧是文件跟踪器捕获到的事件。它显示被分析的进程发起了一个写入系统调用,但由于我们拦截的是内核函数,vfs_write 方法会向 tmp 目录写入一个随机名称的文件。右侧是反编译器生成的伪代码,演示了对文件写入函数的调用。tmp 目录的提交已被记录,这意味着恶意软件已被检测到。

BPF门

BPFDoor 的独特之处在于它能够通过在 Linux 网络套接字上安装 BPF 过滤器来过滤网络连接。

左图显示了系统调用记录的事件。该插件允许您查看 SOL_SOCKET 和 SO_ATTACH_FILTER 套接字枚举值的进程名称、方法和字符串标识符。右图是演示该插件恶意软件检测功能的伪代码。

未来

Mirai 是一个用于传播僵尸网络的后门。它的一个工作原理是隐式执行带有 PR_SET_NAME 参数的 prctl 系统调用。prctl 调用允许更改进程名称,从而在网络管理员查看运行进程列表时隐藏进程名称。

为了检测此活动,我们需要来自两个 DRAKVUF 插件(filetracer 和 syscalls)的事件。因此,我还提取了恶意软件样本用于写入标准输出流的函数。

从系统调用插件接收到的事件揭示了系统调用名称(prctl)以及 PR_SET_NAME 参数。文件跟踪插件则揭示了 FileName 字段的值(1)和 ThreadName 字段的值(/var/Sofia)。由于所有这些事件均由系统中的同一进程发起,因此可以通过它们的 ID 进行关联,从而得出结论:该进程是由 Mirai 发起的。

结论

因此,在Linux系统上实现无代理行为恶意软件分析是一项具有挑战性但并非不可能完成的任务。困难主要在于缺乏能够完全满足我们需求的现成解决方案。这种方法赋予了我们在恶意软件分析方面更大的灵活性。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐