《基于源代码的自动程序分析在内核安全中的应用.pdf》由会员分享,可在线阅读,更多相关《基于源代码的自动程序分析在内核安全中的应用.pdf(41页珍藏版)》请在三个皮匠报告上搜索。
1、加州大学河滨分校助理教授基于源代码的自动程序分析在内核安全中的应用目录基于LLVM的静态分析应用案例展望及讨论基于LLVM的静态分析LLVM编译器框架模块化,高复用性的编译器框架前端:CLANG(C/C+/OBJECTIVE-C),CUDA,HASKELL,ETC.后端:X86,ARM,ARM64,NVPTX,RISCV,WEBASSEMBLY,ETC.其他:LINKER,COMPILER-RT,KLEE,LLDB,LIBC+,ETC.FrontendLLVMIRLLVMOptimizerBackendMachineCodeLLVM Pass基于LLVM IR的分析和转化程序层次:MODULE
2、,SCC,FUNCTION,LOOP,REGION,BB,ETC.模块化:PASSMANAGER,REQUIRED,PRESERVED基础教程:HTTPS:/LLVM.ORG/DOCS/WRITINGANLLVMPASS.HTMLFrontendLLVMIRLLVMOptimizerBackendMachineCode漏洞挖掘常用分析数据流分析:DEF-USE,TAINT ANALYSIS,ETC.控制流分析:CFG,CALL GRAPH,DOMINATOR,ETC.指针(POINT-TO)分析:BASICAA,ANDERSON,DSA,ETC.符号执行:CLANG STATIC ANALYZ
3、ER类型(TYPE)分析值域(RANGE)分析相比于其他分析平台(如CIL),LLVM入门门槛低,且有大量资源LINUX内核分析(1)难点一:如何将内核源代码编译为LLVM IRLINUX内核大量使用GCC独有的非标准C特性LINUX社区只考虑支持GCCLLVM社区不考虑支持非标准C特性LLVMLINUX项目(HTTP:/LLVM.LINUXFOUNDATION.ORG/)LINUX内核分析(2)难点二:如何进行全内核分析LLVM常见分析(PASS)的最大分析单元是MODULE,即单个源文件LLVM-LINK 重命名问题(不推荐)LTO 速度较慢,适合分析后需要插装的应用自主链接MODULE(
4、KINT,KERNEL-ANALYZER)应用案例(1)自动化识别并保护内核中的重要数据 NDSS 16动机内存错误型漏洞在内核中较为常见现有的ROOT,越狱工具都利用了内核中的内存错误漏洞内存错误型漏洞的利用十分灵活问题:如何找到所有可以被攻击的对象例子控制流劫持型攻击绕过检查数据型攻击误导检查代码注入修改型攻击取消检查现有工作的不足SECURE BOOT 不能解决后两种攻击KCFI 不能解决数据型攻击KASLR 容易通过信息泄漏型攻击(包括测信道攻击)绕过针对常用攻击对象(CRED)的保护可以被绕过观察提权攻击的本质是攻击内核的访问控制(ACCESS CONTROL)系统访问控制系统有三条
5、原则全面性 不能被绕过 必须保护所有的控制数据抗攻击 不能被误导 必须保护所有的数据依赖正确性 假设正确问题如何系统性的发现所有需要保护的数据?控制数据 CODE POINTER INTEGRITY 基于类型数据依赖 安全检查 如何发现安全检查?解决方案利用系统调用的返回值系统调用的返回值具有明确的语义LINUX:EACCESS,EPERM,EROFS,ETC.WINDOWS:ERROR_ACCESS_DENIED,ETC.优点:系统,全面,可自动化例子(1)第一步:收集函数返回值例子(2)第二步:找到控制节点例子(3)第二步:找到控制节点需考虑前序必经节点(DOMINATORS)if(con
6、dition1|condition2)return 0;elsereturn-EACCESS;例子(4)第二步:找到控制节点避免爆炸if(condition)return-EINVAL;if(uid_eq)mode 6;elsemode 3;例子(5)第三步:后向切片完整性为保证完整性,还需递归地进行数据和控制依赖的分析考虑指针分析结果NEXUS 9 ANDROID KERNEL3个返回值:EACCESS,EPERM,EROFS634个数据结构中的1240个域279个全局变量1631159350403740119604237303136020406080100120140160180netfs