[译] Android 内核控制流完整性-程序员宅基地

技术标签: 程序员  android  mysql  数据库  

LDFLAGS += -plugin-opt=-inline-threshold=0
-plugin-opt=-unroll-threshold=0

注意,禁用单个优化的标志不是稳定 LLVM 接口的一部分,在将来的编译器版本中可能会更改。

在 Linux 内核中实现 CFI

LLVM 的 CFI 实现在每个间接分支之前添加一个检查,以确认目标地址指向一个拥有有效签名的函数。这可以防止一个间接分支跳转到任意代码位置,甚至限制可以调用的函数。由于 C 编译器没有对间接分支强制执行类似限制,函数类型声明不匹配导致了几个 CFI 违规,即使在我们在内核的 CFI 补丁集中解决的内核 4.94.14 中也是如此。

内核模块为 CFI 添加了另一个复杂功能,因为它们在运行时加载,并且可以独立于内核的其它部分进行编译。为了支持可加载模块,我们在内核中实现了 LLVM 的 cross-DSO CFI 支持,包括用来加速跨模块查找的 CFI 影子。在使用 cross-DSO 支持进行编译时,每个内核模块都会包含有关有效本地分支目标的信息,内核根据目标地址和模块的内存布局从正确的模块中查找信息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

图 3. 注入 arm64 内核的 cross-DSO CFI 检查示例。类型信息在 X0 中传递,目标地址在 X1 中验证。

CFI 检查会给间接分支增加一些开销,但由于更积极的优化,我们的测试表明影响很小,在很多情况下整体系统性能甚至提高了 1-2%。

为 Android 设备启用内核 CFI

arm64 中的 CFI 需要 clang 版本 >= 5.0 并且 binutils >= 2.27。内核构建系统还假定 LLVMgold.so 插件在 LD_LIBRARY_PATH 中可用。clangbinutils 预构建工具链二进制文件可在 AOSP 获得,也可使用上游二进制文件。

启用内核 CFI 需要开启以下内核配置选项:

CONFIG_LTO_CLANG=y
CONFIG_CFI_CLANG=y

在调试 CFI 违规或设备启动期间,使用 CONFIG_CFI_PERMISSIVE=y 可能会有所帮助。此选项将违规转换为警告而不是内核恐慌。

如前一节所述,我们在 Pixel 3 上启用 CFI 时遇到的最常见问题是由函数指针类型不匹配引起的良性违规。当内核遇到这种违规时,它会打印出一个运行时警告,其中包含失败时的调用堆栈,以及未通过 CFI 检查的目标调用。更改代码以使用正确的函数指针类型可以解决问题。虽然我们已经修复了 Android 内核中所有已知的间接分支类型不匹配的问题,但在设备特定的驱动程序中仍然可能发现类似的问题,例如。

