《Taint-based Directed Whitebox Fuzzing》

介绍了一种名为BuzzFuzz的定向白盒模糊测试工具,它通过污点追踪技术,有效地生成格式良好的测试输入,使测试深入到程序的核心语义处理部分,从而发现更多深层次的语义错误。

题目:Taint-based Directed Whitebox Fuzzing
作者:Vijay Ganesh and Tim Leek and Martin Rinard
单位:MIT Computer Science and Artificial Intelligence Lab
问题:
fuzzing在揭露更深的由于系统没有正确处理合法输入导致的语义错误上不是很有效,很多系统采用全部随机的输入生成策略无法满足有格式要求的输入基本的语法约束,因而无法通过最初的解析阶段探索之后的代码

方案:
提出有导向的白盒fuzzing测试,BuzzFuzz工具,旨在生成格式良好的测试输入,使其能够执行到被测程序核心语义处理部分的深处代码
基于如下技术:
1)污点追踪:执行一个或多个有效样本输入,通过插桩获取污点信息,能够记录程序计算的每个值受输入中哪些字节影响
2)攻击点选择:被测系统中的一些特定的点被识别为潜在攻击点,BuzzFuzz默认所有库函数和系统调用为攻击点,也可用户配置选择程序中任意点为攻击点
3)有导向fuzzing:对每个攻击点和每个样本输入,BuzzFuzz计算影响该攻击点的值的输入字节集合,产生的新输入只修改影响值的输入字节,其它的字节与样本一样,默认BuzzFuzz会给这些字节赋一些极端的值,如大整型、小整型、零等。BuzzFuzz也可配置使用不同策略,如生成随机值等
4)有导向测试:在新生成的种子上运行系统观察是否揭露错误

该方法的好处:
1)保留语法结构:有导向的fuzzing希望在不影响原始输入的合法语法结构的情况下改变输入字节,自动生成的输入需要通过初始解析部分以执行语义核心中的代码
2)目标值:被修改的输入字节为能够直接与特定潜在脆弱性相关的值
3)协同改变:有导向fuzzing可以识别并修改输入空间中多个互斥区域,只有协同一起修改这些空间才能揭露一个错误

实验结果: http://people.csail.mit.edu/vganesh/buzzfuzz.html

原理
1. 动态污点追踪:BuzzFuzz实现了一个标准的污点追踪算法,第一步是处理被测源代码,插入对BuzzFuzz污点追踪库的调用代码
维护了一个map,用哈希表将地址映射为输入文件中输入位置的集合,当应用用了已有值的集合计算一个新的值时就对这些输入字节位置集合取union,并把该集合存到新值地址对应的哈希表索引处

1)类型信息:除了记录文件位置信息,污点追踪系统还要记录新值的类型,BuzzFuzz用这些信息在fuzzing阶段选择合适的极端值
2)过程调用:为了跨过程调用追踪污点,BuzzFuzz维护了一个栈,记录过程参数的污点信息,每个过程调用点,插入的调用污点追踪库的代码会将参数的污点信息压入栈中,利用栈去检索参数污点信息
3)库过程:特定情况下,BuzzFuzz是无法获得库的源代码的,因此无法为这些过程插桩,BuzzFuzz维护了一个内部数据库,记录污点在一个小的关键库过程调用集合中怎样流动的
4)攻击点:在攻击点的插桩记录了每次执行到攻击点的时刻,攻击点处所有值的污点信息
5)报告:执行结束时,BuzzFuzz生成一个报告,包含每个攻击点的污点信息。每次执行到每个攻击点时,对攻击点处的每个值,报告列举了影响该值的所有输入文件位置。报告还包括每个值的类型

局限:BuzzFuzz没有追踪由于条件和数组访问引起的间接污染关系。
2.生成fuzzed输入
1)第一步:要得到一个种子输入的语料库,给定这样一个集合,BuzzFuzz依次用这些输入执行插桩版本的应用,得到一个包含每次执行每个程序点的污点追踪信息的报告
2)第二步:利用报告来fuzz相应种子输入,得到一个新测试输入。每个报告都表明了一个相关输入文件字节的集合,BuzzFuzz可以根据类型修改。
3)第三步:结合并应用来自所有报告入口的改变,目前BuzzFuzz的实现是简单地结合并应用报告中所有入口的改变。如果两个入口冲突了则BuzzFuzz随机选择一个。
3. 测试
在非插桩的版本上执行新生成的fuzzed测试输入,观察是否有失败,将这些失败报告给开发者

