Ftrace训练营火热报名中:Ftrace训练营:站在设计者的角度来理解ftrace(限50人)。训练营第一期报名已圆满成功,好评如潮。第二期报名正在火爆进行中(咨询小月微信:linuxer2016)。
ARM安全架构训练营火热报名中:阅码场训练营:ARM安全架构之Trustzone-TEE实战。报名咨询客服(小月微信:linuxer2016)。
ARM架构与调优调试训练营火热报名中:阅码场训练营:ARM架构与调试调优。报名咨询客服(小月微信:linuxer2016)。
译者介绍:
许庆伟,Linux Kernel Security Researcher & Performance Developer
Tracee是一个用于Linux的运行时安全性和取证的开源项目,用于解决常见的Linux安全性问题。通过利用Linux扩展的Berkeley Packet Filter (eBPF)的技术优势,在内核运行时跟踪系统和应用程序,以便获取相应的数据信息。Tracee分析收集的事件可以用来检测可疑的行为模式,在本文中,我将分享从使用eBPF和Linux安全模块(LSM)钩子的角度,来分析在解决Linux漏洞(如TOCTOU类型)中学到的经验教训。
在正在运行的应用程序中,通常是通过系统调用与操作系统进行交互。出于这个原因,安全从业者会使用系统调用来分析运行中的应用程序的行为。重点在于选择收集系统调用的方法,因为获取到的参数值和操作系统实际使用的参数值之间可能存在差距。
eBPF允许在无需更改内核源代码或加载内核模的情况下,在Linux内核中运行沙盒程序。通过使用kprobes附加到Linux Security Module (LSM)挂钩上,我们可以收集内核实际使用的参数值。下面是具体使用LSM钩子需要克服的一些问题:
准确理解相对路径
在Linux中,当从用户程序中读取信息时,path参数可以包含一个相对路径。
例如,当调用一个程序时,Tracee可以使用以下参数获取一个系统调用:
·open("../../directory/file", O_RDONLY)
·open("./test/../../directory/file", O_RDONLY)
这些系统调用中的路径可能指向相同的位置,但问题来了,根据给定的参数,很难精确定位绝对且始终唯一的规范路径。在构建安全策略时,规范路径的重要性变得更加明显,因为相对路径的意图和效果可能太过模糊。
找出链接文件
例如,用户程序给出的某个文件的参数值可能会包含指向其他文件的链接。在Linux中,我们可以创建到一个文件的符号链接,其方式是一个文件充当另一个文件或目录的引用。操作系统使用符号链接到达被链接的文件,并执行给定的命令。请看下面的例子,创建了一个名为python的文件,并将其链接到一个恶意的二进制文件my_malware:
当运行python时,我们可以看到Tracee跟踪了两个事件。其一是带有参数值的系统调用 ./python。但实际上,python是象征性地链接到~/bin/my_malware,第二个就是被Tracee捕获的security_bprm_check事件返回了实际执行的文件的路径名。
TOCTOU分析
当试图获取用户程序的参数值时,如果只分析系统调用参数,结果可能会受到条件竞争的影响而错过关键细节。这是因为在获取信息后,用户程序可以基于另一个并发线程,来进行更改系统调用参数。
例如,当调用一个程序时,Tracee可以使用以下参数获取一个系统调用:
execve("/bin/ls", NULL, 0)
在进程中某一线程和内核调用执行Syscall之间会存在同一时间点。在这个时间点开始阶段,通过使用指向进程地址空间中内存位置的指针,pathname参数被传递给内核。在这个期间,进程的另一个线程可以快速更改路径名,最后内核来更新路径名。
继续我们的例子,另一个线程可以将第一个参数从/bin/ls更改为/bin/malicious,后者将由内核执行,而前者将由Tracee记录。这个场景被称为TOCTOU竞态。攻击者可以利用它来影响检查和真正使用之间的记录值,这样会导致收集到的数据不准确,并误导安全研究人员或自动检测工具。
基于上面的原因,决定在Tracee中连同Syscall数据一起使用LSM钩子来进行追踪。像security_file_open这样的事件,包含内核实际使用的路径名,并与上报的常规Syscall事件交叉引用。
简化分析过程
我们都知道在Linux中,Everything is a file这句著名的口号(https://en.wikipedia.org/wiki/Everything_is_a_file),是的,所有东西都是文件,需要使用文件描述符才能与之交互。当打开一个文件时(例如使用open),你会收到一个文件描述符。使用这些系统调用openat, unlinkat, execveat, accept, connect, bind, listen等等来与打开的文件进行交互。由于这个原因,如果我们想要分析在一个文件上执行的操作,那就必须跟踪其打开的文件描述符,而Socket允许在不同的程序之间传递打开的文件描述符,这样就会使分析更加困难。
对于使用Tracee的LSM钩子事件,跟踪文件描述符变得无关重要,因为LSM事件已经包含了相关的数据,比如完整的路径名。这使得在分析问题时可以避免上述的影响,更加简化分析流程。
结论
Tracee是一个易于使用的Linux运行时安全和取证工具,采用了目前最为火热功能更为强大的eBPF技术,可以让我们更好地理解程序的运行时行为,并打破对类似安全软件构成困难和挑战的桎梏,为安全分析人员提供进一步深入分析的方案。
相关演示视频在如下地址,关于Tracee的详细信息可以查看项目Github主页和其他分析文章:
1.https://github.com/aquasecurity/tracee
2.https://blog.aquasec.com/ebpf-container-tracing-malware-detection
3.https://www.youtube.com/watch?v=-SRAlokoWDc
作者上一篇文章:减少嵌入式软件调试时间的三个技巧
精华文章:【精华】Linux阅码场原创精华文章汇总
阅码场付费会员专业交流群
会员招募:各专业群会员费为88元/季度,权益包含群内提问,线下活动8折,全年不定期群技术分享(普通用户直播免费,分享后每次点播价为19元/次),有意加入请私信客服小月(小月微信号:linuxer2016)
专业群介绍:
甄建勇-性能优化与体系结构
本群定位Perf、cache和CPU架构技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师甄建勇主持。
李春良-Xenomai与实时优化
本群定位Xenomai与实时优化技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师李春良和彭伟林共同主持。
周贺贺-Tee和ARM架构
本群定位Tee和ARM架构技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师周贺贺主持。
谢欢-Linux tracers
本群定位Linux tracers技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师谢欢主持。
✦
✦