个 正式进入到2022年的下半年!虽然上半年犹如一场梦,但是我们还记得昨天的论文推荐,今天就接着关注CFI的一些技术动向(今天更像是一个随笔,乱七八糟地给大家推荐一系列相关的文章)。
从Linux Kernel 5.13开始,LLVM编译器提供的CFI支持已经可以比较成熟地应用起来了。具体地,在编译过程中,编译器为内核中所有的合法的函数地址建立了一个巨大的跳转表("jump tables"),然后会在执行indirect call的时候根据这个跳转表来决定是否合法。关于这个实现的具体细节,在lwn.net上有一篇文章Control-flow integrity in 5.13(https://lwn.net/Articles/856514/)进行了详细的讨论。
目前的LLVM CFI in Linux主要检查的是callee的函数类型,不允许一个特定类型的指针去访问和它类型不匹配的函数(地址),然而在Kernel中,有一些(奇奇怪怪的)代码用法往往会导致传统的CFI失效,例如下面的代码声明:
其中的参数`cmp`是一个函数指针,注意到在`list_sort`的内部实现中,有这么一个对`cmp`的使用:
这里产生了一个会导致CFI violation的问题