基于LLVM编译器的安全防护技术方案

基于LLVM编译器的安全防护技术方案

LLVM对不同的语言提供同一种中间表示,因此可在中端对IR进行修改,其不受特定语言或特定设备的约束。

  1. 做代码混淆保护软件代码安全,增加逆向分析难度
  1. 基于LLVM IR做代码混淆,可基于Obfuscator-LLVM项目实现更强的混淆技术,例如不透明谓词的控制流混淆技术,在程序中插入不透明谓词给程序添加大量虚假的程序控制流,隐藏程序的真实控制流。
  2. 块调度编译器,会把代码跳转和函数调用加密,切断函数逻辑
  3. 代码虚拟化,几维安全虚拟化产品KiwiVM,在编译时直接对指定的函数实施虚拟化处理,凭借自定义CPU指令的特性,代码加密过程不可逆,攻击者无法还原代码。

  1. 增加漏洞防利用的机制
  1. SafeStack:阻止基于堆栈缓冲区溢出的攻击,将程序堆栈分为安全堆栈和不安全堆栈两个区域,安全堆栈区域存储返回地址、溢出的寄存器、局部变量等信息并分配在随机地址处,并确保没有指向安全堆栈的指针存储在安全堆栈之外。

-fsanitize=safe-stack

-fstack-protector(canary word)

  1. 控制流完整性-fsanitize=cfi

Control Flow Integrity — Clang 16.0.0git documentation

  1. 开启Spectre v1缓解措施-mspeculative-load-hardening
  2. AddressSanitizer内存错误检测器,可检测对堆、栈和全局变量的越界访问,释放后重用,double free,内存泄露等。

-fsanitize=address

  1. MemorySanitizer未初始化的内存读取的检测器-fsanitize=memory
  2. ShadowCallStack,目前仅针对AArch64位实现,将函数的返回地址保存在影子调用栈中来阻止返回地址被覆盖。

-fsanitize=shadow-call-stack

   

  1. 做安全隔离,增强现有防御能力

MemSentry项目支持:SFI(Software Fault Isolation)、MPX英特尔内存保护扩展、Intel VT-x VM功能、AES-NI等。

https://github.com/vusec/memsentry

  1. 静态安全分析工具、可靠性评估、错误检测工具
  1. SAFECode项目SAFECode

用于C/C++程序的内存安全编译器,使用运行时检查代码来检测运行时的内存安全错误,可提供以下安全保证:数组边界检查,仅加载和存储访问有效的内存对象,对悬空指针的合理操作。

SVA(Secure Virtual Architecture)安全虚拟架构是基于编译器的虚拟机,使用SAFECode的技术为Linux内核提供内存安全保证,SVA中的所有软件被编译成虚拟指令集,其是对LLVM IR的增强,为低级软件硬件交互提供内存安全性。

  1. Clang静态分析器

通过一组检查器对C类语言家族源代码进行分析来发现错误

  1. 模糊测试技术

LibFuzzer模糊测试引擎,和要被测试的库链接在一起,通过一个特殊的模糊测试进入点即目标函数,用测试用例feed要被测试的库,fuzzer会跟踪哪些代码区域已经被测试过,然后在输入数据的语料库上产生变异,代码覆盖的信息由LLVM的SanitizerCoverage插桩提供。

安全编译研究对软件执行转换的编译方案,这些转换所产生的表示与源码具有相同的安全级别,旨在编译后保留高级编程语言抽象的安全性,可在源代码的抽象级别上推断应用程序的安全性。

抽象是一种用于管理计算机系统复杂性的技术,程序中的声明语句用于隐藏与特定抽象级别无关的细节。程序设计语言的抽象有模块、函数、堆栈、类型和作用域等。但是,当抽象的假设和属性与具体实现不相符时,可能会导致安全漏洞,攻击者在实现级别与应用程序进行交互以利用这些安全漏洞。大量软件漏洞的根本原因可解释为应用程序的高层抽象在其低层表示中被破坏。

你可能感兴趣的:(llvm编译器,安全,网络)