##背景

自从软件诞生之日起,软件质量就成了软件测试领域无法回避的重要议题,为了更高效的找出软件缺陷(俗称bug),Fuzzer(模糊测试工具)出现了,但不同领域使用Fuzzer的目标却不同:

* QA导向的模糊测试,即找到bug并且修复

* 安全导向的模糊测试,即找到bug并且验证是否是可利用bug

从技术架构实现上看,目前针对Linux/Android内核的Fuzzer主要有两种:

* 针对系统调用的模糊测试,比如Trinity

* 覆盖率引导型的模糊测试,比如syzkaller

Trinity是2010年代初期最流行的模糊测试工具,它基于规则使用系统调用和系统调用参数进行的组合对系统调用进行测试工作,但其对内核深度的代码路径的探索的效果并不理想,想要达到更广的内核各个子系统的覆盖率即使通过大量的硬编码工作依然会面临运行效率的问题,但Trinity是那个年代几乎唯一的选择。2015年2月,KASAN作为早期Google的开源项目合并到了Linux内核主线,这对覆盖率引导型模糊测试工具syzkaller的流行奠定了必要的基础,到2016年初的时候,已经有不少安全研究者和QA工程师开始尝试syzkaller。

## 当前问题

经过了数年的发展,syzkaller作为通用QA测试基本能满足Linux内核主线的迭代开发需求,但针对特定子系统的深度探索是远远无法达到高稳定性要求的行业,比如金融,工控,车联网,云计算等行业都会出现几种情况:

* 引入第三方内核代码,通常这些代码都是安全漏洞的高危地带,即使不开源,通过逆向工程也可满足安全分析的需求

* 某些行业应用依赖于特定内核子系统中的特定模块,通用型QA无法快速的实现其代码覆盖率

* 应用程序中不完备的回归测试,即应用的运行并没有完成对内核稳定性的基本测试

## 我们的方案:VaultFuzzer

赛博堡垒基于这一需求开发了基于状态导向的 fuzzer : VaultFuzzer , VaultFuzzer方案兼容现有的syzkaller框架,最大的优势在于可以把客户的业务需求和特定内核子系统给关联起来,这样的模糊测试可以为业务系统带来更强的稳定性,主要的特性如下:

* 通过对LLVM IR代码,汇编代码以及整个内核镜像的静态分析获得目标函数地址,而PCs权重的附件可以基于LLVM IR过程的CFG所获取,这些元数据都会被VaultFuzzer所使用。

* 覆盖率过滤,将目标收缩到子系统,文件和代码块级别,防止算力浪费在目标以外的探索中以避免常规QA已经探索的部分与用户生产环境所需要的测试重合。

* 权重PCs,构造基于CFG不均衡的权重系统,针对不同的代码块赋于不同的权重来引导VaultFuzzer压测的方向

* 内核状态模式,引入了CLANG/LLVM instrumentation,此模式下可以把触发bug的状态以测试用例的形式记录下来,以达到在更复杂的上下文中可以更高效的映射代码路径的真实状态,而和语料库兼容则基本上是一种空间换时间的方法,这避免了形式化验证方法带来的无法接受的性能开销。

## Vaultfuzzer和syz-kaller标准版测试数据

* Fuzzing中CPU时间总时长:100小时

* 物理世界真实时间:6小时40分钟

* 硬件:32核+64GB内存

* syz-kaller (2021.8):默认策略

* Vaultfuzzer (2021.3):仅增加覆盖率过滤,由于是通用子系统所以不包含其他特性

子系统

syz-kaller

Vaultfuzzer

dccp

19.27%

24.6%

l2tp

24.07%

24.39%

sctp

32.5%

51.18%

tcp

23.08%

46.66%

udp

41.67%

41.25%

文件

syz-kaller

Vaultfuzzer

syzbot/CI

dccp/*.c

20%

25%

50%

ipv4/tcp.c

49%

62%

75%

ipv4/udp.c

62%

66%

68%

ipv6/tcp_ipv6.c

30%

33%

52%

ipv6/udp.c

51%

49%

59%

ipv6/udplite.c

60%

60%

60%

l2tp/*.c

25%

25%

44%

sctp/*.c

33%

52%

58%

从结果来看,TCP和SCTP 数据比较好,数据已经逼近syzbot/CI,syzbot/CI每一次更新验证会筛掉一部分语料库,但总累计时间超过2年,如果有状态导向针对更细粒度子系统(比如SCTP)的测试Vaultfuzzer会有更好的数据表现。

## 总结

Fuzzing长期以来对于软件测试和安全领域都至关重要,前者关注尽快找出bug从而提升系统稳定性,后者则分为:

* 攻击方,尽快找出0day漏洞并加以武器化漏洞利用的过程

* 防御方,尽快找出所有bug(不论是否是漏洞)并且尽快修复提升系统的稳定性和安全性

2021年7月,NIST为了回应EO 14028行政命令发布了厂商出厂前安全测试的最低要求,其中模糊测试和回归测试在其中。这会一定程度的弥补长期以来业界对于跟生产环境相关的定向模糊测试不够重视的问题,技术趋势方面,微软安全团队也认为基于状态导向的模糊测试是未来不可阻挡的趋势。

VaultFuzzer也用于VED(Vault Exploit Defense)的压力测试以保证内核防护模块的稳定性,迄今为止,赛博堡垒目前是亚洲唯一针对Linux内核状态导向模糊测试方案的供应商。

声明:本文来自赛博堡垒,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。