(本篇文章有较多文字摘自https://fynch3r.github.io/%E6%B1%A1%E7%82%B9%E5%88%86%E6%9E%90%E7%AE%80%E5%8D%95%E4%BB%8B%E7%BB%8D/
综述
污点分析常常包括以下几个部分:
- 识别污点信息在程序中的产生点(Source点)并对污点信息进行标记
- 利用特定的规则跟踪分析污点信息在程序中的传播过程
- 在一些关键的程序点(Sink点)检测关键的操作是否会受到污点信息的影响
污点分析可以抽象成一个三元组<sources,sinks,sanitizers>
的形式,其中,source 即污点源,代表直接引入不受信任的数据或者机密数据到系统中;
sink即污点汇聚点,代表直接产生安全敏感操作(违反数据完整性)或者泄露隐私数据到外界(违反数据保密性);
sanitizer即无害处理,代表通过数据加密或者移除危害操作等手段使数据传播不再对软件系统的信息安全产生危害。
静态污点分析
基于数据流的污点分析、基于依赖关系的污点分析
其核心就是模拟执行,模拟每一条指令的执行,来判断污点传播到了其他变量中;模拟执行似乎可以借助以往分析eBPF的verifier的思路来加深理解。
动态污点分析
动态污点分析的核心是在运行时对指令的执行进行监控,往往需要借助于影子内存。
动态代码插桩、全系统模拟、虚拟机监视器
- 一般情况下,数据移动类和算数类指令都将造成显示的信息流传播。为了跟踪污点数据的显示传播,需要在每个数据移动指令和算数指令执行前做监控,当指令的结果被其中一个操作数污染后,把结果数据对应的影子内存设置为一个指针,指向源污染点操作数指向的数据结构。
相关工作比对
KASAN
KASAN为每一个字节都分配了1bit的影子内存,这是一个bool值,用于表示这个字节是否可以访问,如果不可以访问就是“红区”,可以访问的就是“绿区”;然后通过内核编译插桩的方式,在每一个访存指令前加入bl __asan_store1指令用于检测当前访存是否会访问到红区。
EINSTEIN
通过修改链接器使得程序仅仅加载到高4G的地址中,然后剩下的低地址用作影子内存,这样地址仅仅占32位,可以将64位的指针压缩成32位,节省了空间。
参考
https://fynch3r.github.io/%E6%B1%A1%E7%82%B9%E5%88%86%E6%9E%90%E7%AE%80%E5%8D%95%E4%BB%8B%E7%BB%8D/