GL-Inet GL-AXT1800旅行路由器OTA更新降级漏洞深度解析

本文详细分析了GL-Inet GL-AXT1800旅行路由器固件OTA更新机制中因SSL证书验证缺失而存在的安全漏洞。该漏洞允许攻击者通过中间人攻击强制用户降级至存在已知漏洞的旧版本固件,为后续攻击创造条件。

TALOS-2025-2230 || Cisco Talos情报集团 - 综合威胁情报

Talos漏洞报告 TALOS-2025-2230 GL-Inet GL-AXT1800 OTA更新固件降级漏洞 2025年11月24日

CVE编号 CVE-2025-44018

概要 GL-Inet GL-AXT1800 4.7.0版本的OTA更新功能中存在一个固件降级漏洞。一个特制的.tar文件可导致固件降级。攻击者可通过中间人攻击来触发此漏洞。

确认受影响的版本 以下版本经过Talos测试或验证为易受攻击,或已由供应商确认。 GL-Inet GL-AXT1800 4.7.0

产品链接 GL-AXT1800 - https://www.gl-inet.com/products/gl-axt1800/

CVSSv3评分 8.3 - CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:H/I:H/A:H

CWE CWE-295 - 证书验证不当

详情 GL-Inet Slate AX (GL-AXT1800) 是一款口袋大小的旅行路由器,具备千兆速度和Wi-Fi 6功能。该设备开箱即用多种VPN和远程连接工具,是寻求移动安全的用户的极受欢迎解决方案,也是亚马逊等在线零售商中最受欢迎的旅行路由器之一。

当用户登录GL-Inet Slate AX旅行路由器的网络管理界面时,新登录的用户有时会收到设备升级提示,这取决于是否有可用升级以及设备版本。无论如何,在检查实际的升级网页时,设备会通过向 https://fw.gl-inet.com/firmware/<model_name>/release/list-sha256.txt 发起HTTPS请求来检查GL-Inet是否有可用升级。

对于Slate AX设备,该列表内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# https://fw.gl-inet.com/firmware/axt1800/release/list-sha256.txt
4.6.11  openwrt-axt1800-4.6.11-1216-1734278520.tar      fc9bf38d930e7281287b89525dda4c790be093e7adaba3b44316ed2e73150b98      47063920
4.6.8   openwrt-axt1800-4.6.8-1017-1729172935.tar       eb11db2e26490e70ec3a9908a11880b104f043a28f84c9973039a85713ca7eae      46900718
4.6.4   openwrt-axt1800-4.6.4-0905-1725497901.tar       f5912ed8f1add984cc1a6226f43fd52402821216ee36536313ae61f798a6e810      47077372
4.6.2   openwrt-axt1800-4.6.2-0709-1720529672.tar       a3766797f96c0982bb0f9673be02f9cac640524d2e737019bf6c7865d7c37d9a      46965331
4.5.16  openwrt-axt1800-4.5.16-0321-1711033518.tar      96d2631ec6f271949c1ac179ff972fb5f77c0e0b2a2f910709134114d7d2fdcf      48816496
4.5.0   openwrt-axt1800-4.5.0-0123-1706015685.tar       dd59b3e6b4e8e5b5bdf56266152ea847433bb11a60dbced77c68780610b37105      47507619
4.4.6   openwrt-axt1800-4.4.6-0908-1694157838.tar       32e32e90a68003b722d23b6955cb2a678445d188f47a5de926860e3e3f080487      59404146
4.2.3   openwrt-axt1800-4.2.3-0706-1688630948.tar       4911ff9688ba170cb8f3d6d0d16d869bae857581820fbf9bcbb9c5ba02119569      59373801
4.2.1   openwrt-axt1800-4.2.1-0414-1681482936.tar       4d50428028b63b35dbc039d0069c56a57ec8747380e9ae9cc4cd57bfa874c7a4      59373123
4.1.0   openwrt-axt1800-4.1.0-1116-1668588068.tar       d152cddffee821355613ba6a0db074d9b686f128e7ef6a5d65a1952e1942b655      51961046
4.0.3   openwrt-axt1800-4.0.3-0831.tar  95371806941e6b6eecfc447db41414e741b70c217027ca129f752853ab9d4b32     49592938

假设上述列表中存在版本号大于设备当前版本(即第一列)的条目,则设备会继续执行升级流程,该流程主要由 /usr/lib/oui-httpd/rpc/upgrade/usr/bin/one_click_upgrade 脚本处理。在 /usr/lib/oui-httpd/rpc/upgrade Lua脚本中,会对上述字段进行各种清理,以防止命令注入并验证升级文件大小。接着,路由器会获取 https://fw.gl-inet.com/firmware/<model>/release/metadata_<version> 来收集显示给用户的元数据,以便用户决定是否实际升级。URL和响应的示例如下:

1
https://fw.gl-inet.com/firmware/axt1800/release/metadata_4.6.11

收集元数据后,升级Lua脚本会调用 /usr/bin/one_click_upgrade,如下所示:

1
local cmd = (string.format)("/usr/bin/one_click_upgrade \'%s\' \'%s\' \'%s\' \'%s\' \'%s\' \'%s\' \'%d\' &", firmware_url, sha256, keep_config and "1" or "0", keep_package and "1" or "0", use_mirror_dl and "1" or "0", id or "", cloud_size or Unknown_Type_Error)