评估:
在两个开源C程序上进行测试,Swfdec 0.5.5(一个Adobe Flash Player)和MuPDF 0.1( 一个PDF Viewer)
分别从Pedram Amini和MIT的Adam Kiezun那获得了两个程序的语料库
实验环境:64bit 3GHz Ubuntu Linux box

每小时发现的错误率反映了本文技术的整体有效性
BuzzFuzz可以有效发现跨模块边界的有问题的交互相关的错误

与随机fuzzing相比,随机fuzzing生成的输入文件在文件头部分的字节基本上总是被解析部分代码就拒绝了,即文件不合法

有导向的fuzz测试可以保留输入文件的语法结构,并没有设计去发掘初始输入解析代码中的错误,这方面的错误简单的随机fuzzing更有效

本文的方法采用轻量级的符号化信息,能够在实际中探索更深的程序路径,发现更深处的错误,相应的trade-off是无法系统地枚举输入以穷尽探索程序执行空间,揭露一个错误的可能性完全取决于fuzzing算法和应用特性之间的交互

总结和未来工作:
本文技术的成功背后最主要的观点在于利用污点追踪获取哪些输入字节改变能命中特定攻击点,这些污点信息使得BuzzFuzz能够在不违背语法有效性前提下改变种子输入文件。不需要人工干预也不需要测试者理解输入文件格式。

### 解决 Kubernetes 中无效的污点效果错误 在使用 `kubectl taint` 命令时,如果指定的污点效果(Taint Effect)无效,可能会导致命令执行失败。以下是关于此问题的专业分析和解决方案。 #### 1. 污点效果的合法值 Kubernetes 支持以下三种污点效果[^1]: - **NoSchedule**:禁止新 Pod 调度到该节点,但不会影响已存在的 Pod。 - **PreferNoSchedule**:尽量避免调度新 Pod 到该节点,但如果资源不足或其他原因,仍然可以调度。 - **NoExecute**:不仅禁止新 Pod 调度到该节点,还会驱逐已存在的不匹配容忍度的 Pod。 如果指定了其他非上述值,将触发无效污点效果错误。 #### 2. 错误示例 以下是一个无效的污点效果示例: ```bash kubectl taint nodes node1 key=value:InvalidEffect ``` 运行上述命令后,系统会返回类似以下的错误信息: ``` error: invalid argument "InvalidEffect" for --effect, valid values are "NoSchedule", "PreferNoSchedule", "NoExecute" ``` #### 3. 正确的命令格式 确保在命令中使用正确的污点效果值。例如: ```bash kubectl taint nodes node1 key=value:NoSchedule ``` 上述命令将为节点 `node1` 添加一个带有 `NoSchedule` 效果的污点。 #### 4. 移除无效污点 如果节点上已经存在无效的污点效果,可以通过以下命令移除所有与键相关的污点: ```bash kubectl taint nodes node1 key:- ``` 这将删除键为 `key` 的所有污点,无论其效果为何。 #### 5. 验证污点配置 在添加或修改污点后,可以使用以下命令验证节点上的污点配置: ```bash kubectl describe node node1 | grep Taints ``` 输出示例: ``` Taints: key=value:NoSchedule ``` #### 6. 示例代码 以下是一个完整的示例,展示如何正确添加、移除和验证污点: ```bash # 添加一个带有 NoSchedule 效果的污点 kubectl taint nodes node1 key=value:NoSchedule # 移除特定污点 kubectl taint nodes node1 key:- # 查看节点上的污点配置 kubectl describe node node1 | grep Taints ``` --- ### 注意事项 - 确保污点效果值符合规范,否则会导致命令失败。 - 在移除污点时,务必小心操作,以免影响集群的正常调度行为[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值