一、固件安全概述
IoT与嵌入式固件安全现状
说实话,这几年IoT设备爆发式增长,安全问题也跟着炸了。我2018年第一次接触固件逆向时,市面上能用的工具还屈指可数。现在呢?随便一个智能灯泡、路由器、摄像头,里面都可能藏着致命漏洞。
为什么会这样?说白了,三个原因:
- 成本优先——厂商拼命压缩BOM成本,安全功能第一个被砍
- 更新困难——很多设备出厂后就没法OTA,漏洞修不了
- 安全意识薄弱——我见过某大厂的路由器固件,硬编码密码直接写在init脚本里
你看下面这张图,基本能概括当前固件安全的整体格局:
我个人习惯把固件安全分成三个层面:芯片级、系统级、应用级。芯片级涉及JTAG/SWD调试接口、安全启动链;系统级关注内核、文件系统、权限管理;应用级就是各种网络服务、Web接口、移动端配套App。
关键数据:根据我跟踪的CVE数据,2023年嵌入式固件相关漏洞同比增长了47%。其中路由器、IP摄像头、智能家居网关是重灾区。
常见固件漏洞类型
1. 缓冲区溢出
这玩意儿在固件里太常见了。嵌入式设备资源有限,很多开发者图省事直接用strcpy、sprintf这类危险函数。我在分析某款家用路由器时,就发现它的HTTP解析模块存在典型的栈溢出——一个超长的User-Agent字符串就能触发。
// 典型的有漏洞代码
void handle_request(char *user_agent) {
char buf[64];
strcpy(buf, user_agent); // 没有长度检查!
// ... 处理逻辑
}
避坑指南:我曾经在分析一个工控设备固件时,花了三天没找到溢出点。后来才发现,漏洞不在主程序里,而在一个被忽略的第三方库中。所以,分析固件时别只盯着主二进制,所有.so、.a文件都得过一遍。
2. 命令注入
嵌入式设备里,很多功能都是通过调用系统命令实现的。比如设置WiFi、重启服务、更新固件。如果输入过滤不严,攻击者就能注入恶意命令。
// 有漏洞的固件代码片段
void set_wifi_ssid(char *ssid) {
char cmd[256];
sprintf(cmd, "iwconfig wlan0 essid %s", ssid);
system(cmd); // 如果ssid包含 "; rm -rf /" 就完蛋了
}
你想想看,一个智能灯泡如果存在命令注入,攻击者能干什么?不仅能控制灯泡,还能用它当跳板攻击内网其他设备。我在一次渗透测试中,就通过一个智能插头的命令注入漏洞,拿下了整个智能家居网络。
3. 硬编码后门
这个最让人头疼。厂商为了方便调试或远程维护,经常在固件里留下后门账号。更离谱的是,有些后门密码直接明文写在脚本里。
| 设备类型 | 后门账号 | 密码 | 发现方式 |
|---|---|---|---|
| 某品牌路由器 | root | admin123 | strings分析固件 |
| 某IP摄像头 | debug | 888888 | 反编译Web服务 |
| 某智能网关 | super | super@2020 | 分析配置文件 |
个人经验:找硬编码后门,我一般先用strings命令扫一遍固件,重点关注"password"、"passwd"、"secret"、"key"这些关键词。然后配合binwalk解包,在文件系统里搜配置文件。嗯,这招基本能覆盖80%的后门。
固件分析流程概览
做固件安全分析,我总结了一套标准流程。这套流程我用了好几年,踩过不少坑,现在分享给你:
- 固件获取——从官网下载、从设备Flash读取、或者从OTA包中提取
- 固件识别——用file、binwalk识别架构、文件系统类型、压缩方式
- 固件解包——binwalk -e、unsquashfs、jefferson等工具解压文件系统
- 静态分析——strings、Ghidra、IDA Pro分析关键二进制
- 动态调试——avatar2 + angr联合调试,模拟执行固件
- 漏洞挖掘——fuzzing、污点分析、符号执行找漏洞
- 漏洞利用——编写exploit,验证漏洞可利用性
- 报告输出——整理漏洞详情、影响范围、修复建议
这里面,第5步「动态调试」是很多人的瓶颈。为什么?因为嵌入式设备硬件环境千差万别,你不可能每分析一个固件就买一台实体设备。这时候avatar2 + angr就派上用场了——它们能模拟硬件环境,让你在PC上直接调试固件。
核心观点:我个人认为,固件安全分析的核心能力就两个——逆向工程能力和动态调试能力。前者让你看懂代码,后者让你验证漏洞。缺一不可。
好了,这一章我们聊了固件安全的现状、常见漏洞类型、以及分析流程。这些是后续所有章节的基础。下一章,我会带你搭建avatar2 + angr的联合调试环境,手把手教你配置QEMU模拟器、安装angr、打通avatar2的通信链路。到时候,你就能在自己的电脑上调试那些原本需要实体设备的固件了。
公众号:蓝海资料掘金营,微信deep3321