《基于源代码的自动程序分析在内核安全中的应用.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个全局变量03740300180netfs
7、driverskernelsecurityincludeotherFieldsStructs小节分析过程利用到了数据流分析:寻找可能的返回值控制流分析:寻找控制节点程序切片别名分析:数据结构间的指向和包含关系应用案例(2)自动化识别并修复内核中由于未初始化变量造成的信息泄漏 CCS 16动机内核中的信息泄漏漏洞,尤其是未初始化数据造成的泄漏越来越普遍Uninitialized datareadOut-of-bound anduse-after-free readOthers(e.g.,logicerror)OOB and UAF Others(13.6%)Uninitialized data
8、read(57.3%)2013年以来LINUX内核中信息泄漏漏洞的分类例子passwordsensitiveUser A allocates object A and writes“sensitive”in to itMemoryObject AsensitiveUser A deallocatesobject A;“sensitive”is notclearedMemoryObject AsensitiveUser B allocatesobject B withoutInitialization;“sensitive”keptMemoryObject BpasswordsensitiveU
9、ser B reads and discloses Object B;“sensitive”leaked!Object B1234问题如何尽可能精确地找到所有该类型漏洞?全面性:不能有漏报精确性:尽可能降低误报解决方案该类漏洞需要同时满足两个条件未初始化可泄漏适合使用静态污点分析SOURCE:内存分配SINK:泄漏点(COPY_TO_USER,NETWORK)SANITIZER:赋值语句(初始化)UniSan字节(BYTE)粒度的静态污点分析考虑函数调用(INTER PROCEDURAL)考虑调用的上下文(CONTEXT SENSITIVE)Allocations(e.g.,alloca/km
10、alloc)Sinks(e.g.,copy_to_user)data flowReachability analysisInitializationanalysis分析结果(1)LINUX KERNEL:X86_64,AARCH64ArchModuleStaticAllocaDyn.AllocaStaticMallocDyn.MallocUnsafeAllocaUnsafeMallocPercentX86_642,15217,854241,7681,1611,4933869.0%AArch642,03015,596321,7901,2331,48545110.3%ArchDisable rea
11、chability analysis(#unsafe)Disable initializationanalysis(#unsafe)X86_6414,094(78.8%)3,380(18.9%)AArch6411,209(71.7%)2,961(18.9%)分析结果(2)手工分析了350个报告的不安全内存分配确认了19个漏洞两类常见的成因开发人员忘记进行初始化编译器为了对齐而加入的PADDINGPADDING(1)/*both fields(5 bytes)are initialized*/struct usbdevfs_connectinfo ci=.devnum=ps-dev-devnum
12、,.slow=ps-dev-speed=USB_SPEED_LOW;/*leaking 3-byte uninitialized padding bytes sizeof(ci)=8*/copy_to_user(arg,&ci,sizeof(ci);struct usbdevfs_connectinfo unsigned int devnum;unsigned char slow;/*3-bytes padding for alignment*/;PADDING(2)/*copy initializer*/struct usbdevfs_connectinfo ci1,ci2;memset(&
13、ci2,0,sizeof(ci2);ci1=ci2;/*default initializer*/static struct usbdevfs_connectinfo ci1;/*partial initializer*/static struct usbdevfs_connectinfo ci1=0;struct usbdevfs_connectinfo unsigned int devnum;unsigned char slow;/*3-bytes padding for alignment*/;小节分析过程利用到了静态污点分析类型分析:数据结构各个域的大小其他案例其他案例基于源代码的符号
14、执行自动挖掘文件系统的中的BUG:JUXTA SOSP 15挖掘API的不正确使用:APISAN SECURITY 16静态插装修复漏洞:DANGNULL NDSS 15,CAVER SECURITY 15,UNISAN CCS 16防御攻击:KENALI NDSS 16,VTRUST NDSS 16展望及讨论基于源代码的自动漏洞挖掘随着开源软件的流行(例如ANDROID),基于源代码的自动漏洞挖掘将变得更加常见和强大RID ASPLOS 16DR.CHECKER SECURITY 17常用的分析技术虽然针对的目标不同,但基本的分析技术是通用的控制流分析数据流污点分析指针别名分析符号执行常用的套路虽然针对的目标不同,但基本的套路是通用的分析并提取已知漏洞的特征设计特征检测方法应用到目标对象上谢谢