值得注意的是,firmware_url 字段是通过将固件URL与从 list-sha256.txt 信息中选择的升级文件名拼接而成的,因此下载的固件文件名示例如下:https://fw.gl-inet.com/firmware/a1300/release/openwrt-a1300-4.4.6-0908-1694153586.tar

继续深入 one_click_upgrade 脚本,我们可以看到设备实际下载固件的位置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
if [ "$use_mirror_dl" = 1 ]; then
    /usr/bin/mirror_downloader $firmware_path
    while [ "$firmware_sha256sum" != "$(sha256sum /tmp/firmware.img |awk '{print $1}')" ]; do
        /usr/bin/mirror_downloader $firmware_path
        sleep 5
    done
else
    firmware_name=$(basename "$firmware_path")
    curl -C - -Ls --connect-timeout 5 $firmware_path -o /tmp/firmware.img >> /dev/null // [1]
fi

如[1]处所示,这里并没有异常之处。我们展示这行代码是为了与 /usr/lib/oui-httpd/rpc/upgrade Lua脚本通过 fetch_firmware_info 函数获取 list-sha256.txtmetadata_<version> 文件的方式进行对比:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
local fetch_firmware_info = function(url)
  -- function num : 0_4 , upvalues : http
  local httpc = (http.new)()
  httpc:set_timeout(Unknown_Type_Error)
  local res, err = httpc:request_uri(url, {ssl_verify = false}) // [2]
  if not res then
    return nil, err
  end
  httpc:close()
  if res.status ~= Unknown_Type_Error then
    return nil, "status: " .. res.status
  end
  local body = res.body
  if not body then
    return nil, "no response data"
  end
  local name, sha256, size = body:match("^%S+%s+(%S+)%s+(%x+)%s+(%S+)")
  if not name or not sha256 or not size then
    return nil, "invalid response"
  end
  return name, sha256, size
end

尽管这些请求正确地发送到 https://* 站点以防止中间人攻击,但我们清楚地看到在[2]处,ssl_verify 选项被关闭了,这引入了不必要的攻击面。奇怪的是,在GL-Inet代码的最早版本中,此功能是由正确开启SSL验证的shell脚本处理的,但在切换到Lua时出现了回归。

无论如何,我们面临的情况是,固件升级信息可以被拦截和修改,但实际下载的固件必须是有效的。由于早期版本中发现的其他漏洞进行了各种输入检查和固件信息验证,我们无法立即通过某种命令注入获得远程代码执行。

然而,仍然存在利用的可能,因为我们可以简单地诱骗用户将设备降级到易受攻击的版本。如果我们修改 sha256-list.txt 响应,使其看起来像这样:

1
2
3
4
5
6
7
5.1.1  openwrt-axt1800-4.4.6-0908-1694157838.tar       32e32e90a68003b722d23b6955cb2a678445d188f47a5de926860e3e3f080487      59404146 // [3]
4.6.11  openwrt-axt1800-4.6.11-1216-1734278520.tar      fc9bf38d930e7281287b89525dda4c790be093e7adaba3b44316ed2e73150b98      47063920
4.6.8   openwrt-axt1800-4.6.8-1017-1729172935.tar       eb11db2e26490e70ec3a9908a11880b104f043a28f84c9973039a85713ca7eae      46900718
4.6.4   openwrt-axt1800-4.6.4-0905-1725497901.tar       f5912ed8f1add984cc1a6226f43fd52402821216ee36536313ae61f798a6e810      47077372
4.6.2   openwrt-axt1800-4.6.2-0709-1720529672.tar       a3766797f96c0982bb0f9673be02f9cac640524d2e737019bf6c7865d7c37d9a      46965331
4.5.16  openwrt-axt1800-4.5.16-0321-1711033518.tar      96d2631ec6f271949c1ac179ff972fb5f77c0e0b2a2f910709134114d7d2fdcf      48816496
4.5.0   openwrt-axt1800-4.5.0-0123-1706015685.tar       dd59b3e6b4e8e5b5bdf56266152ea847433bb11a60dbced77c68780610b37105      47507619

我们可以在列表中添加一个旧版本的固件,但在第一列[5]赋予其更高的版本号,这样设备就会为升级选择易受攻击的固件版本(openwrt-axt1800-4.4.6-0908-1694157838.tar)。我们还可以利用对元数据文件(在本例中是 https://fw.gl-inet.com/firmware/axt1800/release/metadata_5.1.1)的中间人攻击,使升级弹窗显示完全虚假的信息,例如更新的版本、发布日期、补丁说明等。在升级过程中,用户无法看到他们实际“升级”到的固件版本更旧,至少在用户升级后登录之前无法察觉,但那时为时已晚。例如,攻击者可以强制设备降级到版本4.4.6,然后在下次升级时,攻击者可以利用WAN侧的CVE-2023-50445在路由器上执行任意代码。

时间线

  • 2025年8月11日 - 初次联系供应商
  • 2025年8月11日 - 向供应商披露
  • 2025年9月4日 - 供应商发布补丁
  • 2025年11月24日 - 公开发布

致谢 由思科Talos的 Lilith >_> 发现。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计