当前位置: 首页 > 科技观察

回溯和如何检测Linux上的库注入

时间:2023-03-16 18:23:16 科技观察

库注入在Linux上不如在Windows上常见,但它仍然是一个问题。继续阅读以了解它们的工作原理以及如何识别它们。尽管在Linux系统上几乎不可见,但库(Linux上的共享目标文件)注入仍然是一个严重的威胁。在采访了AT&T外星人实验室的JaimeBlasco之后,我更加意识到其中一些攻击是多么容易发动。在这篇文章中,我将介绍一种攻击方法和几种检测方法。我还将提供一些显示攻击细节的链接和一些检测工具。首先,一些背景信息。共享库漏洞DLL和.so文件是允许不同进程共享代码(有时是数据)的共享库文件。公共代码可以放入一个文件中,这样它就可以被每个需要它的进程重用,而不是被多次重写。这也方便了公共代码的管理。Linux进程经常使用这些共享库。ldd命令(showsharedobjectdependencies)可以显示任何程序文件的共享库。这里有一些例子:$ldd/bin/datelinux-vdso.so.1(0x00007ffc5f179000)libc.so.6=>/lib/x86_64-linux-gnu/libc.so.6(0x00007f02bea15000)/lib64/ld-(0x00007f45e5d7b000)libc.so.6=>/lib/x86_64-linux-gnu/libc.so.6(0x00007f45e5b90000)libpcre.so.3=>/lib/x86_64-linux-gnu/libpcre.so.3(0x00007f45e5b1c000)libdl.so.2=>/lib/x86_64-linux-gnu/libdl.so.2(0x00007f45e5b16000)/lib64/ld-linux-x86-64.so.2(0x00007f45e5dec000)libpthread.so.0=>/lib/x86_64-linux-gnu/libpthread.so.0(0x00007f45e5af5000)linux-vdso.so.1(在某些系统上可能有不同的名称)是内核自动映射到每个进程地址空间的文件。它的工作是查找和定位进程所需的其他共享库。利用库加载机制的一种方法是使用LD_PRELOAD环境变量。正如JaimeBlasco在他的研究中解释的那样,“LD_PRELOAD是一种非常简单且非常流行的在进程启动时加载共享库的方法。可以在加载共享库之前将此环境变量配置为共享对象的路径。“为了展示它有多么简单,我创建了一个极其简单的共享库并将其分配给我的(以前不存在的)LD_PRELOAD环境变量。然后我使用ldd命令查看它如何影响常见的Linux命令。$exportLD_PRELOAD=/home/shs/shownum.so$ldd/bin/datelinux-vdso.so.1(0x00007ffe005ce000)/home/shs/shownum.so(0x00007f1e6b65f000)<==它在这里libc.so.6=>/lib/x86_64-linux-gnu/libc.so.6(0x00007f1e6b458000)/lib64/ld-linux-x86-64.so.2(0x00007f1e6b682000)请注意,简单地将新库分配给LD_PRELOAD会影响任何运行的程序。通过设置共享LD_PRELOAD指定的库首先加载(在linux-vdso.so.1之后)。这些库可以极大地改变进程。例如,它们可以将系统调用重定向到它们自己的资源,或者行为的意外变化。osquery工具可以检测库注入osquery工具(可从osquery.io下载)提供了一种非常独特的查看Linux系统的方式。它基本上将操作系统作为一个高性能关系数据库......而且,正如您可能猜到的那样,这意味着它可用于查询和生成提供详细信息的SQL表,例如:运行进程加载的内核模块打开网络链接一个提供进程信息内核表称为process_envs。它提供了有关各种进程使用的环境变量的详细信息。JaimeBlasco提供了一个相当复杂的查询,可以使用osquery来识别使用LD_PRELOAD的进程。请注意,此查询从process_envs表中获取数据。攻击ID(T1055)是指Mitre对攻击方法的解释。选择process_envs.pid作为source_process_id,process_envs.key作为environment_variable_key,process_envs.value作为environment_variable_value,processes.name作为source_process,processes.path作为file_path,processes.cmdline作为source_process_commandline,processes.cwd作为current_working_directory,'T1055'作为event_attack_id,'ProcessInjection'asevent_attack_technique,'DefenseEvasion,PrivilegeEscalation'asevent_attack_tacticFROMprocess_envsjoinprocessesUSING(pid)WHEREkey='LD_PRELOAD';请注意,有时合法使用LD_PRELOAD环境变量。例如,当开发人员需要进行故障排除、调试或执行性能分析时,它可能会被各种安全监控工具使用。然而,它的使用仍然很少见,应该提防。还值得注意的是,osquery可以交互使用或作为定期查询守护进程运行。更多信息请参考文末给出的参考资料。也可以通过查看用户的环境设置来定位LD_PRELOAD的使用。如果用户账户中使用了LD_PRELOAD,可以使用这个命令查看(假设你是个人登录):$env|grepPRELOADLD_PRELOAD=/home/username/userlib.so如果你之前没有听说过osquery,也别太当真。它正在成为一种更受欢迎的工具。事实上,就在上周,Linux基金会宣布创建一个新的osquery基金会来支持osquery社区。总结尽管库注入是一种严重的威胁,但了解一些优秀的工具有助于您检测它的存在。用于进一步阅读的重要参考资料和工具的链接:使用osquery追踪Linux库注入,AT&TCyber??securityLinux:我的记忆发生了什么?,TrustedSec下载osqueryosquerymodeosqueryd(osquerydaemon)Mitre的攻击框架新的osquery基础形成[编辑精选]为你在Linux上的任务创建一个自定义的系统托盘指示器深入了解LinuxKernelModules了解Linux内存管理,只有这篇文章如何设置Linux服务器上的ulimit和文件描述符限制HowtosetulimitandfiledescriptorlimitonLinuxserver