[清华大学]漏洞挖掘之状态敏感的模糊测试StateFuzz
Dr.赵博栋 Prof.张超 清华大学 网络研究院 INSC
本文主要介绍了通过State Fuzz对Linux驱动程序进行模糊测试,该Fuzz方法由赵博栋博士在InForSec会议上分享,并在USENIX Security上发布.StateFuzz :System Call-Based State-Aware Linux Driver Fuzzing.该篇文章主要介绍了核心方法,为展示测试数据与实验展望.

前言:
模糊测试是当前主流的漏洞挖掘方法,近年来发现了大量的未知漏洞,受到工业界和学术界的广泛关注。其中,以代码覆盖率为进化指标的灰盒测试方案得到大量研究,衍生出了大量优化改进方案。但是,代码覆盖率与漏洞之间存在gap,提高代码覆盖率不一定能够有效发现潜在的安全漏洞。提出了状态敏感的模糊测试方法StateFuzz (USENIX’22),引入了程序状态作为进化指标,实验结果表明了该方法的有效性,在Linux和Android驱动中发现了数十个未知漏洞。本次报告将与大家探讨这一方案。
背景
漏洞:网络空间重要安全威胁
重要事件:乌克兰断电事件 震网病毒事件 WannaCry HeartBleed(websites) Aurora(Google)
漏洞:网络攻击的突破口
制导部分(漏洞) 战斗部分(漏洞利用) 控制部分(恶意代码)
美国军火商Lockheed-Martin提出的"杀伤链"
-
Reconnaissance 目标侦查 (漏洞挖掘)
Research,identification,and selection of targets -
Weaponization 武器定制 (漏洞利用)
Pairing remote access malware with exploit into a
deliverable payload(e.g.Adobe PDF and Microsoft Office files) -
Delivery 武器投放(主动/被动)
Transmission of weapon to target(e.g. via email attachments websites,r USB drivers) -
Exploitation 武器生效(漏洞触发与劫持)
Once delivered,the weapon’s code is triggered,exploiting vulnerable applications or systems.
-
Installation 持久驻留(恶意代码)
The weapon installs a backdoor on a target’s system allowing persistent access.
-
Command & Control 远程控制(僵尸网络)
Outside server communicates with the weapons providing "hands on keyboard access"inside the
target’s network.
-
Actions on Objective 最终行动(窃密/破坏/跳板)
The attacker works to achieve the objective of the intrusion,which can include exfiltration or destruction of data,or intrusion of another target.
漏洞与漏洞利用
漏洞挖掘与漏洞利用生成本质上都是输入空间搜素问题
输入样本空间 -> 漏洞Poc样本空间 -> 目标(软件、硬件、网络)
漏洞示例CVE-2009-4270
int outprintf(const char *fmt,...)
{int count;char buf[1024];va_list args;va_start(args,fmt);count = vsprintf(buf,fmt,args);outwrite(buf,count);//print out
}
int main(int argc,char* argv[])
{const char *arg;while((arg = *argv++)!=0){switch(arg[0]){case '-':{switch(arg[1]){case 0;default:outprintf("unknown switch %s\n",arg[1]);}}default:...}...
count = vsprintf(buf,fmt,args);没有对内存拷贝长度进行限制,造成了栈溢出问题
Vul trigger conditions:
- Path constraints 路径约束
- Vul constraints 漏洞约束
Discover vulnerabilities: - Symbolic execution 符号执行
- Fuzzing(testing) 模糊测试
基于代码覆盖率的Fuzzing更擅长解决Path constraints,
漏洞挖掘技术概览
漏洞挖掘技术发展历史
第一阶段(1960s-1970s):人工审核(依赖经验、无法扩展) -> 源代码审计、逆向工程、经验规则
第二阶段(1970s-1990s):规则扫描(误报高/可扩展性差) -> 静态分析、符号执行、模型检验
第三阶段(1990s-2013s):动态测试(漏报高、覆盖率低) -> 随机畸形测试例,模拟攻击者攻击输入
第四阶段(2013s-2023s):智能挖掘(智能进化) -> 知识与数据驱动,遗传进化算法
第二代方案:规则扫描 静态分析(SAST)
- 基于经验规则静态扫描
优点:速度快
缺点:误报高、无法输出poc验证脚本
瓶颈:不可判定(rice定理)
第三代方案:动态测试 DAST、IAST
- 基于动态信息的漏洞挖掘
优点:误报低
缺点:覆盖率低,漏报高
工业化产品:OWASP BURPSUITE VERACODE
第三代方案:模糊测试(fuzzing)
- Fuzzing 模糊测试
生成/变异测试例,测试,检查,重复…
Generator/Mutator -> inputs -> monitor(target program) -> Security violation? -> bugs
- 科学问题/挑战:
在无穷的输入空间中,如何高校搜素有限的漏洞样本?
Fuzzing 1:Generation-based
基于模块生成测试用例(e.g. grammar,specification)
优点: valid inputs,more code coverage
缺点: hard to setup,requires input knowledge(human efforts)
工业界应用:peach bstorm
Fuzzing 2:Mutation-based
变异旧测试用例来生成新的测试用例
优点:easy to setup,no prior knowledge required
缺点:invalid inputs,limited code coverage(checksum,magic number etc.)
工业界应用:Google OSS-Fuzz Micorsoft Project OneFuzz
第四代方案:智能模糊测试
目前学术界的探索方向:
广度:支持不同类型的目标软件
模糊测试系统应用到目标软件里面。
深度:提升种子生成、变异、测试效率
主要在种子变异和种子挑选环节进行方法优化。
提供较好的初始种子测试例 -> 种子池挑选种子 -> 种子变异 ->能量分配(变异次数) -> 新测试例 -> 测试执行(覆盖率跟踪/安全监控)
主要思想是优胜劣汰的方法,覆盖率跟踪使用遗传算法实现,得到的测试例覆盖率如果得到提升(进化),将会被筛选出作为种子放入种子池中。
VUL337 课题组漏洞挖掘研究成果
广度探索:
- 固件/硬件 IOT 芯片 Bios/TEE
- 内核/驱动 Windows MacOS Linux
- 系统软件 浏览器 hypervisor SGX/TEE应用
- 用户态软件 代码库 二进制程序 GUI程序
- 区块链 符号执行 智能合约 DeFi
- 网络设备/协议 网络服务 5G、路由器 网联车
深度探索: - 种子生成 > 自动/智能 输入格式识别
- 种子排序挑选 > 自动/智能程序语义理解
- 种子变异
- 测试性能优化 > 并行化、硬件协同
- 进化信号跟踪 > 精确、轻量化
- 进化策略 > 代码覆盖率、状态制导
- 安全违例检测 > 定向挖掘、瓶颈爆破
状态敏感模糊测试USENIX 2022
Code Coverage - Limitation
- Example:maze game
most code can be explored easily
no guidance to trigger the bug
State:values of maze[y][x]
while(true){ox=x; oy=y;switch(input[i]) {case: 'W': y--;break;case: 'S': y+=;break;case: 'A': x--;break;case: 'D': x+=;break;}if (maze[y][x]=='#'){Bug();}//If target is blocked,do not advance.if (maze[y][x] != ' '){x = ox; y =oy;}
}
- Another Example:DNN testing
most (Python) code can be explored easily
State:output of neurons(activated or not)
StateFuzz:State-aware Fuzzing
- Intuition:guide fuzzers to explore more program states
我们通过引导模糊测试,去探索更多的程序状态(Program State)。
Program State:A combination of Register values and Memory values.
所有寄存器的值和内存的值的组合。
问题:如何去跟踪这样庞大的组合? - Intuition: guide fuzzers to explore more program states
- Need to answer 3 quesions
Q1: what are appropriate program states?如何定义一个确认的程序状态?
Q2: how to recognize and track program states?如何识别与跟踪程序状态?
Q3: how to guide fuzzers to explore program states?如何去引导模糊测试?
Q1:What are program states?
- Values of all memory and registers?
the number of such states is overwhelmingly large
hard to track in practice
- Manual annotation:
human efforts needed
- Protocal status code:
not always available
- Using variables to represent states is very common
使用变量来标识状态,我们也可以通过变量作为我们的程序状态。 - Ideally,a state is a combination of all program variables(including memory and register values)
state explodsion!
- Practically,states will persist across interaction boundaries,which will be read by an interaction,and
written another interaction.
have a long life time
can be updated(i.e… state transition)by users
can affect the program’s control flow or memory access
Ex:FTP Server Program
User -> Pass Packet / User Packet -> FTP Server
int ftpUSER(PFTPCONTEXT context,const char *params);
int ftpPASS(PFTPCONTEXT context,const char *params);
Ex:the variable context -> Access is shared by the Pass and List request
int ftpLIST(PFTPCONTEXT context,const char *params){if (context->Access == FTP ACCESS_NOT_LOGGED_IN)return sendstring(context,error530);
}
int ftpPASS(PFCONTEXT context,const char *params){...if (strcasecmp(temptext,"admin")==0){context->Access = FTP_ACCESS_FULL;}
}
Q2:How to track states?
- Step1:Recognize State Variables(varialbes shared by different user actions)
step 1.1:recognize user actions 识别状态变量
- interaces that could be accessed by users
step 1.2:recognize variables accessed by actions
- read/write variables
step 1.3:intersection of actions’ variable
- read by one action,and write by the other action
- Example:the Maze game
variables read by action ‘w’:LVMap[‘w’]={y}
variables written by action ‘s’:SVMap[‘s’]={y}
State variable set V=V U (LVMap[‘w’] 交 SVMap[‘s’])
while(true){ox=x; oy=y;switch(input[i]) {case: 'W': y--;break;case: 'S': y+=;break;case: 'A': x--;break;case: 'D': x+=;break;}if (maze[y][x]=='#'){Bug();}//If target is blocked,do not advance.if (maze[y][x] != ' '){x = ox; y =oy;}
}
- Step2:Calculate and track states(a combination of all state variables)
how?
Recall:How does AFL track code coverage?
- coverage = combinations of code blocks
- But number of combinations is too large.
Instution:state coverage = combinations of state-variables’ values.
Analyze the value ranges of each state-variable
- e.g. (MIN,0],[0,4],(4,10],(10.MAX))
跟踪变量的值域范围,而不是跟踪某一个值.
We identify value ranges by solving constrains of condition statements.
But the value set of each state-variables is too large,which causes edge explosion.
通过判断变量是否影响相同的程序控制流,对变量进行组合.
The combination of two relevant state-variables values.
Both variables affect the same control-flow path or memory accessing.
if (x<0)...
else if(x<=4)...
else ...
Q3:How to explore program sates?
遗传算法,使用代码覆盖率作为反馈Check Feedback.我们将状态变量的值域也作为遗传算法的指标.
-
Based on existing genetic algorithm
which relies only on code coverage feedback currently
- Our solution: 3-dimension feedback machanism
-
A test case is interesting,if it
discovers new code
discovers new value ranges of state variables
discover new extremum values of state variables
StateFuzz:Implementation
1.Kernel Source code -> Program State Recognition(Static Analysis静态分析->State-variable List状态变量集合->Static Symbolic Execution静态符号执行->提取约束条件State-Variable Value Ranges)
2.Instrumentation(State-variable Tracking Instrumentation &Code Coverage Instrumentation->Instrumented Kernel内核插桩)
3.Fuzzing Loop(根据代码插桩情况选择如何保留种子Seed Preservation -> Seed Selection ->Mutation)
具体实现细节
-
State Recognition
DIFUZE(for program action recognition)
CRIX(for building call graph)
Clang Static Analyzer(for static symbolic execution) -
Instrumentation
LLVM Sancov
SVF -
Fuzzing loop
Syzkaller
相关文章:
[清华大学]漏洞挖掘之状态敏感的模糊测试StateFuzz
Dr.赵博栋 Prof.张超 清华大学 网络研究院 INSC 本文主要介绍了通过State Fuzz对Linux驱动程序进行模糊测试,该Fuzz方法由赵博栋博士在InForSec会议上分享,并在USENIX Security上发布.StateFuzz :System Call-Based State-Aware Linux Driver Fuzzing.该…...
嵌入式养成计划-40----C++菱形继承--虚继承--多态--模板--异常
九十四、菱形继承 94.1 概念 菱形继承又称为钻石继承,是由公共基类派生出多个中间子类,又由中间子类共同派生出汇聚子类,汇聚子类会得到多份中间子类从公共基类继承下来的数据成员,会造成空间浪费,没有必要。 所以存…...
C++入门指南:类和对象总结友元类笔记(下)
C入门指南:类和对象总结友元类笔记(下) 一、深度剖析构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit关键字 二、static成员2.1 概念2.2 特性 三、友元3.1 友元函数3.2 友元类 四、 内部类4.1 概念4.2 特征 五、拷贝对象时的一些编译器优化六、深…...
ctfshow web入门 php特性 web136-web140
1.web136 还有一种写文件的命令时tee命令 payload: : ls /|tee 1 访问1下载查看文件1发现根目录下有flag cat /f149_15_h3r3|tee 2 访问下载查看文件22.web137 call_user_func <?php class myclass {static function say_hello(){echo "He…...
sshpass传输文件提示Host key verification failed.
1. sshpass功能简述 sshpass指令可用于A服务器向B服务器传输文件或执行某些指令。 2. 传输文件指令 基本传输命令:sshpass -p 远程服务器登录密码 scp 本地路径文件 远程服务器登录用户名远程服务器IP地址:远程服务器文件保存路径 示例: sshpass -p 1…...
Maven系列第5篇:私服详解
maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能。 这是maven系列第5篇。 整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部有maven完整系列的连接。 环境 maven3.6.1 …...
深入解析Spring Cloud Gateway的GlobalFilter
文章目录 摘要引言GlobalFilter的作用使用GlobalFilter默认的GlobalFilter自定义GlobalFilter 示例代码配置GlobalFilter配置文件方式代码方式 高级用法:重写GlobalFilter思路代码实现 结论参考文献 摘要 本文将详细介绍Spring Cloud Gateway中的GlobalFilter&…...
ffmpeg的重采样计算
最近在看ffmpeg的重采样计算逻辑,有一句话没大看懂 dst_nb_samples av_rescale_rnd(swr_get_delay(swr_ctx, src_rate) src_nb_samples, dst_rate, src_rate, AV_ROUND_UP); ,各种请教之后,记录如下。 重采样后的总样本数 为什么要涵盖重采…...
Go HTTP 调用(上)
哈喽大家好,我是陈明勇,今天分享的内容是 Go HTTP 调用。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出&am…...
STM32Cube高效开发教程<基础篇>(一)----概述
声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。 本专栏博客参考《STM32Cube高效开发教程(基础篇)》,有意向的读者可以购买正版书籍辅助学习,本书籍由王维波老师、鄢志丹老师、王钊老师倾力打造,书籍内容干货满满。 一、 STM32系列…...
汽车RNC主动降噪算法DSP C程序实现
汽车RNC主动降噪算法C程序 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,车载...
Java21虚拟线程完整用法
方式1 Thread.startVirtualThread(new Task());方式2 Thread virtualThread Thread.ofVirtual().name("Virtual Thread").unstarted(new Task()); virtualThread.start();方式3 Thread.ofVirtual().name("Virtual Thread").start(new Task());方式4 Th…...
Vue 中的 nextTick 方法
nextTick的背景 Vue 使用虚拟 DOM(Virtual DOM)和异步更新策略来实现高效的视图更新。当你修改 Vue 实例的数据时,Vue 并不会立即更新真实的 DOM,而是将更新操作加入到队列中,在下一个事件循环周期(微任务…...
TypeScript React(上)
目录 扩展学习资料 TypeScript设计原则 TypeScript基础 语法基础 变量声明 JavaScript声明变量 TypeScript声明变量 示例 接口 (标准类型-Interface) 类型别名-Type 接口 VS 类型别名 类型断言:欺骗TS,肯定数据符合结构 泛型、<大写字母> 扩展学习…...
Linux 安全 - LSM源码分析
文章目录 前言一、简介1.1 DAC 和 MAC1.2 LSM 调用流程图 二、LSM相关数据结构2.1 struct security_hook_list2.2 union security_list_options2.3 structure security_hook_heads 三、security_bprm_check四、LSM 源码分析3.1 early_security_init3.2 security_init3.2.1 secu…...
第一次汇报相关问题
深度学习现在已经学习到了Mini-Batch,early-stop等针对特定场景优化的算法了。 代码已经实现了一个L层的神经网络的构建了 论文看了一些综述 主要思考的两个方向:云计算和嵌入式 云计算:分布式机器学习、联邦学习、服务器负载均衡等 嵌入式&…...
[产品体验] GPT4识图功能
[产品体验] GPT4识图功能 图片配文字超强的OCR能力知识问答多图解释 打开chatgpt的时候突然发现能用识图了,赶紧去体验一下,大大的震撼… 图片配文字 超强的OCR能力 我传上去的图片并不清晰… 还能准确识别,orz ! 知识问答 多…...
《3D 数学基础》几何检测-最近点
目录 1. 直线上的最近点 2. 射线上的最近点 3. 点到平面的距离 4. 圆或球上的最近点 5. AABB上的最近点 1. 直线上的最近点 q是距离q的最近点,也就是q在直线上的投影。 其中p是直线上的点(向量表示),n是直线的法向量&#x…...
动态规划 -背包问题-详解
问题 注:大佬对此类问题的解法:动态规划背包问题总结 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 示例 1ÿ…...
Bootstrap-- 媒体特性
最大、最小宽度例子: 横屏与竖屏例子: 宽度比与像素比例子:...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
shell脚本质数判断
shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数)shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数) 思路: 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...
【Java】Ajax 技术详解
文章目录 1. Filter 过滤器1.1 Filter 概述1.2 Filter 快速入门开发步骤:1.3 Filter 执行流程1.4 Filter 拦截路径配置1.5 过滤器链2. Listener 监听器2.1 Listener 概述2.2 ServletContextListener3. Ajax 技术3.1 Ajax 概述3.2 Ajax 快速入门服务端实现:客户端实现:4. Axi…...
