WEBKT

服务器疑似被黑?看我如何用eBPF揪出恶意进程!

48 0 0 0

1. 确定监控目标:系统调用

2. 编写eBPF程序:监控系统调用

3. 分析监控数据:找出可疑行为

4. 案例分析:揪出挖矿程序

5. eBPF的优势与局限

6. 总结与展望

作为一名安全工程师,我每天的工作就是与各种潜在的威胁作斗争。最近,我负责的一台服务器总是时不时地出现一些异常,CPU占用率飙升,网络流量也有些不正常。直觉告诉我,这很可能是一次恶意攻击。但是,要找出幕后黑手,谈何容易?传统的安全工具往往只能提供一些表面的信息,难以深入到内核层面进行分析。这时,我想到了eBPF。

eBPF(extended Berkeley Packet Filter)是一种强大的内核技术,它允许我们在内核中安全地运行自定义的代码,而无需修改内核源码或加载内核模块。这意味着我们可以利用eBPF来监控系统调用、网络事件等,从而深入了解系统的行为,并找出可疑的进程和行为。对于安全工程师来说,eBPF简直就是一把瑞士军刀,可以用来解决各种棘手的安全问题。

那么,如何利用eBPF来揪出恶意进程呢?下面,我将分享我的实战经验。

1. 确定监控目标:系统调用

首先,我们需要确定监控的目标。考虑到恶意攻击往往会涉及到一些敏感的系统调用,例如execve(执行程序)、open(打开文件)、connect(建立网络连接)等,我决定将这些系统调用作为重点监控对象。

  • execve: 这个系统调用用于执行一个新的程序。恶意软件经常会使用它来启动恶意进程。监控execve可以帮助我们发现未经授权的程序执行。例如,我们可以记录下执行程序的路径、参数、用户ID等信息,然后分析这些信息,找出可疑的程序。
  • open: 这个系统调用用于打开文件。恶意软件可能会使用它来读取敏感信息、修改配置文件等。监控open可以帮助我们发现对敏感文件的非法访问。例如,我们可以记录下打开文件的路径、访问模式、用户ID等信息,然后分析这些信息,找出可疑的文件访问。
  • connect: 这个系统调用用于建立网络连接。恶意软件可能会使用它来与远程服务器通信,发送恶意数据或接收指令。监控connect可以帮助我们发现与可疑IP地址或端口的连接。例如,我们可以记录下连接的IP地址、端口、协议、用户ID等信息,然后分析这些信息,找出可疑的网络连接。

2. 编写eBPF程序:监控系统调用

确定了监控目标之后,接下来就需要编写eBPF程序来实现监控功能。eBPF程序通常使用C语言编写,然后使用LLVM等工具编译成字节码,加载到内核中运行。这里,我使用了bpftrace这个工具来简化eBPF程序的编写。bpftrace是一种高级的eBPF跟踪语言,它提供了一种简单易用的方式来编写eBPF程序,无需了解底层的eBPF细节。

下面是一个简单的bpftrace脚本,用于监控execve系统调用:

#!/usr/bin/bpftrace

kprobe:execve
{
  printf("%s %d %s\n", comm, pid, str(args[0]));
}

这个脚本的功能很简单:当execve系统调用发生时,它会打印出进程的名称、进程ID以及执行的程序路径。

  • #!/usr/bin/bpftrace:指定脚本的解释器为bpftrace
  • kprobe:execve:指定要监控的内核探针为execvekprobe是一种用于监控内核函数的探针。
  • printf("%s %d %s\n", comm, pid, str(args[0]));:打印进程的名称(comm)、进程ID(pid)以及执行的程序路径(str(args[0]))。

我们可以使用bpftrace命令来运行这个脚本:

sudo bpftrace execve.bt

运行之后,每当有程序被执行时,就会在终端上看到相应的输出。例如:

firefox 1234 /usr/bin/firefox

这表示进程ID为1234的firefox进程执行了/usr/bin/firefox这个程序。

