虽然在Linux系统上并不常见,但库(Linux上的共享对象文件)注入仍然是一个严重的威胁。通过对美国电话电报公司外星人实验室的Jaime Blasco的采访,我更加了解到这些攻击是多么容易实施。
在这篇文章中,我将介绍一种攻击方法和一些可以检测到它的方法。我还将提供一些链接,这些链接将提供关于攻击方法和检测工具的更多细节。首先,简单介绍一下背景。
共享库的脆弱性
DLL和.so文件都是共享库文件,允许各种进程共享代码(有时是数据)。常用的代码可以放在这些文件中的一个中,这样就可以重用它,而不是为每个需要它的进程多次重写它。这也简化了对常用代码的管理。
Linux进程经常使用许多这样的共享库。的ldd(显示共享对象依赖项)命令可以为任何程序文件显示这些。以下是一些例子:
$ ldd /bin/date linux-vdso.so。1 (0 x00007ffc5f179000) libc.so。6 = > /lib/x86_64-linux-gnu / libc.so。6 (0 x00007f02bea15000) / lib64 / ld - linux - x86 - 64.。2 (0x00007f02bec3a000) $ ldd /bin/netstat linux-vdso.so。1 (0 x00007ffcb67cd000) libselinux.so。1 = > /lib/x86_64-linux-gnu / libselinux.so。1 (0 x00007f45e5d7b000) libc.so。6 = > /lib/x86_64-linux-gnu / libc.so。6 (0 x00007f45e5b90000) libpcre.so。3 = > /lib/x86_64-linux-gnu / libpcre.so。3 (0 x00007f45e5b1c000) libdl.so。2 = > /lib/x86_64-linux-gnu / libdl.so。2 (0 x00007f45e5b16000) / lib64 / ld - linux - x86 - 64.。2 (0 x00007f45e5dec000) libpthread.so。0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f45e5af5000)
的linux-vdso.so.1文件(在某些系统上可能有不同的名称)是内核自动映射到每个进程的地址空间的文件。它的工作是查找和定位流程所需的其他共享库。
利用这种库加载机制的一种方法是使用一个名为的环境变量LD_PRELOAD。正如Jaime Blasco在他的研究中解释的那样,“LD_PRELOAD是在启动时在进程中加载共享库的最简单和最流行的方法。这个环境变量可以配置为在任何其他共享对象之前加载共享库的路径。”
为了说明这是多么容易做到的,我创建了一个极其简单的共享库,并将其分配给我的(以前不存在的)LD_PRELOAD环境变量。然后我用了ldd命令来查看这将如何影响一个常用的Linux命令。
美元出口LD_PRELOAD = / home /合成/ shownum。所以是$ ldd /bin/date linux-vdso.so。1 (0 x00007ffe005ce000) /home/shs/shownum.所以(0 x00007f1e6b65f000)<==它在那里libc.so。6 = > /lib/x86_64-linux-gnu / libc.so。6 (0 x00007f1e6b458000) / lib64 / ld - linux - x86 - 64.。2 (0 x00007f1e6b682000)
注意,除了将我的新库分配给LD_PRELOAD之外,不做任何其他事情现在都会影响我运行的任何进程。
由于LD_PRELOAD设置指定的库是第一个加载的库(在linux-vdso.so.1之后),所以这些库可以显著地更改一个进程。例如,它们可以将系统调用重定向到它们自己的资源,或者对正在运行的流程的行为方式进行意外的更改。
osquery工具可以检测库注入
的osquery工具(可下载的osquery.io是一个工具,提供了一个非常独特的方式来看待Linux系统。它基本上将操作系统表示为高性能的关系数据库。而且,正如您可能怀疑的那样,这意味着可以查询它并创建SQL表来提供关于以下内容的详细信息:
- 运行的进程
- 加载内核模块
- 打开网络连接
调用一个提供有关正在运行的进程的信息的内核表process_envs。它提供了各种进程使用的环境变量的详细信息。使用Jaime Blasco提供的相当复杂的查询,您可以使用osquery来识别使用LD_PRELOAD的进程。
请注意,此查询从process_envs表格攻击ID (T1055)是一个引用米特雷对攻击方法的解释:
选择process_envs。pid作为source_process_id, process_envs。key是environment_variable_key, process_envs。值为environment_variable_value,进程名为source_process,进程。作为file_path,处理。cmdline作为source_process_commandline,处理。cwd为current_working_directory, 'T1055'为event_attack_id, 'Process Injection'为event_attack_technique, 'Defense, Privilege Escalation'为event_attack_strategy,来自process_envs连接进程使用(pid),其中key = 'LD_PRELOAD';
注意,LD_PRELOAD环境变量有时被合法使用。例如,各种安全监视工具都可以使用它,开发人员在进行故障排除、调试或性能分析时也可以使用它。然而,它的使用仍然是相当罕见的,应该以一些怀疑的眼光来看待。
值得注意的是,osquery可以交互使用,也可以作为调度查询的守护进程(osqueryd)运行。有关更多信息,请参阅本文底部的参考资料。
您还可以通过检查用户的环境设置来定位LD_PRELOAD的使用。如果LD_PRELOAD是在用户帐户中配置的,您可以使用这样的命令来确定(在对个人身份进行分析之后):
$ env | grep PRELOAD LD_PRELOAD=/home/username/userlib.so
如果你之前没有听说过osquery,不要太在意。它现在正在成为一个更受欢迎的工具。事实上,就在上周,Linux基金会宣布他们打算用一个全新的系统来支持osquery社区osquery基金会。
总结
虽然库注入仍然是一个严重的威胁,但是了解一些优秀的工具可以帮助检测它在您的系统上的使用是很有帮助的。
额外的资源
重要参考资料和工具的链接:
- 使用osquery搜索Linux库注入AT&T的网络安全
- Linux:我的记忆力怎么样?从TrustedSec
- 为osquery下载站点
- osquery模式
- osqueryd (osquery虚拟光驱)
- 斜接的进攻框架
- 新的osquery基金会宣布