CFI failure (target: [] my_target_function+0x0/0xd80):
------------[ cut here ]------------
kernel BUG at kernel/cfi.c:32!
Internal error: Oops - BUG: 0 [#1] PREEMPT SMP

调用堆栈:

[] handle_cfi_failure+0x20/0x28
[] my_buggy_function+0x0/0x10

图 4. CFI 故障引起的内核恐慌示例

另一个潜在的缺陷是地址空间冲突,但这在驱动程序代码中应该不太常见。LLVM 的 CFI 检查仅清楚内核虚拟地址和在另一个异常级别运行或间接调用物理地址的任何代码都将导致 CFI 违规。可通过使用 __nocfi 属性禁用单个函数的 CFI 来解决这些类型的故障,甚至可以使用 Makefile 中的 $(DISABLE_CFI) 编译器标志来禁用整个文件的 CFI。

static int __nocfi address_space_conflict()
{
void (fn)(void);

/
切换分支到物理地址将使 CFI 没有 __nocfi */
fn = (void *)__pa_symbol(function_name);
cpu_install_idmap();
fn();
cpu_uninstall_idmap();

}

图 5. 修复由地址空间冲突引起 CFI 故障的示例。
最后,和许多增强功能一样,CFI 也可能因内存损坏错误而被触发,否则可能导致随后的内核崩溃。这些可能更难以调试,但内存调试工具,如 KASAN 在这种情况下可以提供帮助。
结论

我们已经在 Android 内核 4.9 和 4.14 中实现了对 LLVM 的 CFI 的支持。Google 的 Pixel 3 将是第一款提供这些保护功能的 Android 设备,我们已通过 Android 通用内核向所有设备供应商提供了该功能。如果你要发布运行 Android 9 的新 arm64 设备,我们强烈建议启用内核 CFI 以帮助防止内核漏洞。
LLVM 的 CFI 保护间接分支免受攻击者的攻击,这些攻击者设法访问存储在内核中的函数指针。这使得利用内核的常用方法更加困难。我们未来的工作还涉及到 LLVM 的 影子调用堆栈来保护函数返回地址免受类似攻击,这将在即将发布的编译器版本中提供。

如果发现译文存在错误或其他需要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可获得相应奖励积分。文章开头的 本文永久链接 即为本文在 GitHub 上的 MarkDown 链接。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

题外话

不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊

这里我为大家准备了一些我工作以来以及参与过的大大小小的面试收集总结出来的一套进阶学习的视频及面试专题资料包,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~

欢迎评论区讨论。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/2401_84121485/article/details/137640292

智能推荐

CentOS7 完全卸载 php-程序员宅基地

文章浏览阅读2.2k次,点赞2次,收藏3次。在 CentOS 7 使用 yum install 简单安装 php 后,发现 php 版本 5.4 ,太低了!然后,使用 yum remove 简单卸载后,发现 php 还在,不干净!只好 rpm 慢慢卸载

ASP.Net中使用Log4Net-程序员宅基地

文章浏览阅读254次。1、在Web.Config配置Code<configSections><sectionname="log4net"type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/></configSections><log4net><!--De..._asp.net中使用log4net

js实现图片压缩【无需导包】-程序员宅基地

文章浏览阅读800次。将图片压缩后,我们会得到一个 Base64 编码的字符串,该字符串包括了压缩后的图片数据以及一些元信息,如图片格式、压缩质量等。可以通过第二个参数来设置图片的压缩质量,该参数的取值范围是0到1,其中0表示最低质量(最高压缩),1表示最高质量(最低压缩,默认值为0.92)。就是如果后续需要把压缩后的图片比如说进行上传操作,我们得得到处理后图片的Base64 编码就好办了,其实这个 Base64 编码就在眼前。这里我再提供一个vue测试代码,可以在控制台中打印出图片压缩前后的size,以及图片压缩后的回显。

第十三届蓝桥杯省赛C++ C组《全题目+题解》_蓝桥杯c组省赛-程序员宅基地

文章浏览阅读5.4k次,点赞75次,收藏141次。本篇来自第十三届蓝桥杯省赛C++ C组《全题目+题解》_蓝桥杯c组省赛

MATLAB车道线检测技术分析_车道路线识别matlab-程序员宅基地

文章浏览阅读942次,点赞22次,收藏21次。车道线检测的应用场景具有时序信息特性,为了利用时序特征通常会引入RNN模块,加上Encoder-Decoder的形式已经成为CNN特征提取的标配,所以一般的做法是对Encoder提取的Features进行进一步加工,提取连续帧带来的历史信息。VPGNet:一共20k张图片,包含白天(非雨天、雨天、大雨天)、夜晚的数据,同时包含了各种车道线类型,以及其他不同类型的车道标识(左转箭头、直行箭头、斑马线等等),如下图。TuSimple:一共72k张图片,位于高速路,天气晴朗,车道线清晰,特点是车道线以点来标注;_车道路线识别matlab

kds官方android客户端,电子厨打设置(KDS/ADS)-程序员宅基地

文章浏览阅读1.3k次。KDS应用场景KDS和ADS设置使用方案:厨房模式(KDS) 配菜模式(ADS) 呼叫广告模式(TV)电子菜牌模式KDS(kitchen display system)ADS(assign display system)准备工作安卓电子厨打客户端硬件要求:各类安卓平板及安卓一体机(安卓4.4.2以上,7寸屏以上)收银设备的IP,做KDS的设备IP,做ADS的设备IP必须在同一个网段(接同一个路由上..._kitchen display system

随便推点

墨器杯垫 文创商品设计特优_杯垫文创设计说明-程序员宅基地

文章浏览阅读737次。教育部昨举行「102年国立馆所文创商品设计比赛」颁奖典礼,台北科技大学创新设计研究所硕士生谢镇宇,为TW艺术教育馆设计「墨器」杯垫,取「默契」谐音,用5片压克力板,展现水墨画层层渲染效果,增加立体视觉感受,并在杯架后方加入LED光源,获评审肯定夺特优奖和奖金10万元。台南应用科技大学商品设计系学生高郁翔,为国立自然科学博物馆设计「恐龙化石钉书机」,他认为小朋友把钉书机钉下去的那一刻,会觉得像暴龙準_杯垫文创设计说明

C#中关于XML与对象,集合的相互转换-程序员宅基地

文章浏览阅读404次。XML与对象,集合的相互转化  今天小伙伴在群里问了一下关于XML与对象之间的相互转换,作为菜鸟的我正好趁着闲着的时间学习了一波,直接上代码了,有疑问或者有错误的地方还请大家指正,谢谢。。。。 1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System...._c# xml转集合

笔记:图以及cpp基础-程序员宅基地

文章浏览阅读1.8k次。如int fun(int i,char a)和void fun(char a,int i)就可以构成函数重载,根据函数名修饰的原理我们可以得到_funic和 _funci两个经过修饰之后得到的函数名,在进行修饰后的函数名显然是不同的。定义:同一个作用域内,相同函数名,参数不同(类型不同,个数不同)可以构成函数重载(和返回值无关)分析其二:顶点i的度即为第i行和i列的“1”的个数,如果是无向图就只要考虑每一行“1”的个数。图的邻接矩阵为一个二维数组,设为A.arcs【i】【j】(理解为两个顶点之间的关系)_cpp

CISCO路由器交换机简介及Packet+Tracer使用说明-程序员宅基地

文章浏览阅读571次。附录一 路由器和交换机产品简介 (一)路由器 思科公司的产品被网络用户广泛的使用,对它们的典型产品及其特性的了解可对网络设备有一定大致的认识,以下主要对Cisco1800系列、Cisco2600系列、Cisco 2800系列、Cisco 3700 系列模块化和固定配置的路由器产品进行简单介绍。首先以"S26C-12007XK ","CD26-BHP-12..._cisco packet tracer路由器与转发器

XHTML_xhtml 中正确标记折行-程序员宅基地

文章浏览阅读2.2k次。XHTML 是以 XML 格式编写的 HTML。什么是 XHTML? XHTML 指的是可扩展超文本标记语言 XHTML 与 HTML 4.01 几乎是相同的 XHTML 是更严格更纯净的 HTML 版本 XHTML 是以 XML 应用的方式定义的 HTML XHTML 是 2001 年 1 月发布的 W3C 推荐标准 XHTML 得到所有主流浏览器的..._xhtml 中正确标记折行

计算机图形图像处理在教学中的应用,计算机图形图像处理案例教学法运用-程序员宅基地

文章浏览阅读534次。摘要:笔者根据计算机图形图像处理课程与中职学生学习的特点,分析了目前中职学校计算图形图像处理课程教学中存在的问题,针对如何提高中职学生对计算机图形图像处理课程的学习兴趣和解决实际问题的能力,提出了案例教学法在该课程中的具体实施办法,并对其实践进行了进一步的讨论。关键词:计算机图形图像处理;案例教学;中职当今世界电子商务发展迅速,计算机平面设计这门技术在很多领域都得到广泛应用。《Photoshop图..._图像分类在教育中的应用