Planet WGR-500路由器formPingCmd堆栈缓冲区溢出漏洞深度分析

本文详细分析了Planet WGR-500路由器formPingCmd功能中存在的多个堆栈缓冲区溢出漏洞,包括CVE-2025-54399至CVE-2025-54402,攻击者可通过特制HTTP请求实现任意代码执行,影响版本v1.3411b190912。

TALOS-2025-2226 Planet WGR-500 formPingCmd堆栈缓冲区溢出漏洞

CVE编号

CVE-2025-54401, CVE-2025-54400, CVE-2025-54399, CVE-2025-54402

概述

Planet WGR-500 v1.3411b190912的formPingCmd功能中存在多个堆栈缓冲区溢出漏洞。通过特制的一系列HTTP请求可导致堆栈缓冲区溢出。攻击者可发送一系列HTTP请求来触发这些漏洞。

确认受影响的版本

以下版本经过Talos测试或验证为易受攻击,或已由供应商确认存在漏洞:

  • Planet WGR-500 v1.3411b190912

产品链接

WGR-500 - https://www.planet.com.tw/

CVSSv3评分

8.8 - CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

CWE

CWE-121 - 基于堆栈的缓冲区溢出

详细说明

WGR-500是一款高性能工业路由器,支持VLAN配置,配备内置防火墙,并提供一套强大的高级网络功能集。

WGR-500包含使用ping实用程序测试与其他计算机网络连接的功能。此功能在Web服务器的formPingCmd函数中实现:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
void formPingCmd(undefined4 param_1)
{
    char *submit_url;
    char* ipaddr;
    char* counts;
    [...]
    char buffer_32 [32];
    char ping_command [100];
    char buffer_260 [260];

[1] submit_url = get_from_params(param_1,"submit-url","");
[2] ipaddr = get_from_params(param_1,"ipaddr","");
[3] counts = get_from_params(param_1,"counts","");
[4] sprintf(ping_command,"ping -c %s %s 2>&1 > %s &",counts,ipaddr,"/tmp/pingResult");
[5] sprintf(buffer_260,submit_url);
[6] sprintf(buffer_32,"ipaddr=%s",ipaddr);
[7] strcat(buffer_260,buffer_32);
    [...]
    return;
}

此函数使用三个提供的参数:ipaddr、counts和submit_url,这些参数被组合以准备各种字符串:

  • 在[4]处,构造ping命令字符串:“ping -c 2>&1 > %s &”
  • 在[5]处,用submit_url字符串填充buffer_260
  • 在[6]处,用字符串"ipaddr=“填充buffer_32
  • 在[7]处,将buffer_32字符串(在[6]处填充)连接到buffer_260字符串(在[5]处填充)

formPingCmd API包含多个可通过请求参数利用的堆栈缓冲区溢出漏洞。攻击者可利用这些漏洞实现任意代码执行。以下各节详细说明每种可导致堆栈缓冲区溢出的方式。

CVE-2025-54399 - ipaddr ping字符串

在[2]处获取ipaddr请求参数。然后在[4]处使用此参数构造字符串"ping -c 2>&1 > %s &"。该字符串被写入ping_command堆栈缓冲区,其大小为100字节。然而,在sprintf操作之前未执行大小检查。攻击者可利用此缺乏大小检查的情况导致ping_command缓冲区溢出,可能实现任意代码执行。

CVE-2025-54400 - counts ping字符串

在[3]处获取counts请求参数。随后在[4]处使用此参数组合字符串"ping -c 2>&1 > %s &"。结果字符串被写入ping_command堆栈缓冲区,其大小为100字节。然而,在sprintf操作之前未执行大小检查。攻击者可利用此缺乏大小检查的情况触发ping_command缓冲区溢出,可能实现任意代码执行。

CVE-2025-54401 - submit-url

在[1]处获取submit-url请求参数。然后在[5]处将此参数复制到buffer_260缓冲区,其大小为260字节。然而,在sprintf操作之前未执行大小检查。攻击者可利用此缺乏大小检查的情况导致buffer_260缓冲区溢出,可能实现任意代码执行。

CVE-2025-54402 - submit-url和ipaddr

分别在[1]和[2]处获取submit-url和ipaddr请求参数。随后在[5]处将submit-url参数复制到buffer_260(一个260字节长度的缓冲区)。在[6]处,使用ipaddr参数组合字符串"ipaddr=",结果字符串被写入buffer_32缓冲区。最后在[7]处,将buffer_32连接到buffer_260。然而,在此strcat操作之前未执行大小检查。攻击者可利用此缺乏大小检查的情况导致buffer_260缓冲区溢出,可能实现任意代码执行。

时间线

  • 2025-07-30 - 初始供应商联系
  • 2025-08-01 - 供应商披露
  • 2025-08-01 - 供应商确认接收
  • 2025-09-01 - 状态更新请求
  • 2025-09-01 - 供应商回复
  • 2025-09-24 - 供应商回复确认,公布发布日期
  • 2025-10-07 - 公开发布

致谢

由Cisco Talos的Francesco Benvenuto发现。

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