Google使用KCSAN在Linux内核中发现了数百种竞争条件

Linux内核

谷歌工程师 有助于Linux内核 宣布已经使用KCSAN在内核中发现了数百个“竞赛条件”。 该公司一直致力于AddressSanitizer来查找与内存损坏有关的错误,或者为代码中的未定义行为查找UndefinedBehaviorSanitizer。

这次, Google为Linux内核提供了一种新的“竞赛条件”检测器,称为KCSAN (内核并发清理程序)。 这些关键漏洞并不新鲜。 实际上 当同一进程中的两个或多个线程同时访问同一内存位置时,就会发生争用条件,其中至少有一个访问是写操作,以及线程不使用任何排他锁来控制对其对此内存的访问。

当满足这些条件时,访问顺序是不确定的,并且根据此顺序,一次运行到另一次运行可能会得出不同的结果。

竞争条件越来越多地被视为并发访问错误,并且难以复制 并在并行程序中进行诊断。 Linux内核是一个大型软件系统,其中线程密集型并行性和非确定性线程交织更容易受到竞争条件的影响。

某些竞争情况可能是良性的,但到目前为止已发现的许多情况都被认为是错误。

Linux内核提供了多种机制来避免和管理这些类型的情况 因为有诸如Thread Analyzer或KTSAN(内核线程清理工具)之类的工具可以检测Linux内核中的关键执行错误。

但是,也为Linux内核做出贡献的Google最近提出了KCSAN,一种新的内核竞赛条件检测器,类似于KTSAN。

根据Google的说法,KCSAN致力于发现内核代码中的竞争情况。 该动态严重命中检测器是内核线程消毒器(KTSAN)的替代产品。

根据Google的解释, 与KTSAN检测器不同,KCSAN基于采样监控点, 这是比赛开始前的关键比赛探测器。 KCSAN设计中的关键优先事项是缺乏误报,可伸缩性和简单性。

KCSAN使用编译工具访问内存。 KCSAN与GCC和Clang编译器兼容。 对于GCC,它需要版本7.3.0或更高版本;对于Clang,它需要版本7.0.0或更高版本。

在项目的GitHub页面上Google的Marco Elver写道,上个月在测试中使用KCSAN,他们在短短两天内就发现了300多个独特的竞争情况。 KCSAN提供了几种配置选项以自定义其行为。

“我们已经通过Syzkaller使用KCSAN了几周了,我们发现了很多错误。 他写道,最初在2019年300月,我们在短短两天内就确定了XNUMX多种独特的比赛情况。

Google表示,一般的做法是基于DataCollider, 内核模块中竞争情况的另一种动态检测器。 但是与DataCollider不同,KCSAN不使用硬件监视点,而是依靠编译工具。

监视点是使用有效的编码实现的,该编码将类型,大小和访问地址存储在一个长文件中。 使用灵活的监视点的好处是可移植性和在限制监视点可以激活的访问权限方面的更大灵活性。

以下是KCSAN为Google提出的一些关键点:

  • 高性能: KCSAN运行时最少,并且不需要每次访问都具有共享状态锁定。 结果是比KTSAN更好的性能。
  • 没有额外的内存: 根据Google的说法,不需要缓存。 当前的实现使用少量长度来编码监视点信息,这可以忽略不计
  • 内存命令: KCSAN不知道Linux内核内存模型(LKMM)控制规则。 与赛前竞赛检测器(如KTSAN)相比,这可能导致关键竞赛丢失(假阴性)
  • 精度: 根据Google的说法,KCSAN是不精确的,因为它使用了抽样策略。
  • 需要注释: 在KCSAN运行时之外需要最少的注释。 在前置事件侦听器的情况下,任何遗漏都会导致误报,这在包含自定义计时机制的内核上下文中尤其重要。
  • 检测来自设备的动态写入: 通过在观察点设置期间检查数据值,还可以检测到来自设备的动态写入。

发表您的评论

您的电子邮件地址将不会被发表。 必填字段标有 *

*

*

  1. 负责资料:AB Internet Networks 2008 SL
  2. 数据用途:控制垃圾邮件,注释管理。
  3. 合法性:您的同意
  4. 数据通讯:除非有法律义务,否则不会将数据传达给第三方。
  5. 数据存储:Occentus Networks(EU)托管的数据库
  6. 权利:您可以随时限制,恢复和删除您的信息。