双键入侵
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
|
|
不幸的是,我无法为基于RHEL的系统上的dracut提供修复。Dracut是一个基于事件的工具,用于生成启动Linux系统时使用的初始ram磁盘,我不太熟悉其代码库。然而,修复可能很简单,但在查看代码后,我没有很快注意到如何修复它。
同时,请在此处查看官方补丁的进展:
- Debian: https://packages.qa.debian.org/c/cryptsetup.html
- Ubuntu: https://people.canonical.com/~ubuntu-security/cve/2016/CVE-2016-4484.html
- RHEL: https://access.redhat.com/security/cve/cve-2016-4484
- Dracut: http://git.kernel.org/cgit/boot/dracut/dracut.git/
是时候开始工作了!
谁关心需要物理访问的漏洞?
虽然利用此漏洞需要物理访问,但在虚拟环境中仍然致命。想象一下攻击者正在跟踪您的hypervisor。利用此漏洞,攻击者有一种简单的方法来提升其在加密虚拟机上的权限。
攻击者等待虚拟机关闭,跳入root shell,挂载未加密的启动分区,加载一些程序到其上,设置程序的sticky bit,关闭虚拟机,并等待有人重新登录。现在,攻击者只需运行他们加载到启动分区中的程序即可获得root访问权限。
用于执行此攻击的命令如下所示:
|
|
注意:这是在Ubuntu Server 16.04上测试的。Fedora 24似乎不易受此攻击,因为默认情况下dracut shell中不包含chmod。然而,dracut默认包含vi,应该容易受到sticky bit攻击。
我们如何防止这些类型的漏洞?
与此漏洞相关的代码都是开源的。只是没有足够的关键读者审查代码。作为这些非常受欢迎的项目的用户,我们有责任偶尔参与代码审查过程。不仅是这些项目的贡献者失败了。我们也失败了。下次您使用对业务或日常习惯至关重要的技术时,检查其源代码是否可用。浏览一下。看看您是否能捕捉到创建它时的一些巧思。如果您不懂代码,请查看项目的wiki和错误跟踪器。我们常常对软件视而不见,当像这样的漏洞出现时,我们才会大声疾呼。
在官方披露中了解更多关于CVE-2016-4484的信息。