Linux系统全盘加密启动攻击分析
Evil Maid攻击:针对LUKS全盘加密Linux系统的initrd注入技术分析 目前市面上缺乏现成的工具能够直接发起此类攻击,因此研究人员自行开发了一款名为EvilAbigail的攻击工具。Evil maid攻击理论上可适用于任何操作系统,但本次研究的目标是采用LUKS全盘加密的Linux系统
Evil Maid攻击:针对LUKS全盘加密Linux系统的initrd注入技术分析
目前市面上缺乏现成的工具能够直接发起此类攻击,因此研究人员自行开发了一款名为EvilAbigail的攻击工具。Evil maid攻击理论上可适用于任何操作系统,但本次研究的目标是采用LUKS全盘加密的Linux系统。
当Linux系统启用全盘加密后,会保留一个未加密的小分区——该分区专门用于解密并引导加密磁盘。它通常挂载在/boot目录下,包含内核和初始RAM磁盘(initrd)。虽然直接攻击内核或bootloader也是可行的,但研究人员最终选择了针对initrd进行攻击。
initrd本质上是一个临时文件系统,在系统启动阶段由Linux内核调用,主要负责在真正的root文件系统挂载之前完成准备工作。它仅包含解密和挂载root文件系统所需的最小目录和可执行程序。当initrd完成使命后,它会执行pivot_root,卸载自身的临时根文件系统,并挂载真正的根文件系统。
通常情况下,initrd是通过gzip压缩的cpio镜像。本次测试使用的Debian系操作系统正是如此,但RedHat系(如Fedora、RHEL、CentOS)现已改用dracut,包含的是未压缩的cpio镜像。基于Debian的initrd采用ash shell脚本执行启动,而dracut则依赖systemd及其关联的配置方式。
为了实施攻击,研究人员选用了一种基于LD_PRELOAD的bootkit——当然,注入恶意内核或可执行文件也是可行的选择。使用LD_PRELOAD的主要目标,是对刚刚解密完成的root文件系统中的第一个可执行文件注入一个共享对象。该文件通常是/sbin/init,其PID一般为1。最简单的攻击方式是修改init脚本,导出这个环境变量,这样在执行pivot_root时环境变量已经设置完毕。由于文件系统切换时,还需在合适时机(解密之后)将共享对象复制到新系统中。只需在initrd的init脚本中插入两行代码,置于文件系统切换之前:
cp /hack.so /${rootmnt}/hack.so
export LD_PRELOAD=/hack.so
之所以能成功,是因为真正的root文件系统是在临时root文件系统下解密挂载的,该过程发生在pivot之前,而rootmnt变量正好填充了挂载点位置。不过,在此之前需要将目标文件系统重新挂载为读写模式(默认是只读的)。在此示例中,研究人员修改了init脚本中解析内核命令行的部分,使无论传入什么参数,root文件系统都会以读写方式挂载。另一种方法是在注入的命令中添加mount -o remount,rw /${rootmnt}。
但基于dracut的initrd中不存在这样的注入点,因为init的可执行文件是二进制文件而非shell脚本。这带来了三个问题,只有全部解决才能成功注入到pid 1进程中。
三个关键问题及解决方案
第一个问题:如何将二进制文件复制到解密的root文件系统中。这反而是最容易解决的。可以在负责pivot文件系统的systemd服务文件中添加两个ExecPre指令——基本相当于前面脚本插入的方式。第一个命令以读写方式重新挂载root文件系统,第二个命令执行复制操作。
第二个问题:关于LD_PRELOAD的注入。由于无法直接通过shell脚本修改环境变量传递给进程(进程由内核直接调用),加载共享对象变得棘手。最简单的办法是:先将init二进制文件移动到别的位置,在原位置放置自己的shell脚本,最后执行原来的二进制文件。只需两行代码:第一行导出LD_PRELOAD,第二行执行原来的systemd二进制文件。注意,这样注入的是initrd中的pid 1进程,而非最终root文件系统的pid 1。
第三个问题:在调用switch-root命令之前,systemd会使用clearenv()函数清除所有环境变量。该函数属于标准库的一部分,因此可以重写它,让被注入的进程调用自定义的版本。自定义的clearenv()会先清除所有环境变量,然后将LD_PRELOAD变量重新注入到环境中。由于clearenv()仅在进程启动时被调用一次,此修改不会带来任何副作用。
解决这三个问题后,共享对象就会被复制到加密的root文件系统中,LD_PRELOAD也被成功注入到目标文件系统的pid 1进程中。接下来即可获取用于解密的用户密码。
对于Debian系的initrd,可执行文件会要求用户输入密码,然后解密并挂载root文件系统。研究人员可以将脚本注入到pipeline进程中,从而截获密码。
至于systemd,它通过Unix domain sockets使用更复杂的进程间通信。研究人员选择攻击文件系统的挂载过程,而不是直接攻击该进程。这里再次利用库函数——它在动态加载库中,从systemd里调用,因此可以hook这个函数。解密硬盘的函数名为crypt_activate_by_passphrase,它将密码作为char数组传入。通过hook该函数,就能获取密码。需要包裹原函数,使用dlsym打开真正的函数并调用它,但在调用之前先将密码保存下来。
为了“保存”密码,研究人员简单地将密码追加到之后要复制到root文件系统的共享对象末尾。之所以选择这种方法,是因为已经确认该文件存在且会被复制过去,同时能减少接触磁盘文件的数量。获取密码时,只需读取自己文件末尾(通过LD_PRELOAD变量定位),然后将其设置为反弹shell中PASSWORD环境变量的值。这样,以meterpreter为例,通过getenv PASSWORD命令就能拿到用于解密磁盘的密码。由于所有目标主机都默认安装了Python,因此使用了Python meterpreter反弹shell。
防护解决方案
应对此类攻击有不少方法,但需要明确一点:如果攻击者能够物理接触计算机,并且有足够时间重刷BIOS/UEFI,那么基本上无法完全防御。
第一种方法:将bootloader、内核和initrd存放在外置U盘上,从U盘启动以替代/boot分区。这对用户来说较为麻烦——离开笔记本时需记得拔掉U盘,如果未卸载还需安全卸载/boot分区。更新时也需插上U盘才能更新initrd或内核。
第二种方案:彻底关闭从外置媒体启动系统的功能。这样能阻止自动化攻击,但在某些情况下(例如包含shell的Debian initrd),仍然可以从initrd手动挂载和修改initrd。这可以通过自动键盘式设备完成,从而绕过无法从外置媒体启动的限制。
另外,还可以开启BIOS启动密码——没有密码的人无法启动计算机。
不过,如果攻击者有足够时间将硬盘拆下,用他们自己的笔记本启动硬盘,后两种方案便不再有效。
最后,最安全的方案是将SecureBoot扩展到initrd。SecureBoot可以验证bootloader和内核,如果能够验证经过签名的initrd,要在不留下痕迹的情况下修改/boot分区将非常困难。但如果攻击者能够刷写BIOS/UEFI关闭SecureBoot,这套方案也就失效了。
总结一句:防止这类攻击最有效的方法,就是确保你的设备始终处于可控范围内。PoC攻击能在2分钟内攻陷所有目标主机,而在现实世界中,攻击者可以制作针对特定目标的payload,几秒内即可完成攻击。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
零基础Python网络安全学习指南,包住宿实战培训
先抛出几个核心判断:网络安全人才缺口确实已经超过70万。这个数字不算夸张,各大招聘网站上安全岗位的薪资涨幅和需求增长都是实实在在的。但实话实说,行业真正缺的是能上手干活的人,不是只懂几个理论概念的新手。因此,一套扎实且成体系的训练方案,对于零基础转行或进阶提升就显得格外关键。 从零基础到能够独立应对
网络安全定义与核心概念详解
谈到网络安全,不同组织与标准体系对其定义虽有差异,但核心目标高度统一:保护信息与系统不受威胁侵害。以下梳理几种主流定义—— 什么是网络安全? 国际标准化组织(ISO)在ISO-74982文献中将安全定义为:最大程度地降低数据和资源遭受攻击的可能性。该定义虽简短,却精准点出安全的本质——即风险控制。
IIS 7.0网站漏洞利用与修复方法指南
先来聊聊当前网络安全领域比较流行的一种实战技巧——以PHP环境为例,详细讲解图片马合并与解析漏洞利用的具体操作步骤。整个过程并不复杂,但细节往往决定成败,大家跟着流程逐步操作即可。 合并一张PHP一句话图片马 首先,我们需要将一句话木马脚本与一张正常图片合并,生成一个看似无害的图片文件。合并方式主要
织梦管理系统后台查找功能教程
通过SQL注入漏洞获取织梦CMS(DedeCMS)管理员密码后,满怀期待地准备进入后台,却发现怎么也找不到登录入口——这种情况其实相当常见。别着急,这里有一个实用的技巧值得尝试。 直接在网站地址后面添加以下路径: include dialog select_media php?f=form1 mur
微软IE浏览器BrowseDialog类(ccrpbds6.dll)拒绝服务安全漏洞深度分析
BrowseDialog Class (ccrpbds6 dll) 导致 Internet Explorer 拒绝服务漏洞分析 该漏洞的PoC(概念验证代码)实现极为直接——触发浏览器崩溃的条件简单得令人意外。测试环境采用Windows XP Professional SP2(已安装全部补丁)并运行
- 热门数据榜
相关攻略
2026-07-25 22:28
2026-07-25 22:28
2026-07-25 22:28
2026-07-25 22:28
2026-07-25 22:10
2026-07-25 22:10
2026-07-25 22:10
2026-07-25 22:10
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

