
Эксплойт доказательства концепции для CVE-2026-10672, чтение за пределами буфера в Zephyr RTOS клиенте извлечения обновления прошивки LwM2M. Включает автономную C-реализацию и вредоносный сервер CoAP/LwM2M для тестирования.
Доказательство концепции для CVE-2026-10672, чтения за пределами буфера в клиенте получения обновления прошивки LwM2M Zephyr RTOS (subsys/net/lib/lwm2m/lwm2m_pull_context.c).
lwm2m_pull_context_start_transfer() в lwm2m_pull_context.cmemcpy(context.uri, uri, LWM2M_PACKAGE_URI_LEN) копирует ровно 128 байт в char uri[128] без нуль-терминатора, когда предоставленный сервером URI пакета (/5/0/1) имеет длину ≥ 128 байт. Последующие вызовы strlen(context.uri), http_parser_parse_url() и опция CoAP PROXY_URI добавляют и затем читают за границей буфера в смежную память структуры (is_firmware_uri, указатели на функции result_cb / write_cb и контекст DTLS-соединения). Избыточно прочитанные байты извлекаются в исходящем CoAP-запросе.context.uri[128] (CONFIG_LWM2M_SWMGMT_PACKAGE_URI_LEN, по умолчанию 128; LWM2M_PACKAGE_URI_LEN определён как это значение)99a164df5cea5af76e32b57c6d51854f018969a2 — добавляет проверку strlen(uri) >= sizeof(context.uri) → -ENOMEM и переключается на strcpy().| Файл | Назначение |
|---|---|
poc.c | Автономная C-реализация уязвимых/исправленных путей кода. Добросовестно переобъявляет (буфер и смежные поля, которые считываются за границей) и потребителей CoAP , вызывающих утечку. |
gcc -O0 -g -o poc poc.c
./poc
Ожидаемый результат: URI пакета длиной 200 байт приводит к опции CoAP PROXY_URI размером 141 байт — 128-байтовый URI плюс 13 утекших байт из context.is_firmware_uri, выравнивания структуры и указателей на функции result_cb/write_cb. Исправленный код отклоняет URI с ошибкой -ENOMEM и ничего не копирует.
gcc -O0 -g -fsanitize=address -o poc-asan poc.c
./poc-asan
Зонд выделяет ровно 128 байт, заполняет их ненулевыми байтами (имитируя полный context.uri без терминатора) и вызывает strlen():
ERROR: AddressSanitizer: heap-buffer-overflow
READ of size 129 at 0x...
0x... is located 0 bytes after 128-byte region [...,0x...)
# Собрать и просмотреть CoAP-пакеты без отправки:
python3 lwm2m_evil_server.py --dry-run --uri-len 200
# Отправить на уязвимый клиент (NoSec CoAP, UDP/5683):
python3 lwm2m_evil_server.py --target 10.0.0.42 --port 5683 --uri-len 200 --listen 2
Сценарий отправляет CoAP PUT /5/0/1 (запись LwM2M ресурса URI пакета), а затем CoAP POST /5/0/2 (выполнение LwM2M Update, которое запускает получение прошивки и вызывает ошибку). В рабочем LwM2M сессия выполняется через DTLS (UDP/5684); злоумышленником может быть вредоносный/скомпрометированный сервер управления или атакующий на пути (on-path), когда аутентификация сервера DTLS не применяется.
Только для авторизованных исследований безопасности и образовательных целей. Не используйте эти инструменты против устройств, которые вам не принадлежат или на тестирование которых у вас нет явного разрешения.
struct firmware_pull_contexturi[128]PROXY_URIlwm2m_evil_server.py | Минимальный сервер CoAP/LwM2M, который доставляет URI пакета увеличенного размера в /5/0/1 уязвимого клиента по UDP (режим NoSec) — сетевая часть атаки. Без внешних зависимостей. |