标签(空格分隔): Fuzzing
快速且全面的 UAF 和 OOB 解决方案
- 基于编译时插桩
- 检测 OOB 写与 OOB 读
- 检测堆、栈、全局变量中的 OOB
- 强 UAF 检查
- Double-Free 检查
- 检测 Bug 的发生位置
- 打印翔实的相关信息
Upstream:CONFIG_KASAN + GCC 5.0+
KASAN Report (CVE-2013-7446)
检测未初始化的内存、信息泄露(本地与远程) not loads of not-stored-to variables, but uses of uninitialized values (see backup) 往往不加载未存储的变量,而是使用未初始化的值 没有误报,几乎没有漏报
Not upstreamed yet(on github): CONFIG_KMSAN + Clang
检测数据竞态(不同线程中的两个非同步访问,至少一个是 write) 内核数据竞态代表安全威胁:
- TOCTOU
- 未初始化/错误 Credentials
- racy UAF
- 由数据竞态造成的 Double Free
- Bug 最频繁的类型
KTSAN Report (CVE-2015-7613)
fuzzing + sanitizers = perfect fit!
trinity/iknowthis in essence:
知道参数类型,更像
- 倾向于找到 Shallow Bug
- frequently no reproducers
- 不适合回归测试
- 代码覆盖度指导
- Interesting 样本的语料
- 语料库中样本的畸变和执行
- 如果样本触发了新的代码覆盖度就添加到语料库
- 优势
- 将指数问题转化为线性
- 输入样本是 reproducers
- 语料库是回归测试的理想工具
- CONFIG_KCOV=y (upstream)
- 基于编译时插桩(GCC 6+)
- 编译时为每个基本块插入运行时回调函数
- 每个线程、每个系统调用的覆盖度
所有系统调用的声明性描述
这些描述允许程序按照以下形式进行生成、畸变
理想中
实际上,典型内核 Fuzzer 的操作:
- 手动创建虚拟机
- 手动拷贝、启动二进制程序
- 手动监控控制台输出
- 手动崩溃去重
- 手动定位与重现
- 手动重启崩溃虚拟机
Syzkaller 的操作
当前支持:
- QEMU
- GCE(Google Compute Engine)
- Android Devices(with serial cable / Suzy-Q)
- ODROID boards
可扩展的、需要支持的新类型:
- 得到控制台输出(to grep for crashes)
- 重新启动、重新创建(to repair after a crash)
- 拷贝、运行二进制程序(think of scp/ssh)
- 用稍特殊的方式构建内核
- 构建 syzkaller
- 写配置文件
- 运行 syzkaller
Ready to go $ bin/syz-manager -config my.cfg
如何在 Android 上 fuzzing /dev/ion 1、为描述创建新文件 sys/ion.txt 2、为新系统调用写描述 3、重新构建 4、运行
sys/ion.txt : includes
sys/ion.txt resources
sys/ion.txt system calls
sys/ion.txt structs
重新构建
sys.ion_arm64.const
$ bin/syz-manager -config my.cfg
用户态工具:ASAN、MSAN、TSAN 内核态工具:KASAN、KMSAN、KTSAN Hardening:CFI、SafeStack Fuzzing:LibFuzzer、syzkaller、OSS-Fuzz