![87f841f992dee472df48a408b7624985.png](https://i-blog.csdnimg.cn/blog_migrate/6c04c2eb8cbe3ccbf1c26fdc4ab1a8d4.jpeg)
Different Is Good: Detecting the Use of Uninitialized Variables Through Differential Replay
报告人:jxin
![0bbdd65a3974c8f5e8d3429d4433c26a.png](https://i-blog.csdnimg.cn/blog_migrate/a35282cc4b3a9105312482c522555ef1.png)
本文发表于网络安全顶会CCS 19,作者团队来自阿里巴巴-浙江大学前沿技术联合研究中心网络空间安全实验室(AZFT),其中第一作者是阿里巴巴猎户座安全实验室的曹梦晨。本文是国内首次以企业为第一作者在CCS发表论文。
![87c9fb222b884bc15c8c2fba21d91063.gif](https://i-blog.csdnimg.cn/blog_migrate/34845e5dd38a42398441e728efa87cc7.gif)
1. 关注点
在Windows和Linux等现代操作系统中,变量的值在其未被显式初始化之前是不确定的,这就导致程序中若是不慎使用了未初始化变量,不仅会引发程序错误,而且当未初始化变量跨越不同的权限域时,可能危及系统的安全性。比如说,在内核地址空间布局随机化(KASLR)机制下,如果某块内存中存放着内核对象的地址,但使用那块内存的变量未进行初始化从而泄漏到用户空间,将极大损害KASLR的安全性。攻击者可以根据泄漏的信息进行权限提升。
2. 问题原因
目前,针对闭源操作系统中未初始化变量的检查较为困难,作者给出了两个方面的原因:一是从静态分析的角度,需要源码,而且现代编译器(gcc, clang等)仅具备简单的检测功能,大多局限于某个函数,对于数组、指针、循环、结构体、联合体等无能为力。二是从动态分析的角度,需要触发点,而且使用未初始化变量这类内存泄漏问题通常并不会造成crash或者其它可以明显感知到的影响。
对全系统进行动态污点分析是一种理所当然的想法,即在分配栈或堆时设置source,当被赋值时就去除污点标记。如果程序使用了一块带污点的内存,就能确定使用了未初始化变量。但是缺点也显而易见,进行全系统的污点分析会带来极大的开销(实验中有对比评估)。
目前效果最好的动态分析工具是Bochspwn Reloaded,虽然能够检测出大量的未初始化变量的漏洞,但它为了减小开销,仅对特定类型指令进行污点传播,因此存在着漏报的问题。作者在文中选取了一个Motivation Example来展示该工具的局限性。
指令01:分配栈上变量,未进行初始化</