前情提要
在 上篇 中,我们给出了大致的漏洞原因和攻击链,在本篇中,我们将给出具体的实验思路和步骤。出于对法律风险的考虑,我们不会给出源码和具体的参数。有兴趣的读者可以根据思路和论文,自行摸索。如有意探讨更多技术细节,请联系我们:zheng.liu@osr-tech.com 。
以下实验步骤在 AArch64 上适用。
LKM 的使用
由于实践环节大量依赖 LKM (Loadable Kernel Module) 作为注入脚本。在此为不熟悉 Linux 内核编程的小伙伴简要介绍一下要点。
LKM 是能够在内核态运行的程序,由 insmod
接口在 root 权限下加载。
如何使用 LKM
-
查看该 SoC 是否有开发板,因为开发板往往会提供开源的内核源码,有内核源码也就有了内核头文件
-
查看该 SoC 是否被某个版本的 Linux 内核 mainline 所接受,尝试更换内核到该版本
-
OEM 原则上来说应该对所使用的内核开源(比如安卓手机厂商),找到该内核源码
-
逛逛爱好者论坛,寻找第三方做好的 ROM 或 kernel,再依此寻找第三方内核源码
-
内核头文件
LKM 的编译过程需要运行 LKM 平台的内核信息。主要是一些模块符号和内核头文件中函数的格式,以便 LKM 在运行时正确地找到所需的内核接口。一般而言,x86 平台 Debian 系 mainline 的头文件通过
apt install linux-headers-$(uname -r)
可以自动获得。但与 x86 平台基本就 I 家和 A 家设计厂商不同,以嵌入式设备为主的 ARM 平台,各个设计厂商对自家 SoC 设计方案五花八门,使得 Linux 内核对不同 SoC 驱动支持程度不一;或者由于设备上资源所限,OEM 对内核进行了定制化修改,使得该设备的内核头文件无法通过apt
等主流渠道获得。此时要找到内核编译 LKM 所需的内核头文件,建议以下方式:
-
加载 LKM
通过
</insmod
和rmmod
可以方便的加载和卸载 LKM。需要注意的是 LKM 的编写与平常的程序代码有所不同,内核函数与 libc 的差异自不必说,LKM 需要有特定的加载和退出函数,请自行查阅。