Skip to content

方法Method

动态污点跟踪

Dynamic taint tracking · Data-flow taint propagation

在一次执行中传播来源集合,精确说明它追踪的数据依赖,以及与语义依赖和隐式信息流的差别。

形式陈述 ​

跟踪的是来源集合 ​

在固定变量、全部初始化、无堆和无异常的整数IMP中执行程序。来源全集S={s1,…,sq}由使用者声明,例如两个输入字段各有一个来源ID。每个当前值附带集合τ(x)⊆S;未标记输入的集合为空。来源可以表示秘密、外部不可信输入或数据出处,标签的含义必须先由政策给定。

这里采用只跟踪数据操作的规则:常量标签为空,读变量取得当前标签,二元运算取操作数标签并集;赋值x:=e以表达式标签覆盖x的旧标签。表达式值仍按操作语义计算,标签不改变算术结果。if和while决定执行哪一段,但守卫标签不自动加入那一段赋值的标签。

sink是检查位置。固定允许来源集合A,最终sink值可通过检查当且仅当τ(out)⊆A。该判断只回答当前数据依赖是否带来禁用来源;它不是跨所有输入和路径的保密证明。[1, §3]

一次执行的数据依赖图 ​

为每个初始值、常量求值、二元运算和赋值结果建立事件节点。读变量引用该名字最近的值节点;二元运算从两个输入值连边,赋值从右端结果连边。只为真正执行的操作建图,边总指向较晚事件,因此有向无环。来源标记放在相应初始值节点上。

不变量:当前值的污点集合,等于沿这张执行数据图反向可达的来源标记集合。常量没有来源前驱,读取得已有集合,二元节点合并两组可达来源,赋值让新节点替换当前名字的旧节点。对事件顺序归纳便得到不变量。

图里没有从条件选择连到分支赋值的边。这个省略定义了本页的分析能力;增加控制信息需要另行规定语义,不能在结论中悄悄补上。

直觉

标签是随值移动的便签 ​

如果字段a标为“表单”,字段b标为“数据库”,则a+b的结果同时带两个便签。把这个结果复制给t,便签一同复制;随后t:=0产生全新的常量值,旧便签被覆盖。一个名字曾经带过标签,并不意味着它永远带着标签。

便签记录哪些读值参与了计算,未必记录哪些输入真正能改变最终答案。计算h-h读取h两次,依赖图仍含h来源;数学上两项却总会抵消。这正是执行依赖与语义敏感性不同的地方。

例子与边界

两个来源和一次覆盖 ​

设a=3、b=4,τ(a)={A}、τ(b)={B},执行:

text
t := a + b
u := t - a
t := 0
out := u

第一步t=7,标签{A,B}。第二步u=4,标签仍为{A,B},因为它从t和a读值;化简后的数学表达式其实等于b,但这套并集规则不做抵消推理。第三步t变成0且标签为空,u仍指向先前的计算结果。最终out=4,标签{A,B}。若sink只允许B,本次检查拒绝;这是相对于语义依赖的保守标记,而不是值算错。

空标签仍可能泄漏秘密 ​

text
if h then out := 1 else out := 0

两支右端都是常量,因此h=0和h=1时out标签都为空,sink检查都会通过;公开值却分别是0和1。秘密经由“选了哪个赋值”流动,执行数据图没有记录这类边。

动态信息流监测另外维护pc及敏感升级状态,目标是限定双运行之间可观察的差异。两者的差别在于承诺:来源分析返回执行数据来历,安全监测要说明不同秘密运行为何不能产生两个不同的可接受低结果。简单把守卫标签并入被执行赋值,也不足以自动得到后者的定理。

未标记来源和遗漏操作 ​

若h根本未列入来源,out:=h也得到空标签。正确传播不能补救错误的来源配置。若语言扩展为指针读写或数组索引,还必须说明地址依赖、别名和内存粒度如何影响传播;固定名字的规则不能直接覆盖这些新操作。

推论与应用

运行成本和可复算接口 ​

把q个来源存为位集,令b=1+⌈q/w⌉,w为机器字位宽。一次并集或包含检查最坏O(b);加1包含q=0时读取指令与检查空集合的基础工作。设源语法大小为A,实际从命令栈分派K次(包括seq容器),访问了E个表达式节点,则包含输入验证的时间为O(A+(K+E+v)b),当前标签空间O(vb),v是变量数。表达式栈另随最大表达式大小增长,命令栈另随源程序大小增长;整数算术位成本不包含在标签界内。

下载解释器用整数位掩码表示来源,sources参数指定每个初始变量的掩码。它不必保存完整事件图即可传播标签;若为了说明原因而存图,还需要按事件节点与边计额外空间。trace=True记录实际赋值和分支,日志每条还存标签掩码,不能视为零成本。

终点要求同时交出值、来源集合及不同秘密的两次结果。三者放在一起,才能发现“sink通过”究竟验证了哪一种政策。

结构迁移 ​

在两来源主例中,将第二句改成u:=b,其余不变。最终值还是4,但标签从{A,B}变成{B},只允许B的sink现在通过。再把out改成if a then out:=u else out:=0,out的标签在两条分支分别为{B}与空集;sink仍通过,却无法据此排除关于A的控制泄漏。验收需要重画实际事件边,指出哪条边消失、哪类边从未建立。

参考资料

[1] James Clause, Wanchun Li and Alessandro Orso, “Dytan: A Generic Dynamic Taint Analysis Framework”, ISSTA 2007,pp.196–206,§3:来源、传播政策、默认并集和sink;Dytan框架也支持控制流政策,本页只形式化其数据流选择。默认来源并集与sink配置分别对应§3的传播政策和检查位置接口。

[2] Thomas H. Austin and Cormac Flanagan, “Permissive Dynamic Information Flow Analysis”, UCSC-SOE-09-34技术报告,2009,§§1、3:动态标签中的隐式流及朴素升级反例。

关系图谱4 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系