0x00 前言
PS: 本笔记来自张超教授的现场talk总结
漏洞攻击 –> 漏洞
漏洞防御 –> 补丁
漏洞攻防路线:
机器辅助人来挖(CTF, 主要依靠个人能力) –> 自动攻防(人的经验规则为主,启发探索为辅,无法攻防博弈) –> 智能攻防(智能为主,规则经验为辅)
0x01 攻防实践
CTF的历史…
国外的战队很多自动化辅助工具,bulabula…
0x02 漏洞挖掘
漏洞挖掘
- 静态分析(在源代码上做规则匹配,这种误报高)
- 动态分析(只能分析部分,漏报很高)
- 符号执行(实际中会有很多约束,可扩展性差)
fuzzing 模糊测试
随机输入,程序出现问题就认为可能存在漏洞
难点:从无穷的输入空间,找到有效的输入(可以触发漏洞)
2013年之后,AFL出现,帮助发现了80%的漏洞,AFL的关键是引入了遗传算法(好的种子就会被留下,然后基于其变异)。
主流的研究:使用指标指导种子的变异;将AFL应用具体的场景,比如IoT。
他们的研究:CallAFL、Greyone、MOpt、FANS
- 漏洞挖掘(总结)
深度
测试例格式提取
控制流敏感制导
数据流敏感制导
种子选择策略调度
种子变异策略调度
值空间覆盖率跟踪
状态空间覆盖率跟踪广度
Linux内核、 驱动、开源/二进制程序
Windows/macOS内核、应用程序
区块链、智能合约
ARM芯片、物联网设备
浏览器(chrome等)
网络协议(多交互程序)
Race漏洞
0x03 漏洞缓解/防护/防利用
0x04 漏洞利用
自动漏洞利用
2013年总结的在AEG方向的十一个难点
目前相关的技术已经提出了很久,但是在做AEG的时候相关的基础设施比较匮乏
TAICHI => 约束? 还有提升空间?
0x05 智能攻防
机器擅长:
挖掘底层漏洞
对简单混淆机制免疫
快速部署防御机制
机器不擅长的:
编写漏洞利用脚本
挖掘高层漏洞
基于启发式的分析
人类的特殊手段:
抄袭对手的补丁
补丁中放后门
重构对手的攻击流量
AI 技术尚未应用!!!
目前是将攻防的具体的一个环节拆分出来,然后选择一个AI适合的环节,与AI结合去做研究。
未知漏洞的智能攻防 <--> 已知漏洞的智能渗透-->
0x06 总结
0x07 Q&A
目前好用的工具?
SVF 静态分析工具
DFT 动态分析工具 - 污点跟踪
angr 符号执行 -> libc的库函数都是模拟的不准确
S2E 符号执行漏洞挖掘评价问题?
CVE 是一个侧面,目前最想看到的是在相同数据集上的不同表现
benchmark 没有统一,所以能测的就都测一下
fuzzing都说自己的策略好,属于无穷空间探索问题,并不能说所有情况下该策略都能比别人好,所以就需要实验支撑。但是实验是有随机性的。请求建议一下,在程序分析中培养自己的能力?
程序分析基本已经进入到了瓶颈期,想做大突破就比较难。(也就是静态分析技术,目前很多采用AI技术应用到静态分析上的,所以要改进的话可以从AI角度入手)。建议入门还是先熟悉目前的经典解决方案。数据充分的情况下,机器学习的效果可能比人提出的规则要好一些。未来Driller这种模糊测试的情况的发展?
符号执行虽然在学术界上价值高,热度也不低,但是在很多情况下应用不起来,比如在chrome的测试上。所以目前该组还是在改进fuzz本身上。前面提到的arm上的防护研究?
在RISC-V上做了验证。敏感数据的特点->不应该被任何人修改,应该是只读的。如果敏感数据是从可修改区来的,那么就会出现问题。所以从硬件上限制了敏感数据的来源,如果不是来自只读区就限制。
arm pic理论上是可以绕过的,mte和pic相结合实现新的防护方法。
在硬件上做地址空间隔离,同进程内的隔离,因为有些是可控的有些是不可控的。接下来的fuzzing应该更关注什么方面?
目前更多的关注的是fuzzing在复杂目标上的应用,比如协议、驱动。协议的状态信息的自动化提取。驱动的模糊测试。自动提取知识来引导模糊测试的进行。目前在往更实用的方面来做。