Android 内核控制流完整性

本文详细介绍了Android内核控制流完整性(CFI)的实现,旨在防止代码重用攻击。通过链接时优化(LTO)确保程序完整性和安全性,Google的Pixel 3成为首款在内核中实施LLVM CFI的设备。CFI通过添加额外的检查限制内核控制流,防止攻击者篡改函数指针,从而降低利用漏洞的可能性。虽然会带来一定的性能和二进制大小的影响,但CFI为Android内核提供了重要的安全增强。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android 内核控制流完整性

由 Android 安全研究工程师 Sami Tolvanen 发布

Android 的安全模型由 Linux 内核强制执行,这将诱使攻击者将其视为攻击目标。我们在已发布的 Android 版本和 Android 9 上为加强内核投入了大量精力,我们将继续这项工作,通过将关注点放在基于编译器的安全缓解措施上以防止代码重用攻击。

Google 的 Pixel 3 将是第一款在内核中实施 LLVM 前端控制流完整性(CFI)的设备,我们已经实现了 Android 内核版本 4.9 和 4.14 中对 CFI 的支持。这篇文章描述了内核 CFI 的工作原理,并为开发人员在启用该功能时可能遇到的常见问题提供了解决方案。

防止代码重用攻击

利用内核的常用方法是使用错误来覆盖存储在内存中的函数指针,例如存储了回调函数的指针,或已被推送到堆栈的返回地址。这允许攻击者执行任意内核代码来完成利用,即使他们不能注入自己的可执行代码。这种获取代码执行能力的方法在内核中特别受欢迎,因为它使用了大量的函数指针,以及使代码注入更具挑战性的现有内存保护机制。

CFI 尝试通过添加额外的检查来确认内核控制流停留在预先设计的版图中,以便缓解这类攻击。尽管这无法阻止攻击者利用一个已存在的 bug 获取写入权限,从而更改函数指针,但它会严格限制可被其有效调用的目标,这使得攻击者在实践中利用漏洞的过程变得更加困难。

[[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-arglXWaI-1629791429468)(https://user-gold-cdn.xitu.io/2018/12/17/167bad5fceff00b3?imageView2/0/w/1280/h/960/ignore-error/1)]

](https://user-gold-cdn.xitu.io/2018/12/17/167bad5fceff00b3?w=1600&h=845&f=png&s=163276)

图 1. 在 Android 设备内核中,LLVM 的 CFI 将 55% 的间接调用限制为最多 5 个可能的目标,80% 限制为最多 20 个目标。

通过链接时优化(LTO)获得完整的程序可见性

为了确定每个间接分支的所有有效调用目标,编译器需要立即查看所有内核代码。传统上,编译器一次处理单个编译单元(源代文件),并将目标文件合并到链接器。LLVM 的 CFI 要求使用 LTO,其编译器为所有 C 编译单元生成特定于 LLVM 的 bitcode,并且 LTO 感知链接器使用 LLVM 后端来组合 bitcode,并将其编译为本机代码。

[[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LC5aAY0b-1629791429471)(https://user-gold-cdn.xitu.io/2018/12/17/167bad5fcdfa7e50?imageView2/0/w/1280/h/960/ignore-error/1)]

](https://user-gold-cdn.xitu.io/2018/12/17/167bad5fcdfa7e50?w=1600&h=868&f=png&s=105589)

图 2. LTO 在内核中的工作原理的简单概述。所有 LLVM bitcode 在链接时被组合,优化并生成本机代码。

几十年来,Linux 一直使用 GNU 工具链来汇编,编译和链接内核。虽然我们继续将 GNU 汇编程序用于独立

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值