当然,这个脚本只是一个简单的示例。在实际应用中,我们可能需要监控更多的系统调用,并收集更多的信息。例如,我们可以修改脚本来监控openconnect系统调用,并记录下打开的文件路径和连接的IP地址:

#!/usr/bin/bpftrace

kprobe:execve
{
  printf("EXECVE: %s %d %s\n", comm, pid, str(args[0]));
}

kprobe:open
{
  printf("OPEN: %s %d %s\n", comm, pid, str(args[0]));
}

kprobe:connect
{
  printf("CONNECT: %s %d %s:%d\n", comm, pid, ntop(args[1]->sin_addr.s_addr), args[1]->sin_port);
}
  • kprobe:open:指定要监控的内核探针为open
  • printf("OPEN: %s %d %s\n", comm, pid, str(args[0]));:打印进程的名称、进程ID以及打开的文件路径。
  • kprobe:connect:指定要监控的内核探针为connect
  • printf("CONNECT: %s %d %s:%d\n", comm, pid, ntop(args[1]->sin_addr.s_addr), args[1]->sin_port);:打印进程的名称、进程ID、连接的IP地址和端口。ntop函数用于将IP地址从网络字节序转换为主机字节序。

通过这个脚本,我们可以监控execveopenconnect这三个系统调用,并收集相应的信息。

3. 分析监控数据:找出可疑行为

有了监控数据之后,接下来就需要对这些数据进行分析,找出可疑的行为。这通常需要一些经验和技巧,以及对系统行为的深入了解。

以下是一些常见的可疑行为:

  • 执行未知程序: 如果发现有程序被执行,但是这个程序不在我们的白名单中,或者它的路径不常见,那么它就可能是恶意的。例如,如果发现有程序在/tmp目录下被执行,那么就需要特别注意,因为/tmp目录通常用于存放临时文件,很少有程序会直接在/tmp目录下执行。
  • 访问敏感文件: 如果发现有进程访问了敏感文件,例如/etc/passwd/etc/shadow等,那么就需要特别注意,因为这些文件包含了系统的用户和密码信息。恶意软件可能会尝试读取这些文件,以获取敏感信息。
  • 连接可疑IP地址: 如果发现有进程连接了可疑的IP地址,例如位于国外的IP地址,或者与恶意软件相关的IP地址,那么就需要特别注意。恶意软件可能会尝试与远程服务器通信,以下载恶意代码或发送窃取的数据。
  • 频繁的系统调用: 如果发现有进程频繁地调用某个系统调用,例如fork(创建进程)、socket(创建套接字)等,那么就需要特别注意。恶意软件可能会通过频繁的系统调用来消耗系统资源,或者进行恶意操作。

在分析监控数据时,我们可以使用一些工具来辅助分析,例如grepawksortuniq等。这些工具可以帮助我们过滤、排序、统计和分析监控数据,从而更快地找出可疑的行为。

例如,我们可以使用grep命令来过滤出所有连接到特定IP地址的连接:

sudo bpftrace connect.bt | grep "1.2.3.4"

这会显示所有连接到IP地址1.2.3.4的连接。

我们还可以使用awk命令来统计每个进程执行的execve系统调用的次数:

sudo bpftrace execve.bt | awk '{print $1, $2}' | sort | uniq -c | sort -nr

这会显示每个进程执行的execve系统调用的次数,并按照次数从高到低排序。

4. 案例分析:揪出挖矿程序

为了更好地说明如何使用eBPF来揪出恶意进程,我将分享一个真实的案例。在一次安全事件中,我发现一台服务器的CPU占用率异常高,但是使用top命令查看时,并没有发现明显的异常进程。这时,我怀疑服务器可能被植入了挖矿程序。

挖矿程序是一种利用计算机的CPU或GPU资源来挖掘加密货币的程序。它们通常会隐藏在后台运行,消耗大量的系统资源,导致服务器性能下降。由于挖矿程序通常会伪装成正常的系统进程,因此很难通过传统的安全工具来发现它们。

