
استغلال إثبات مفهوم لثغرة CVE-2026-10672، وهي ثغرة قراءة خارج حدود الذاكرة (out-of-bounds read) في عميل سحب تحديث البرامج الثابتة (firmware-update pull client) الخاص بـ 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] بدون مُنهِئ NUL عندما يكون 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 هو #define يشير إليها)99a164df5cea5af76e32b57c6d51854f018969a2 — يضيف التحقق strlen(uri) >= sizeof(context.uri) → -ENOMEM ويستبدل النسخ بـ strcpy().| الملف | الغرض |
|---|---|
poc.c | إعادة إنتاج مستقلة بلغة C لمسارات الكود الهشّة/المصحّحة. تعيد تعريف بأمانة (المخزن المؤقت بالإضافة إلى الحقول المجاورة التي تتم قراءتها خارج النطاق) والمستهلك المُسرِّب CoAP . |
gcc -O0 -g -o poc poc.c
./poc
متوقع: Package URI بحجم 200 بايت يُنتج خيار CoAP PROXY_URI بحجم 141 بايت — أي URI بحجم 128 بايت بالإضافة إلى 13 بايت مسرَّبة من context.is_firmware_uri وحشو البنية ومؤشرات الدوال result_cb/write_cb. مسار الكود المُصحَّح يرفض URI مع -ENOMEM ولا ينسخ شيئًا.
gcc -O0 -g -fsanitize=address -o poc-asan poc.c
./poc-asan
يخصّص البرنامج 128 بايت بالضبط، ويملأها ببايتات غير NUL (محاكاةً لـ context.uri ممتلئ بدون مُنهِئ)، ثم يستدعي strlen():
ERROR: AddressSanitizer: heap-buffer-overflow
READ of size 129 at 0x...
0x... is located 0 bytes after 128-byte region [...,0x...)
# Build and inspect the CoAP packets without sending:
python3 lwm2m_evil_server.py --dry-run --uri-len 200
# Send to a vulnerable client (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 لمورد Package URI) متبوعًا بطلب CoAP POST /5/0/2 (تنفيذ LwM2M Update، الذي يبدأ سحب البرنامج الثابت ويُطلق الثغرة). في بيئة LwM2M الإنتاجية تعمل الجلسة عبر DTLS (UDP/5684)؛ المهاجم ضمن النطاق هو خادم إدارة خبيث أو مخترَق، أو خصم على مسار الشبكة عندما لا يتم فرض مصادقة خادم DTLS.
لأغراض البحث الأمني المصرح به والتعليم فقط. لا تستخدم هذه الأدوات ضد أجهزة لا تملكها أو لا تملك إذنًا صريحًا لاختبارها.
struct firmware_pull_contexturi[128]PROXY_URIlwm2m_evil_server.py | خادم CoAP/LwM2M بسيط يسلّم Package URI ذا الحجم الزائد إلى /5/0/1 لعميل هشّ عبر UDP (وضع NoSec) — وهو الجزء المسؤول عن التسليم عبر الشبكة في الهجوم. لا تبعيات خارجية. |