在linux上只需要按住Enter键约70秒 或者 重试93次空密码,黑客拿到了具有根权限的Shell,从而获得了对加密Linux机器的完全远程控制。这个安全缺陷已被确认影响Debian、Ubuntu、Fedora和其他许多Linux版本。Arch Linux和Solus用户不受此安全问题影响。
这个安全问题源于Cryptsetup工具实现上的一个漏洞(CVE-2016-4484)。Cryptsetup工具通过Linux Unified Key Setup (LUKS)来加密硬盘;而在基于Linux的操作系统上,LUKS是标准的硬盘加密实现。据说这个东西,2004年就有了,你可以想象这个漏洞影响范围有多大。
LUKS和Cryptsetup是什么
LUKS(Linux Unified Key Setup)为Linux硬盘加密提供了一种标准,它不仅能通用于不同的Linux发行版本,还支持多用户/口令。因为它的加密密钥独立于口令,所以如果口令失密,我们可以迅速改变口令而无需重新加密真个硬盘。通过提供一个标准的磁盘上的格式,它不仅方便之间分布的兼容性,而且还提供了多个用户密码的安全管理。必须首先对加密的卷进行解密,才能挂载其中的文件系统。
cryptsetup就是加密工具,默认已经安装在系统中。使用cryptsetup对分区进行了加密后,这个分区就不再允许直接挂载。如果要使用这个分区,必须对这个分区做一个映射,映射到/dev/mapper这个目录里去,我们只能挂载这个映射才能使用。然而做映射的时候是需要输入解密密码的。
问题就出在这个挂载过程中,对于密码重试居然没有限制 (这是哪个程序员干的事情,拖出去打死……)
93次空密码重试就可以获得root权限
这个漏洞实际存在于系统启动时Cyrpsetup工具在解密过程中对错误密码的处理上,使得用户可以多次尝试密码操作。即使用完了所有的93次密码尝试机会,用户仍会掉进一个具有根权限的Shell(Ubuntu中为Busybox)。也就是说,如果你输入93次空白密码,或者按住"Enter"键约70秒,你就能访问根initramfs(初始RAM文件系统)Shell。
一旦获得目标Linux机器上的根Shell,你就能复制、修改或者破坏硬盘,或者通过网络偷出数据。
漏洞也可被远程利用
由西班牙安全研究人员Hector Marco和Ismael Ripoll发现的这个漏洞影响几乎所有的Linux发行版本,包括Debian、Ubuntu、Fedora、Red Hat Enterprise Linux(RHEL)、以及SUSE Linux Enterprise Server (SLES)。这可能置数以百万计的用户于风险之中。
在今年奥地利维也纳的DeepSec大会上发布的安全公告中,这两位研究人员这样解释这个漏洞:
“这个漏洞允许攻击者获取受影响系统的根initramfs shell。这个漏洞不受具体系统或配置的限制,因而非常切实可靠。攻击者可以复制、修改或者破坏硬盘,并设置网络来偷出数据。在图书馆、自动柜员机、机场设备、实验室等环境下,这个漏洞尤其严重。在这些环境下,整个启动过程都受到(BIOS和GRUB中的密码)保护,而我们只能使用键盘和鼠标。”
此时你可能会认为,只有在能物理访问目标系统时,才可能利用这个漏洞。但是,这个漏洞也可能被远程利用。如果使用了利用Linux的云端服务,你就可以远程利用这个漏洞,而不需要“物理访问”。
漏洞影响大多数Linux版本 提权、泄露、DoS一个都不少
然而,重要的是要意识到,虽然这个shell允许攻击者进行一系列的操作,但攻击者并不能利用这个漏洞来访问加密盘中的数据。根据Marco的描述,攻击者可以进行下列操作:
权限提升 :因为引导区一般都不会被加密,
- 它可被用来存储SetUID位被使能的可执行文件。这个文件随后可被本地用户利用来提升权限。
- 如果引导区未被防护,攻击者随后就可能替换掉内核和initrd镜像。
信息泄露 :攻击者可能访问所有的磁盘。虽然系统分区是被加密的,但它可能会被复制到外部设备,并随后被暴力破解。显然,在外部设备上访问解密后的信息是有可能的。
拒绝服务 (DOS):攻击者有能力删除所有磁盘上的信息。
如何修复这个漏洞
幸运的是,这个漏洞非常容易被修复。
首先,在LUKS密码提示窗口下按住Enter键约70秒,直到出现一个shell,以查看你的系统是否存在这个漏洞。如果存在,你需要向你的Linux版本提供商确认是否有可用的补丁。
如果没有可用的补丁,修改cryptroot文件从而在密码尝试次数达到上限时终止启动程序,也可以修复这个漏洞。为此,你可以将下列命令行添加到启动配置中:
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="/GRUB_CMDLINE_LINUX_DEFAULT="panic=5 /' /etc/default/grub grub-install
由于已经有可用的补丁,因此请确保你始终使用最新的补丁包版本和最新的操作系统。