XZ 工具让我变得多疑

2024 年 3 月 28 日 XZ Utils 后门事件爆出,作者开始思考如何在软件包发布前识别后门,或至少在升级后识别。一周后决定编写基本扫描器以识别内存中的钩子,这演变成一个比预期大得多的项目。

基础工作

作者过去写过很多内存加载器,此次测试用旧的内存加载器修改,目标是识别特定二进制文件所需的库,包括解析磁盘上的二进制文件、识别库及其加载的库等,与内存中的进行对比,标准加载器和此项目的差异将在下文阐述。若只想看 ELF 内存加载器代码,可参考https://github.com/infosecguerrilla/ReflectiveSOInjection

标准函数钩子

首先尝试识别基本函数钩子,原因是已有简单的 accept 后门概念验证使用了钩子,可测试无需在系统上运行实际后门。需解析实际二进制文件,包括识别节的偏移、解析重定位/偏移、获取远程进程内存并比较等,经过团队讨论得出解决方案,先解析一次重定位,将重定位存储在链表中,仅在内存范围内应用重定位。然后验证所有节,获取远程进程节的字节,使用“ptrace”并以 root 运行,若能附加则获取所有直接导入库的节,若不能则跳过。比较节字节时,若不同则打印差异,此比较方式导致全局偏移表(GOT)显示干净,一种可能的解决方法是解析远程进程中的每个二进制文件并手动加载,但作者已能识别内存中的函数钩子和掏空共享对象,决定将此扫描器视为良好并以不同方式作为第二个扫描器。此过程中未考虑“dlopen”/“dlsym”调用,若用于加载插件等可能导致难以识别恶意行为。

GOT 钩子

将扫描器限制在特定 PID,读取并解析基础可执行文件,解析导入的符号,应用重定位并仅比较 GOT,这引入很多问题,如在较新系统中难以确定远程进程使用的符号地址,目前跳过路径中包含“/snap/”的二进制文件,对于容器内的进程,若无法映射远程进程的挂载点则视为误报。此限制可能导致错过被后门利用的函数,但对于特定目标进程的后门安装,攻击者很可能劫持直接调用的函数。

是否有效

作者设置 Debian 测试系统,发现已被 XZ Utils 后门感染,通过编写通用 GOT 钩子安装函数验证扫描器有效,对于“验证所有节”扫描器,一些 Linux 进程的“wtext”节会被修改,可能导致误报,还可能因库的多个版本导致误报。可通过“objdump -x”或“nm -D”输出判断是否为真阳性或假阳性。

未来工作

此项目主要用于防御和事件响应,希望能在“关键”服务上主动进行验证,用于识别诸如“ArcaneDoor”等的入侵指标,还可扩展以识别正常进程使用的库、使用“RWX”/“R-X”内存的库以及具有这些权限的进程内部节等。

参考文献

https://blog.talosintelligence.com/arcanedoor-new-espionage-focused-campaign-found-targeting-perimeter-network-devices/
https://www.akamai.com/blog/security-research/critical-linux-backdoor-xz-utils-discovered-what-to-know

阅读 8
0 条评论