源码分析请见这里
COIN Attack使用的安全策略
堆信息泄露检查
Pattern
- 私密数据和非私密数据放在同一个数据结构,被无意地一并带出Enclave。
- 循环退出条件由Enclave外部数据控制,循环中参数传到OCALL。(如违背程序预期多执行n轮循环将私密数据带出Enclave)
安检策略
- 查找循环条件包含无约束符号变量的无限循环
- 检查循环条件是否符号化
- 分析循环中包含的OCALL
- 识别OCALL参数中的内存指针
- 若指针指向Enclave堆且指针在循环中可被修改,则认为存在堆信息泄露
漏洞案例
栈信息泄露
Pattern
- Enclave栈内存被越界(通常通过
memcpy
)拷贝(越界读)到Enclave堆。堆内存后续经常通过Enclave接口被带出,从而导致栈信息泄露。
安检策略
memcpy
的长度是否符号化的(攻击者控制的)memcpy
源地址是否指向栈memcpy
目的地址是否指向堆
漏洞案例
Ineffectual condition
Pattern
- 如果攻击者能控制判断条件,那么这就是个无效条件。
安检策略
- 条件判断所有等式两边均为符号变量或一边为符号变量且另一边为常数。
- 条件判断后紧跟(不超过五条指令)直接控制转移指令。
漏洞案例
Use-after-free
Pattern
- 已释放内存被使用。在多线程调用ECALL情况下更容易触发。
安检策略
- 多线程下,每个线程Free内存后需要相较其它线程延迟10个指令执行,实现Memory-reuse Delay。
- 检查内存解引用目标地址,若其未分配或已释放,则认为存在UAF
漏洞案例
Double-free
Pattern
- 同一块内存被连续多次释放
安检策略
- 拦截
free
函数检查被释放的内存(无法在堆表中查阅到有效记录)再次被释放。
漏洞案例
栈溢出
安检策略
- 利用编译器对程序代码插桩
__stack_chk_fail
(若Stack Canary被破坏,会触发__stack_chk_fail
) - 通过计算路径约束基于符号执行触发
__stack_chk_fail
,则存在栈溢出
漏洞案例
堆溢出
安检策略
- 堆分配时存储堆对象边界信息
- 拦截内存写操作/函数(memcpy、memset)
- 根据堆对象边界信息,检查内存写操作是否越界(比较length)
漏洞案例
Null指针解引用
安检策略
- 使用符号引擎查询内存访问地址(如memcpy目标地址)是否为Null。