本发明涉及操作系统内核敏感数据识别,具体地说,是一种基于静态分析的操作系统内核敏感数据识别方法。
背景技术:
1、操作系统内核是现代软件与软件的基石,但内存安全问题是内核安全面临的一个严峻威胁。为了攻击者防止利用内核中的内存漏洞,实现内核提权的目的,计算机安全研究人员提出了多种防御机制,如kaslr、stackcanary、控制流完整性保护、页表保护机制等。然而,这些机制没有阻止攻击者通过篡改内核中的敏感数据来实现内核提权。例如,攻击者能够修改cred结构体对象的uid字段,将当前进程修改为root用户进程;cve-2020-13829通过修改全局变量ss_initialized的值,绕过了samsung移动设备的seandroid保护,进而获取了root权限。因此,保护内核中的敏感数据是有必要的。
2、目前,多个研究工作设计敏感数据的识别算法以自动化地识别重要的数据类型,但自动识别算法依赖于对操作系统内核语义的深入了解,无法做到识别操作系统内核中所有的敏感数据。目前,缺乏对敏感数据类型的自动标注技术,从而允许安全研究人员根据先验知识方便地标注重要的数据类型。
3、此外,即使安全研究人员保护了某些类型的敏感数据,但敏感数据可能与其他类型的数据存在数据流依赖关系或控制流依赖关系,如某个数据会赋值给敏感数据。那么,在这种情况下,攻击者能够通过修改该非敏感数据实现对敏感数据的间接修改。因此,与敏感数据存在数据流依赖关系或控制流依赖关系同样需要被标注为敏感数据。
技术实现思路
1、本发明的目的在于针对操作系统内核中的严峻内存安全问题,基于静态分析识别操作系统内核中的敏感数据,指导安全研究人员发现需要保护的敏感数据,本发明是通过以下技术方案来实现的:
2、本发明公开了一种基于静态分析的操作系统内核敏感数据识别方法,
3、1)用户使用敏感字段标注技术,标注重要的结构体字段类型,编译器自动识别程序中的标注,从而自动识别出用户标注的敏感结构体字段集合;
4、2)基于标注的敏感结构体字段集合,识别操作系统内核中的敏感数据,对敏感数据进行数据流依赖分析,识别操作系统内核中与敏感数据存在数据流依赖关系的数据,并将该数据对应的结构体字段定义为敏感字段;
5、3)基于标注的敏感结构体字段集合,识别操作系统内核中的敏感数据,对敏感数据进行控制流依赖分析,识别操作系统内核中与敏感数据存在控制流依赖关系的数据,并将该数据对应的结构体字段定义为敏感字段;
6、4)依据步骤2)和步骤3)中识别且定义的敏感字段的类型的数据是否可能被用于条件判断,设计过滤算法筛选不重要的字段。
7、作为进一步地改进,本发明所述的敏感字段标注技术为修改编译器前端clang,添加新的attribute,名为pac_tag,通过某个结构体字段加上该attribute,开发者将该字段标注为敏感字段,在clang解析结构体定义时,修改解析逻辑,将被加上该attribute的结构体字段保存起来,在clang将抽象语法树转换为llvmir时,通过llvmmetadata的形式将敏感结构体字段集合传递给中端,用作后续数据流依赖分析与控制流依赖分析的输入。
8、作为进一步地改进,本发明所述的敏感数据的数据流依赖分析为基于人工标注的初始敏感结构体字段集合,识别内核中与敏感字段类型的数据存在数据流依赖的数据,并将该数据对应的结构体字段标记为敏感字段,数据流依赖分析为迭代式算法,多次运行,直到敏感字段的数量不再发生变化,识别存在直接或间接数据流依赖关系的结构体字段。
9、作为进一步地改进,本发明所述的敏感数据的控制流依赖分析基于人工标注的初始敏感结构体字段集合,识别内核中与敏感数据存在控制流依赖关系的数据,并将该数据对应的结构体字段标记为敏感字段,控制流依赖分析算法只运行一次,即只识别存在直接控制流依赖关系的结构体字段。
10、作为进一步地改进,本发明所述过滤算法为对于数据流依赖分析与控制流依赖分析识别到的敏感结构体字段集合,识别操作系统内核中该类型的数据,并分析该类数据是否可能被用于条件判断,若某一敏感结构体字段类型的数据从未被用于条件判断,则将该字段从敏感结构体字段集合中删去。
11、本发明的有益效果如下:
12、1)设计敏感结构体字段的标注技术,允许开发者在程序源码的结构体定义中标注重要的结构体字段,并由编译器自动识别标注。该技术允许安全研究人员基于对程序语义的理解,方便地定义重要的结构体字段。
13、2)基于人工标注的初始敏感结构体字段集合,本发明识别操作系统内核中的敏感数据,并进行数据流依赖分析,将与敏感数据存在数据流依赖关系的数据识别为敏感数据,并将敏感数据对应的结构体字段识别为敏感字段。由于数据流依赖关系为强依赖关系,本发明不仅识别了直接数据流依赖关系,同样识别了间接数据流依赖关系。即,在进行一轮数据流依赖分析后,基于新的敏感字段集合进行新一轮的数据流依赖分析,直到敏感字段集合不再发生变化。
14、3)基于人工标注的初始敏感结构体字段集合,本发明识别操作系统内核中的敏感数据,并进行控制流依赖分析,将与敏感数据存在控制流依赖关系的数据识别为敏感数据,并将敏感数据对应的结构体字段识别为敏感字段。由于数据流依赖关系为弱依赖关系,本发明仅识别直接控制流依赖关系,避免识别过多不重要的结构体字段,导致保护时引入过高不必要的开销。
15、4)对于数据流依赖与控制流依赖分析算法识别到的敏感结构体字段集合,本发明通过过滤算法筛选不重要的字段,与敏感数据存在依赖关系的数据的敏感性可能较弱。本发明识别不可能用于条件分支判断的字段,并将该类字段从敏感结构体字段集合中删去,减少误报数量。
16、5)本发明在设计敏感字段的依赖分析算法时,基于类型信息分析不同结构体字段类型的数据之间存在的数据流依赖关系和控制流依赖关系,识别出需要保护的敏感结构体字段,从而将这些字段类型的数据都认为是敏感的;而不是通过分析变量实例与哪些变量实例存在依赖关系,从而识别出需要保护的变量实例。这种分析算法不需要对操作系统内核进行复杂的指针分析,能容易地扩展到操作系统内核,避免过高的分析开销,同时保证了分析的完整性,避免存在敏感数据未得到识别。
1.一种基于静态分析的操作系统内核敏感数据识别方法,其特征在于,
2.根据权利要求1所述的基于静态分析的操作系统内核敏感数据识别方法,其特征在于,所述的敏感字段标注技术为修改编译器前端clang,添加新的attribute,名为pac_tag,通过某个结构体字段加上该attribute,开发者将该字段标注为敏感字段,在clang解析结构体定义时,修改解析逻辑,将被加上该attribute的结构体字段保存起来,在clang将抽象语法树转换为llvm ir时,通过llvm metadata的形式将敏感结构体字段集合传递给中端,用作后续数据流依赖分析与控制流依赖分析的输入。
3.根据权利要求1所述的基于静态分析的操作系统内核敏感数据识别方法,其特征在于,所述的敏感数据的数据流依赖分析为基于人工标注的初始敏感结构体字段集合,识别内核中与敏感字段类型的数据存在数据流依赖的数据,并将该数据对应的结构体字段标记为敏感字段,数据流依赖分析为迭代式算法,多次运行,直到敏感字段的数量不再发生变化,识别存在直接或间接数据流依赖关系的结构体字段。
4.根据权利要求1所述的基于静态分析的操作系统内核敏感数据识别方法,其特征在于,所述的敏感数据的控制流依赖分析基于人工标注的初始敏感结构体字段集合,识别内核中与敏感数据存在控制流依赖关系的数据,并将该数据对应的结构体字段标记为敏感字段,控制流依赖分析算法只运行一次,即只识别存在直接控制流依赖关系的结构体字段。
5.根据权利要求1所述的基于静态分析的操作系统内核敏感数据识别方法,其特征在于,所述过滤算法为对于数据流依赖分析与控制流依赖分析识别到的敏感结构体字段集合,识别操作系统内核中该类型的数据,并分析该类数据是否可能被用于条件判断,若某一敏感结构体字段类型的数据从未被用于条件判断,则将该字段从敏感结构体字段集合中删去。