为了找出挖矿程序,我使用了eBPF来监控execve系统调用,并收集了执行程序的路径、参数等信息。经过分析,我发现一个名为kswapd0的进程频繁地执行/tmp/update这个程序。kswapd0是一个内核进程,它的正常行为是进行内存交换,不应该执行任何用户空间的程序。而/tmp/update这个程序的路径也很可疑,因为它位于/tmp目录下。

基于这些信息,我判断kswapd0进程很可能被恶意程序劫持,并被用来执行挖矿程序。为了进一步确认我的判断,我使用gdb工具来调试kswapd0进程,并查看了它的内存内容。结果发现,kswapd0进程的代码段已经被修改,其中包含了一些挖矿程序的代码。

确认了挖矿程序的存在之后,我立即采取措施,删除了/tmp/update程序,并清理了被感染的kswapd0进程。同时,我还加强了服务器的安全防护,以防止类似的事件再次发生。

5. eBPF的优势与局限

通过这个案例,我们可以看到eBPF在安全监控方面的强大能力。与传统的安全工具相比,eBPF具有以下优势:

  • 高性能: eBPF程序运行在内核中,可以直接访问内核数据,无需进行用户空间和内核空间的数据拷贝,因此具有很高的性能。
  • 灵活性: eBPF程序可以自定义,可以根据实际需求来监控不同的系统事件,并收集不同的信息。
  • 安全性: eBPF程序在加载到内核之前,会经过严格的验证,以确保程序的安全性,防止程序崩溃或破坏系统。

当然,eBPF也存在一些局限性:

  • 学习曲线: eBPF技术比较复杂,需要一定的学习成本。
  • 兼容性: eBPF技术依赖于内核版本,不同的内核版本可能需要不同的eBPF程序。

6. 总结与展望

eBPF是一种强大的内核技术,它可以用来解决各种安全问题。通过监控系统调用、网络事件等,我们可以深入了解系统的行为,并找出可疑的进程和行为。虽然eBPF技术比较复杂,但是随着bpftrace等高级工具的出现,eBPF程序的编写变得越来越简单。我相信,在未来,eBPF将在安全领域发挥越来越重要的作用。

希望我的经验分享能够帮助你更好地理解和使用eBPF技术。如果你有任何问题或建议,欢迎在评论区留言。

一些额外的思考:

  • eBPF不仅仅用于安全: 除了安全领域,eBPF还可以用于性能分析、网络监控、流量控制等领域。例如,可以使用eBPF来监控网络延迟、丢包率等,从而优化网络性能。可以使用eBPF来统计HTTP请求的响应时间、错误率等,从而监控Web应用的性能。
  • 持续学习和实践: eBPF技术发展迅速,不断涌现出新的工具和技术。要保持对eBPF技术的了解,需要不断学习和实践。可以关注一些eBPF相关的社区和博客,例如IO Visor、BPF Performance Tools等,了解最新的技术动态。可以尝试使用不同的eBPF工具,例如bpftracebcccilium等,掌握不同的eBPF编程方法。
  • 结合其他安全技术: eBPF可以与其他安全技术结合使用,例如IDS/IPS、SIEM等,提高安全防护能力。例如,可以将eBPF程序与IDS/IPS系统集成,当eBPF程序检测到可疑行为时,可以触发IDS/IPS系统进行相应的处理。可以将eBPF程序与SIEM系统集成,将eBPF程序收集的数据发送到SIEM系统进行分析和告警。

希望这些额外的思考能够帮助你更深入地了解eBPF技术,并将其应用到实际工作中。

最后,我想说的是,安全是一个持续的过程,需要不断学习和实践。希望我们能够一起努力,共同维护网络安全!

安全老司机 eBPF安全监控恶意进程

评论点评

打赏赞助
sponsor

感谢您的支持让我们更好的前行

分享

QRcode

https://www.webkt.com/article/9223