【11月3讲座回顾】 Building a Secure Open-Source Operating-System Kernel

前言:

11.3日上午,南方科技大学可信系统安全实验室荣幸邀请到明尼苏达大学卢康杰教授带来题为《Building a Secure Open-Source Operating System Kernel>>的讲座,该讲座线上线下同步开展,吸引了众多相关方向老师同学参加。

本次讲座主要内容:

首先,卢教授通过形象的描述阐述了操作系统内核的重要性,并以linux kernel为例说明当前内核的复杂性。然而,由于不安全的语言,模块之间关系过于复杂,编译器优化,供应链投毒等等会导致内核存在很多漏洞,引入很多安全问题。

不像普通的应用程序,如何准确的定位内核漏洞,有以下一些挑战。首先,内核代码极其复杂,拥有多达30million行的代码。其次,内核拥有一些与普通应用程序不同的特性,这些特性往往被编译器以及开发者所忽视。最后,内核漏洞种类众多,缺乏准确的规范定义,使得找到内核漏洞变得困难。

接下来,卢教授分为三个方面详细介绍了其研究组最近在内核安全领域所作的一些工作,包括:1.如何在更早的阶段控制漏洞,从根源上防止漏洞的引入。 2.如何准确检测内核中已存在的漏洞。 3.将来可能的解决内核安全问题的方法,从secure-by-design的角度来思考内核安全问题。

开源软件是当今软件世界的基石,由于其开放性,允许全世界各地的开发者来提交patch。然而,目前patch的审核主要以人工审核为主,鉴于开源软件的复杂性,如果攻击者恶意的引入漏洞,往往很难被管理员所发现。下图展示了即使在patch提交者非恶意的情况下,人工审核所发现的与已知所有的UAF漏洞的比例仍然不足50%。卢教授针对patch process安全问题提供了三点思考:1. 借助非技术的条款,来约束提交者的行为。 2. 借助自动化的分析方法,来检测patch是否有可能引入新的安全问题。 3. 借助实名账户来定位patch的提交者,降低恶意引入漏洞的风险。

除了patch,编译器也会引入一些安全问题。编译器优化聚焦在程序执行的正确性,安全性往往被忽视。下图展示了两个由于编译器优化所导致的uninitialized data leaks 与 Double-free漏洞的例子。为了提升编译器的安全性,需要对内核特有的安全性质作系统的分析建模,从而更好的进行测试与验证。

接下来,卢教授介绍了他们研究组近年来在自动化的内核漏洞检测方向所做的工作。其中一项工作发表在usenix security 2021。该工作聚焦于如何准确识别出一系列的函数对,继而通过已发现的函数对判断其使用是否正确。 由于传统的data-mining方法需要大量case来实现有效的inferences, 但在linux内核场景下很多时候我们通常使用的是custom function,缺乏use case。因此,该工作使用error-handling这种linux 内核当中普遍使用的结构,有效的识别函数对。特别的,作者使用堆栈式的结构来表示error-handling,通过将相邻的两个栈相减,可以准确的确定函数对。后置函数的缺失,多余,错误的调用顺序,都可认为是潜在的漏洞。基于上述规则,该工作一共识别出239个新的漏洞。

另一项工作针对内核fuzzing展开研究。该工作系统的研究在没有devices或者emulators的情况下,能否对driver进行fuzzing。作者发现,在linux下,driver往往都会follow LKDM(Linux Kernel Device Model)。当启动drivers时,会先进行初始化,之后开始从devices读取inputs。因此,启动一个drive最关键的阶段便是初始化。该工作提出一系列技术通过验证链来成功初始化drivers。 结果显示,该方法能够成功初始化149个device drivers.

最后,针对如何从根本上解决内核安全问题,卢教授提出了几点思考:包括考虑使用更安全的编程语言,比如rust,以及可以考虑内核代码的模块化以及模块的边界化,降低内核的复杂性。

https://www.bilibili.com/video/BV1XQ4y1v7LG?spm_id_from=333.999.0.0

上一篇文章
【11月10日讲座回顾】 现代化系统中的侧信道(side channel)攻击与防御
下一篇文章
【11月24日讲座回顾】 约翰霍普金斯大学曹寅志InForSec&SUSTech学术讲座
菜单