在2017年3月份,我们曾披露了有关漏洞CVE-2017-0510的信息,这是一个存在于Nexus 9设备中的严重漏洞,它将允许他人发动一种非常新颖的攻击,即通过恶意耳机来攻击Nexus 9设备。但有趣的是,这个漏洞的补丁并没有什么效果,所以这就导致了CVE-2017-0648的出现。为此,我们根据Google的漏洞披露政策负责任地将漏洞CVE-2017-0648的相关信息上报给了Google,而Google也在2017年6月份的Android安全公告中修复了这个漏洞。
在这篇文章中,我们首先要回顾一下漏洞CVE-2017-0510,然后分析一下之前的补丁为何无效(CVE-2017-0648),最后再给大家演示如何利用这个漏洞来发动攻击。文章结尾我们还会给大家提供漏洞CVE-2017-0648的修复方案,而这个补丁似乎终于成功地修复了这个漏洞。
回顾漏洞CVE-2017-0510
对于Google Nexus或Pixel设备来说,当TRRS连接器的MIC针脚上电压超过了一定的阈值时,手机的耳机插口将会变成一个UART调试接口。下图显示的是我们使用标准FTDI232RL电路板所组装的一个样本线缆:
Nexus 9中的这个漏洞意味着调试接口将允许外部访问FIQ调试器:
这将会产生非常有趣的后果,比如说:
1.任意进程抢占,这将导致用户数据存在泄漏的可能; 2.Stack Canaries泄漏; 3.ASLR解随机处理; 4.访问SysRq; 5.通过命令“reboot oem-42”重启进入HBOOT(HTC的Android Bootloader),将导致设备内部SoC芯片受到攻击(CVE-2017-0563 & CVE-2017-0582); 6.通过命令“reboot oem-76”恢复出厂设置。
CVE-2017-0510的尝试修复
Google曾尝试通过减少FIQ Debugger的功能来修复漏洞CVE-2017-0510,在近期的版本中,当平台完全加载之后已经无法导出注册信息或是通过oem-N参数来重启设备了(防止设备重启进入HBOOT或恢复出厂设置):
Tegra内核树中相关的commit为a075f8ab69f6。在对补丁进行了分析之后,我们发现FIQ Debugger中很多关键的核心命令现在都由sysrq_on()函数进行管理。比如说,我们先测试一下fiq_debugger.c中的fiq_debugger_fiq_exec函数:
sysrq_on函数位于drivers/tty/sysrq.c文件中,其实现方法如下:
由于sysrq_always_enabled的值为0,我们姑且可以认定这个补丁的有效性仅仅取决于sysrq_enabled的值。
针对FIQ Debugger和SysRq不受限制的临时访问(CVE-2017-0648)
不幸的是,正如我们之前的文章所解释的那样,sysrq_enabled的默认值是1:
这个参数定义在文件include/linux/sysrq.h之中:
但是在平台的启动过程中,我们可以使用一个init脚本向/proc/sys/kernel/sysrq写入0值:
kernel/sysctl.c中的代码会将proc文件/proc/sys/kernel/sysrq回滚到原始状态,并最终触发sysrq_enabled的值发生变化。
因此,尽管存在CVE-2017-0510的补丁,但在启动过程中我们仍然有一段非常短的时间(几毫秒)来执行init脚本,这样一来我们就仍然可以访问FIQ Debugger和SysRq命令了:
Transitions:
(1) sysrq_enabled = SYSRQ_DEFAULT_ENABLE = 1 (2) init: write 0 /proc/sys/kernel/sysrq 0 => sysrq_enabled = 0 (3) attacker @ limited FIQ: ‘reboot’ (4) attacker @ unrestricted FIQ: ‘reboot oem-42’ (5) attacker @ unrestricted FIQ: ‘reboot oem-76’
PoC
在下面给出的例子中,我们演示了如何绕过CVE-2017-0510的补丁并抢占任意进程以及如何进入HBOOT模式。我们假设当平台完全加载完成之后攻击便立刻开始,我们首先触发了一次设备重启(正常重启),然后获得了FIQ Debugger的临时访问权。在这个过程中,我们运行了“bt”命令,然后通过命令“reboot oem-42”重启进入了HBOOT模式:
CVE-2017-0648的修复方案
Google在公告34597d088801中正式修复了这个漏洞。SYSRQ_DEFAULT_ENABLE的值已经被设置为0了,这样就可以阻止外部对FIQ Debugger和SysRq接口不受限制的临时访问: