谷歌增加了控制流完整性,以增强Android内核的安全性

谷歌在Android设备的最新Linux内核中添加了一项新的安全功能,以防止其受到代码重用攻击,攻击者可以利用控制流劫持漏洞实现任意代码执行。
在代码重用攻击中,攻击者利用内存损坏漏洞(缓冲区溢出、类型混淆或整数溢出)接管存储在内存中的代码指针,并以其选择的方式重新调整现有代码的用途,从而导致恶意操作。
由于Android有很多缓解措施来防止直接代码注入内核,这种代码重用方法在黑客中尤其流行,因为它使用了大量函数指针来获得内核的代码执行。
为了防止这种攻击,谷歌现在在Android内核中添加了对LLVM控制流完整性(CFI)的支持,作为检测攻击者试图干扰或修改程序控制流的异常行为的一种手段。

基本上,控制流完整性(CFI)是一种安全策略,确保软件在运行时的执行必须遵循编译器在编译时预先确定的控制流图(CFG)的路径。
安卓安全人员软件工程师萨米·托尔瓦南(Sami Tolvanen)说:“CFI试图通过添加额外的检查来减轻这些攻击,以确认内核的控制流保持在预先计算的图表中”。
“如果一个bug提供了对函数指针的写访问权限,这并不能阻止攻击者更改函数指针,但它显著限制了有效的调用目标,这使得在实践中利用这样一个bug更加困难”。
CFI增加的额外检查将确保具有异常行为的应用或程序将自动中止。
Android内核4.9和4.14增加了控制流完整性
据谷歌称,本周早些时候发布的谷歌Pixel 3是首款集成新内核代码保护系统的Android设备。
然而,CFI支持现在已经添加到Android内核版本4.9和4.14中,谷歌建议所有Android设备供应商在运行Android 9的新arm64设备的内核中启用该功能,以进一步防止内核漏洞。
Tolvanen总结道:“LLVM的CFI保护间接分支免受攻击者的攻击,这些攻击者试图访问存储在内核内存中的函数指针”。“这使得开发内核的普通方法变得更加困难”。
谷歌还计划在即将发布的编译器版本中添加LLVM的影子调用堆栈,以保护函数返回地址免受类似攻击。