动态污点分析——隐式流造成的漏报和误报

来源:互联网 发布:mac ox驱动下载 编辑:程序博客网 时间:2024/05/17 03:53

污点分析面临 2 个问题:污染过度(overtainting)和污染缺失(undertainting)。
其中,污染过度是将一个与污点输入无依赖关系的数据变量标记为污点属性,即产生误报。
而污染缺失则是在污点传播过程中遗漏了与污点输入有依赖关系的程序变量标记为无污点属性,即产生了漏报。
其中控制依赖关系(隐式流)是常见的造成漏报和误报的原因。

隐式流

污点分析主要考虑 2 种信息流,显式流(explicit flow)和隐式流(implicit flow)。
显示流对应于程序的数据依赖关系,即变量x的污点信息直接传递(通过赋值或算数运算)给变量y;
隐式流对应于程序的控制依赖关系,即变量x的污点信息通过包含x的条件表达式间接传递给变量y。

隐式流示例代码1:

beginL1 x = get_input();L2 msg = uri = ‘’;L3 if (x == ‘a’){L4  uri = ‘post’;L5  msg = ‘a’;L6 }L7 else if (x == ‘b’){L8  uri = ‘post’;L9  msg = ‘b’;L10 }L11 send(uri, msg);end

在上述代码中,程序读入用户输入变量x,生成msg通过post方法提交。
x 的污点标记为 tainted 属性,按照显式流污点分析方法,msg 赋值为常量{‘a’,‘b’},被标记为 untainted 属性;但是 msg 取值依赖于(x == ‘a’) 和 (x == ‘b’) 的判断条件的 T 和 F 取值,即与 x 存在控制依赖关系(也称为隐式流污染)。
此时会产生漏报,msg 应标记为 tainted属性;而 uri 的取值不受 L3 和 L7 的影响,标记为 untainted属性。该代码段存在安全风险,因为 msg 被 post 提交后,攻击者捕获 msg 后可推断用户输入 x 的取值。

隐式流示例代码2:

beginL1 x = get_input();L2 msg = uri = ‘’;L3 if (x > ‘a’){L4 tmp = x + ‘a;L5 msg = tmp − x;L6 }L7 else {L8 uri = ‘post’;L9 msg = ‘a;L10 }L11 send(uri, msg);end

在上述所示代码中,按照显示污染分析方法, L4 和 L5 处 msg 赋值受 x 直接污染,但是 msg 在污染后取值为常量‘a’,此时会生误报,msg 也应标记为 untainted 属性。

如何避免?

待思考

参考:《污点分析中的隐式污染检测方法》

0 0
原创粉丝点击