漏洞概述
产品型号:Xiaomi路由器BE10000 Pro 稳定版
固件版本:miwifi_rp04_firmware_85be4_1.0.70.bin
漏洞类型:授权后远程命令注入漏洞
漏洞危害:由于未对用户输入参数进行有效过滤,已授权攻击者可构造恶意请求,最终以root权限在设备上执行任意命令。
风险等级:高危
固件下载 https://miuirom.org/load?o=xiaomi-router-be10000-pro&v=1.0.70&l=en&t=router
提取文件系统
分析固件
binwalk miwifi_rp04_firmware_85be4_1.0.70.bin

在偏移 752(0x2F0) 处,识别到了一个 UBI erase count header,它是 UBI 镜像的头部信息。这意味着从这个位置开始,存放着一个 UBI 镜像。
xxd miwifi_rp04_firmware_85be4_1.0.70.bin | head -20

魔术HDR1就是小米固件头,还有下面这些可读的字符串,其中就包括了明文的版本配置啥的比如 '1.0.89' 、release
binwalk -Me miwifi_rp04_firmware_85be4_1.0.70.bin

有2F0.ubi 和ubifs-root文件夹 ,往这个文件夹翻找最后只有一个kernel目录,那么着重分析这个2F0.ubi
file 2F0.ubi

说明是完整有效的UBI镜像
UBI 镜像由等大的 PEB 组成,每个 PEB 开头是 EC header(魔数 UBI#)。观察所有 UBI#的位置,间距就是 PEB 大小
strings -t x 2F0.ubi | grep "UBI#" | head -5

那么他们的间距就是0x2000 = 2x16x16x16x16=131072/1024=128,知道了PEB=128KB,用ubireader 导出卷
ubireader_extract_images 是 ubireader 工具集中的一个命令行工具,专门用于从 UBI 镜像中提取出所有的 UBI 卷
ubireader_extract_images -o images 2F0.ubi

提取出俩个卷,但是经过解压都解不出来,换另一种方法,用内核挂载,但是也失败了是因为校验 CRC 不通过,我们进一步观察CRC
hexdump -C -n 64 2F0.ubi

第 60-63 字节的 CRC32 值是 0a a4 93 6e
再使用crc32验证下
head -c 60 2F0.ubi > 1.bin && crc32 1.bin

0a a4 93 6e ≠ f55b6c91 → CRC 校验不匹配
CRC修复
厂商在生成固件时,使用了非标准的打包流程或对UBI头部进行了后处理,导致头部的CRC32校验值没有根据头部内容重新计算,与标准UBI镜像规范不符。
接下来就是修复CRC,脚本如下,整个过程就是取出每个 UBI PEB 的 EC Header 前 60 字节,用 CRC32 重算,然后把结果覆盖回后 4 字节(第 60-63 字节)
import struct, zlib
data = bytearray(open('2F0.ubi','rb').read())
PEB = 131072
for peb_off in range(0, len(data), PEB):
ec = data[peb_off:peb_off+64]
if ec[:4] == b'UBI#': # 是 EC header
vid_off = struct.unpack('>I', ec[16:20])[0]
ec[60:64] = struct.pack('>I', zlib.crc32(ec[:60]) & 0xffffffff)
vid = data[peb_off+vid_off:peb_off+vid_off+64]
if vid[:4] == b'UBI!': # 是 VID header
vid[60:64] = struct.pack('>I', zlib.crc32(vid[:60]) & 0xffffffff)
open('2F0_fixed.ubi','wb').write(data)
python fix.py

尝试提取
nandsim 模拟 NAND 芯片
sudo modprobe nandsim id_bytes=0x2c,0xda,0x00,0x15
#加载 nandsim 模拟 NAND 芯片(ID 决定参数:256MB, 2048页, 64 OOB, 128KB擦除块)

#将修复后的 UBI 镜像对齐到 PEB 边界(128KB 的整数倍)
truncate -s %131072 2F0_fixed.ubi
#写入模拟 NAND(bs=4096 对齐到页)
sudo dd if=2F0_fixed.ubi of=/dev/mtd0 bs=4096 status=progress
sync
#附加 UBI 设备
sudo ubiattach -O 2048 -m 0 -d 0 /dev/ubi_ctrl
#查看卷信息
sudo ubinfo -a

接下尝试UBIFS挂载rootfs 卷
sudo mount -t ubifs ubi0:ubi_rootfs /mnt/xiaomi-rootfs
