01 · 成分识别与CVE关联(固件SCA)
固件本质上是大量开源与商用组件的静态聚合:BusyBox、OpenSSL、Dropbear、Samba、miniupnpd、curl、Web服务器(GoAhead/lighttpd等)几乎出现在每一台设备中。成分识别是固件SCA(Software Composition Analysis)的第一步。
1.1 版本识别方法
- 显式版本信号:
/etc/version、/etc/openwrt_release、二进制内版本字符串(如"OpenSSL 1.0.2k")、构建路径残留(Buildroot/Yocto输出路径包含组件版本)。 - 无显式信号时:以二进制哈希与符号表比对已知版本样本库;FACT等框架内置"已知版本比对"能力。
- Backport陷阱:厂商常将漏洞补丁反向移植到旧版本号(安全修复但不升级版本字符串),直接以版本号匹配CVE会造成大量误报;缓解方法是结合补丁特征(函数级比对、CVE对应commit的代码指纹)二次确认——这是固件SCA区别于容器SCA的核心难点。
| 高频组件 | 常见固件角色 | 典型历史风险 |
|---|---|---|
| BusyBox | 嵌入式命令工具集(含ash、httpd、telnetd) | 历史版本存在shell逃逸与命令注入问题;其自带mini httpd与telnetd是暴露面 |
| OpenSSL | TLS通信 | 心脏滴血(CVE-2014-0160)等历史高危漏洞;老版本(1.0.1/1.0.2)在长尾固件中持续存在 |
| Dropbear | 嵌入式SSH服务 | 历史版本存在认证绕过与信息泄露类漏洞 |
| miniupnpd | UPnP端口映射服务 | 多次曝出远程代码执行与SSDP伪造类漏洞,是UPnP攻击面的核心组件 |
| GoAhead/boa/thttpd | 管理Web界面 | 轻量化实现中的溢出、路径穿越、认证绕过历史问题密集 |
| TR-069 (CWMP) 客户端 | 运营商远程管理 | 管理通道本身为攻击面,历史漏洞与配置错误并存 |
02 · 硬编码口令与凭证挖掘
硬编码口令是固件中产出最高、验证最快的发现类别。OWASP IoT Top 10将"Weak, Guessable, or Hardcoded Passwords"列为首位风险类别(I1),Mirai的62组默认口令即是此风险在僵尸网络层面的规模化变现。
2.1 口令与哈希的存放位置
- /etc/passwd 与 /etc/shadow:root账户哈希是首要目标;哈希格式识别:
$1$(MD5-crypt)、$5$/$6$(SHA-256/512-crypt)、DES(13字符)。John the Ripper与Hashcat(含规则字典与掩码模式)是标准破解工具;消费级设备常见弱口令模式(admin/admin、root/12345、型号名+年份)。 - Web服务配置:htdigest/htpasswd文件、Web服务器配置中的realm与账户、硬编码于httpd二进制中的"出厂账户"。
- 应用层写死账户:管理CGI二进制中硬编码的调试账户/后门口令(真实案例见第7页D-Link后门档案)。
- 云平台凭证:固件中硬编码的云API密钥(格式可识别,如AWS Access Key ID的AKIA前缀),可直接导致云侧资源被冒用。
2.2 批量挖掘方法
# 高价值字符串模式批量提取(示例模式,按规则库维护) strings -n 6 rootfs.bin | grep -iE 'pass(wd|word)?|secret|token|apikey' | sort -u # 哈希快速识别与字典爆破(示例) hashcat -m 1800 shadow.root /usr/share/wordlists/rockyou.txt -r rules/best64.rule # YARA规则库批量扫描固件树(口令/密钥模式库见本课题交付物) yara -r iot_secrets_rules.yar extracted_rootfs/
验证纪律:静态挖掘出的口令/哈希必须标注精确来源(文件路径+偏移+上下文),并在自有设备上验证有效性后再写入报告;对无法实物验证的样本,报告措辞应为"疑似有效凭证"并给出验证所需的最小条件。
03 · 密钥、证书与云凭证
3.1 全局共享TLS私钥问题
多个厂商曾在固件中为同一型号(甚至跨型号)的所有设备内置同一TLS服务器私钥。后果是灾难性的:分析者提取一份固件即获得冒充任意同型设备TLS身份的能力,可实施中间人攻击。检测方法:从固件提取证书+私钥,与同型号其他设备比对;Shodan等网络空间测绘可对"证书指纹在数千设备上重复"进行规模化验证。治理要求:一机一证(或至少按批次轮换),私钥生成于设备端安全环境。
3.2 固件签名密钥与升级通道
- 签名私钥绝不应出现在固件中——若OTA签名私钥泄露(曾发生在厂商代码仓库公开事件),攻击者可签署恶意固件推送全量设备;核查重点:固件内是否存在私钥材料、证书链中是否存在自签名根、密钥是否复用。
- 升级包加密密钥硬编码使"加密升级包"形同明文,攻击者可构造任意"合法"升级包。
3.3 检测规则化
将密钥材料检测规则化:PEM/DER私钥头模式(-----BEGIN RSA PRIVATE KEY-----、PKCS#8头)、常见API密钥格式(AKIA…等)、JWT硬编码secret、证书指纹重复检测。YARA规则库+熵过滤(PEM头+高熵体)是实用组合;FACT框架内置加密材料检测插件可作交叉验证。
04 · 密码学误用模式
| 误用模式 | 固件中的典型表现 | 风险 |
|---|---|---|
| 自研"加密" | 简单XOR、固定字节翻转、自定义查表混淆配置 | 等于明文;配置中的口令、Wi-Fi密钥可被批量还原 |
| AES-ECB/固定IV | 同一密钥+固定IV加密所有配置块 | 泄露明文结构信息(相同明文→相同密文),可被选择明文分析 |
| 弱散列 | MD5/SHA1用于口令存储或完整性校验 | 口令易被字典破解;完整性校验抗碰撞性不足 |
| 可预测随机数 | 以time()或固定seed调用rand()生成会话token/挑战值 | 会话劫持、认证绕过 |
| 校验失效 | 校验和代替签名、比较函数非恒定时间、可绕过校验分支 | 恶意固件/配置注入 |
分析方法:定位加密函数(OpenSSL EVP调用、静态链接的AES S盒常量)后追踪其调用上下文——密钥来源(硬编码?NVRAM?)、IV是否随机、输出用途。对固件自带"配置备份加密"功能,可用已知明文攻击(备份同一配置两次比对密文)快速判定算法性质。
05 · 二进制静态审计
5.1 工具链
- 反汇编与反编译:Ghidra(NSA开源,支持MIPS/ARM良好)、IDA Pro、radare2/rizin、angr(符号执行与CFG分析)、retdec。
- 架构识别:ELF头e_machine字段(MIPS=8,ARM=40,x86-64=62);端序:MIPS设备大端(mips)与小端(mipsel)并存,strings默认按小端输出,对大端固件需
strings -e b或先反汇编确认。 - 危险函数扫描:cwe_checker(FKIE开源,Ghidra/IDA插件,静态检测缓冲区溢出、释放后使用、空指针解引用等CWE模式);自定义YARA规则补充厂商私有危险函数集。
5.2 CWE视角的固件高危类别
MITRE CWE Top 25(2024年榜单)中,CWE-787(界外写)、CWE-79(XSS)、CWE-89(SQL注入)、CWE-352(CSRF)、CWE-22(路径穿越)、CWE-125(界外读)、CWE-20(输入验证不当)、CWE-78(OS命令注入)位列前十。映射到固件场景:CWE-78(管理界面"网络诊断"类CGI将用户输入拼入system())与CWE-787/125(私有二进制协议解析、UPnP/SOAP处理)是IoT固件漏洞两大产出区;认证绕过类(CWE-287/306/862)紧随其后。
06 · 危险配置与后门痕迹核查
- 调试接口遗留:Telnetd/SSH默认开启且口令固化;UART产测shell遗留(第6页硬件层验证)。
- Web面危险端点:无需认证的诊断CGI、可匿名访问的配置下载/上传接口、Hidden参数触发的工厂模式。
- 测试账号与后门口令:对二进制内字符串做"开发者命名风格"聚类(如包含test/demo/debug/factory且紧邻口令模式的串),是发现后门的有效启发式——2013年D-Link固件后门(特殊User-Agent触发,详见第7页档案)正是通过此类字符串审计公开的。
- 签名与校验旁路:固件升级流程中"校验失败仅打印日志仍继续刷写"的实现缺陷。
07 · SBOM与二进制比对:backport确认的工程手段
7.1 SBOM生成与分析工具
- 生成侧:syft(Anchore开源,扫描解包后的文件系统生成SPDX/CycloneDX清单)、ScanCode Toolkit(组件与许可证识别)、ORT(OSS Review Toolkit,适配有源码的固件构建树)。
- 消费侧:将SBOM与NVD/CVE库自动关联(如Grype扫描器、OWASP Dependency-Track持续监测平台),实现"组件漏洞披露→受影响固件清单"的分钟级定位——这是Ripple20类事件应急响应的目标状态(第8页)。
7.2 二进制比对(backport确认)
对"版本号旧但疑似已backport补丁"的组件,用二进制比对确认补丁存在性,替代粗糙的版本号匹配(直接回应KQ-2):
- Diaphora(开源)与BinDiff(商业):函数级相似度比对固件内组件与官方修复/未修复版本,定位补丁函数差异。
- 确认流程:组件识别→获取官方修复commit对应二进制→比对→输出"已修复/未修复/部分backport"三级结论;结论连同证据存入案例档案(第7页五要素)。
本节参考来源(第3页)
以下均为真实可查的权威来源(学术论文、标准组织、监管机构、官方项目仓库与漏洞库),用于支撑本页事实性表述;涉统计数字均标注原始出处。
MITRE CWE Top 25 Most Dangerous Software Weaknesses(2024版):cwe.mitre.org/top25;CWE官方:cwe.mitre.org。
cwe_checker(Fraunhofer FKIE静态分析):github.com/fkie-cad/cwe_checker;FACT:github.com/fkie-cad/FACT_core。
Ghidra(NSA开源软件逆向套件):ghidra-sre.org;angr二进制分析平台:angr.io;YARA:github.com/VirusTotal/yara。
OWASP IoT Top 10(2018,I1弱口令位列首位):owasp.org/www-project-internet-of-things;IoTGoat靶场:github.com/OWASP/IoTGoat。
Hashcat:hashcat.net;John the Ripper:openwall.com/john。
NVD(组件CVE查询):nvd.nist.gov;CNVD:cnvd.org.cn。
syft(Anchore开源SBOM生成工具):github.com/anchore/syft;OWASP Dependency-Track:dependencytrack.org;Diaphora(开源二进制比对):github.com/joxeankoret/diaphora。