01 · 固件获取的合法渠道与方法
固件分析的第一步是获得目标镜像。所有渠道必须满足合规前提:仅使用自有设备、厂商公开发布的固件,或获得书面授权的目标。实践中按成本与侵入性从低到高排序如下。
| 渠道 | 方法要点 | 适用场景与限制 |
|---|---|---|
| 厂商官方支持页 | D-Link、TP-Link、Tenda、Netgear等均在其支持页面公开固件下载;部分固件按地区/硬件版本(Rev)细分,须核对设备标签与固件版本号 | 成本最低、合规性最清晰;局限:仅覆盖仍提供支持的型号,EOL设备无下载 |
| 固件聚合镜像库 | Firmadyne论文构建的固件语料库、社区镜像站等;注意校验来源可信度与文件哈希 | 适合大规模批量分析与学术论文复现;须警惕被篡改样本 |
| OTA升级抓包 | 在自有设备的受控网络中,用 mitmproxy 等代理观察升级请求(升级包下载URL、请求头、签名参数);对HTTPS加密流量仅在自有设备与合法持有证书的前提下分析 | 获得与设备实际运行完全一致的固件;需处理证书固定(certificate pinning)情况 |
| 设备Web界面导出 | 部分设备管理界面提供"配置备份/导出"功能,可导出含配置的二进制包;可分析配置结构、敏感字段加密方式 | 非侵入;导出物常是"配置+固件片段"而非完整固件 |
| 存储芯片读取 | 拆机后用编程器直接读取SPI NOR/NAND/eMMC内容(见第6页硬件接口章节),可获得含 bootloader 的完整镜像 | 最完整但具侵入性,且读取内容与主控启动镜像可能存在分区差异;仅限自有/报废授权设备 |
完整性校验:获取后应立即记录来源URL、下载日期与SHA-256哈希;同一型号不同硬件版本、不同地区的固件可能差异显著,分析结论必须绑定"型号+硬件版本+固件版本"三元组,否则漏洞影响范围判定会出现严重偏差。
02 · 格式识别与魔数体系
嵌入式固件没有统一封装格式,常见结构是"多级容器+压缩"嵌套:下载文件可能是厂商私有包头,内嵌 uImage(内核)、SquashFS(根文件系统)、配置文件等多个分区。识别依赖魔数(Magic Number)扫描。
| 格式/容器 | 魔数特征 | 说明 |
|---|---|---|
| U-Boot legacy uImage | 0x27051956(大端字序) | U-Boot传统镜像头,内含压缩内核;头部含负载类型、压缩算法、CRC32等字段 |
| U-Boot FIT Image | 设备树风格文本头(/dts-v1/) | 扁平化镜像树,可含多配置与签名节点,是Secure Boot的验证对象 |
| SquashFS | hsqs(小端)/ sqsh(大端) | 只读压缩文件系统,嵌入式根文件系统绝对主流;注意MIPS设备常见大端变体 |
| JFFS2 | 0x1985(节点魔数) | NOR闪存日志文件系统,节点对齐与擦除块大小影响提取 |
| UBI/UBIFS | UBI#(EC头) | NAND闪存上层卷管理层;提取需先解UBI卷再解UBIFS |
| initramfs (cpio) | 070701(newc格式) | 内核内置初始根文件系统,常以gzip压缩形式嵌于内核镜像中 |
| Broadcom TRX | HDR0 | 博通方案常见固件容器(华硕、部分D-Link型号) |
| SEAMA / .chk | SEAMA头(D-Link部分型号)/ Netgear chk头 | 厂商私有封装,通常内含uImage+SquashFS |
| 压缩层 | gzip 1f 8b / LZMA 5d 00 00 / xz fd 37 7a 58 5a / zstd 28 b5 2f fd / LZ4 04 22 4d 18 | 固件普遍多层压缩嵌套,需逐层剥离 |
# Binwalk 递归扫描与自动解包 binwalk firmware.bin # 识别魔数与偏移 binwalk -e firmware.bin # 提取识别到的文件系统 binwalk -Me firmware.bin # 递归解包(处理多层嵌套) # 大端SquashFS(MIPS设备常见)需显式指定 unsquashfs -be squashfs-root-mips64.img # sasquash 增强版亦可 # JFFS2 与 UBI 提取 jefferson jffs2.img # JFFS2 → 目录树 ubireader_extract_images ubi.img # UBI → UBIFS 镜像 ubireader_extract_files ubi.img # UBI → 直接解出文件
常见坑位:①厂商修改魔数或魔数偏移——Binwalk扫不到不代表无文件系统,可结合熵分析(高熵区=压缩/加密数据)与字符串搜索交叉定位;②SquashFS大端/小端混淆——unsquashfs报错"Unknown file type"时优先怀疑端序;③加密固件——Bootloader或内核中硬编码AES密钥的情况真实存在(密钥与密文同固件分发),需先静态定位密钥材料再解密(第3页)。
03 · 解包工具链的标准组合
成熟的解包流水线由四类工具构成,建议以容器化方式固化(FACT等框架已内置解包流水线):
- 识别与初步提取:Binwalk(含v3 Rust重写版,ReFirm Labs维护)负责魔数扫描与自动提取;配合
binwalk --signature --term精确定位。 - 文件系统级工具:sasquash/unsquashfs(SquashFS)、jefferson(JFFS2)、ubi_reader(UBI/UBIFS)、yaffs2utils(YAFFS2)、cramfs-tools;固件修改套件firmware-mod-kit(FMK)提供解包-重建闭环,适合差分实验。
- 手工雕刻(carving):当自动提取失败时,用
dd按魔数偏移手工切分:dd if=firmware.bin of=rootfs.squashfs bs=1 skip=<offset>;配合file、熵图与hexdump确认边界。 - 校验与可重复性:每步保留中间产物与哈希,形成"原始固件→各分区→文件系统树"的证据链,保证后续静态分析结论可回溯。
04 · 嵌入式文件系统形态对比
| 文件系统 | 存储介质 | 可写性/特性 | 分析关注点 |
|---|---|---|---|
| SquashFS | SPI NOR/NAND、eMMC | 只读+压缩(gzip/lzma/xz/zstd);挂载后写操作需overlay | 解压完整文件树后全部静态分析对象都在其中;注意端序 |
| JFFS2 | NOR闪存 | 日志结构、磨损均衡、GC压缩 | 节点对齐与擦除块处理;残留数据(未GC的旧版本文件)可能泄露历史凭证 |
| UBIFS | NAND闪存(经UBI层) | 支持写平衡与坏块管理 | 先解UBI卷头(EC/VID)再解UBIFS;坏块表需正确解析 |
| ext4 | eMMC | 与桌面Linux通用 | 可用标准工具挂载分析;已删除文件可经取证手段恢复 |
| initramfs/cpio | 嵌入内核镜像 | 启动时载入内存 | binwalk对gzip嵌套层的递归提取通常能解出 |
| tmpfs/overlayfs | 内存/闪存叠加 | 运行时层 | 仅存于运行设备;佐证"固件+运行时配置"双层结构,分析时勿混淆 |
残留数据价值:日志型文件系统(JFFS2/UBIFS)在GC之前保留旧节点,镜像级分析(而非挂载提取)可能恢复出已被覆盖的历史配置文件、口令与密钥——这是纯逻辑提取容易遗漏的证据源,也是芯片级读取(第6页)的增量价值之一。
05 · 首次侦察清单(First Reconnaissance)
解包完成后,按固定清单快速建立对固件的初步认知,通常30分钟内可完成:
- 目录结构画像:识别Buildroot/Yocto/OpenWrt构建痕迹(
/etc/os-release、/etc/openwrt_release、BUILD_*字符串);确认架构(MIPS/ARM/x86)与端序(ELF头e_machine字段+反汇编验证)。 - 启动链梳理:
init程序与/etc/init.d/、rcS脚本枚举开机自启服务;记录每个守护进程的二进制路径与启动参数。 - 账户与认证:
/etc/passwd、/etc/shadow(哈希格式:DES/$1$MD5-crypt/$5$/$6$)、Web服务器配置文件(lighttpd/thttpd/mini_httpd/uhttpd/GoAhead/boa)中的认证realm与默认账户。 - 网络服务清单:对外监听端口推断(HTTP管理界面、Telnet/SSH、UPnP、ONVIF、TR-069、MQTT、私有二进制协议)。
- 敏感位置速查:
/www(Web根目录与CGI)、/etc/config、NVRAM访问库、硬编码字符串(第3页规则库批量执行)。
06 · 工程难点与对策
| 难点 | 表现 | 对策 |
|---|---|---|
| 加密固件 | 整段高熵、无 recognizable 魔数 | 静态定位Bootloader/内核中的AES密钥与IV;熵分析划定密文区间;参考公开解密工具与厂商SDK文档 |
| 非标准魔数/偏移 | Binwalk识别失败但字符串可见 | 字符串锚点+熵图人工分区;对照同方案其他厂商固件比对结构 |
| 多分区与烧录格式 | boot/kernel/rootfs/config分离,部分为烧录器格式带OOB数据 | 识别分区表(uImage头/自定义头);NAND镜像需剥离OOB与ECC |
| 厂商私有压缩/打包 | 工具无法解包 | 从同固件内的解包程序逆向算法(固件自带解包器是常见突破口) |
07 · 固件完整性校验与来源核实
- 哈希登记:下载完成即计算SHA-256并留存,与厂商发布页公布值(如有)比对;无公布值时在报告中注明"未获厂商校验值"。
- 签名校验:部分厂商与开源固件(如OpenWrt)对发布包提供GPG/签名校验通道;校验失败或签名缺失应记录为风险项(供应链完整性存疑)。
- 同型号多版本核对:固件按"型号+硬件版本(Rev)+固件版本"三元组管理;地区版本(EU/US/CN)差异常见,分析结论禁止跨版本泛化。
- 聚合镜像可信度:使用第三方固件库时抽样比对哈希,并检查文件时间线异常(早于官方发布日期的样本可能为伪造或被篡改)。
风险提示:被篡改的固件样本会污染分析结论与规则库。凡来源不可溯的样本仅可用于方法演练,不得产出漏洞结论。
本节参考来源(第2页)
以下均为真实可查的权威来源(学术论文、标准组织、监管机构、官方项目仓库与漏洞库),用于支撑本页事实性表述;涉统计数字均标注原始出处。
Binwalk官方仓库(ReFirm Labs):github.com/ReFirmLabs/binwalk;原始作者Craig Heffner的分析博客:devttys0.com。
ubi_reader(UBI/UBIFS提取):github.com/jrspruitt/ubi_reader;firmware-mod-kit:github.com/rampageX/firmware-mod-kit。
FACT(Firmware Analysis and Comparison Tool,Fraunhofer FKIE):github.com/fkie-cad/FACT_core。
SquashFS官方文档与端序说明:github.com/plougher/squashfs-tools;Linux MTD子系统文档:docs.kernel.org/mtd。
Firmadyne论文(NDSS 2016)固件语料与提取统计:ndss-symposium.org/ndss2016;项目仓库:github.com/firmadyne/firmadyne。