Fuzzing已成为用于软件测试的一种非常常见的地方技术,并被大量用于发现安全问题。有许多框架(sully、Peach Fuzzer等)适用于对大型复杂软件系统进行模糊测试。我没有找到太多关于更小、更简单的嵌入式系统(通常是那些小而简单的不能运行操作系统的嵌入式系统)的信息。
这些小型系统随处可见——RFID 读卡器、防盗报警系统、无钥匙进入系统、发动机控制单元、暖通空调控制等。它们通常具有非常有限的输入和输出(按钮、键盘、小字符显示器、LED、蜂鸣器、RF 通信)。复杂的网络(以太网、TCP/IP)、串口等很少见。
我已经成功地使用类似模糊测试的技术来发现安全问题并查看系统的行为方式。目前,这主要包括基于对真实数据包的观察,对发送到系统中的数据包的格式进行模糊测试。一些例子:
- 使用模糊测试来确定数据包的结构 - 有时您知道大致的数据包格式,但如果您只有少量真正的设备或采样传输,则 ID 位、校验和等内容并不总是确定的。
- 当数据包长于预期时发现数据包解码中的问题 - 简单的事情,例如将可变数据包长度设置为高于预期值。
- 寻找可接受传输的限制——像重传这样的事情在单向射频系统中很常见。将注册为正确传输的最小数据包数量是多少?我们可以改变多少波特率(即接收器中是否有良好的时钟恢复)。
- 寻找干扰检测的极限。在检测到干扰之前,我们可以将系统推多远?查找未记录的功能 - 例如,如果 00 是武装,01 是解除武装,10 是部分武装,那么 11 有什么作用?
我发现的最大挑战之一是检测系统状态的方法。这通常以来自 LED、LCD 总线等的输出的大杂烩告终。我一直在使用 Arduino 和类似 Arduino 的板作为输入和输出(通常是Teensy 2.0)。我还经常需要包含一种在系统崩溃时重新启动系统的方法。
令我惊讶的是,我找不到许多其他人在该领域进行工作或研究。我主要是在我进行的过程中编造的。
所以,问题是:
- 有没有沿着这些路线的资源?
- 任何复杂的模糊测试框架都可以用于此应用程序吗?
(顺便说一句,我不认为这是谷歌的失败。类似的概念包括“故障”和“故障注入”,但我相信这是不同的)
我看过这个培训:https : //www.blackhat.com/us-13/training/peach-fuzzer-embedded-edition.html