
PJSIP DNS ضغط المؤشر قراءة خارج الحدود في الكومة (تعطيل الخدمة عن بُعد)
قراءة خارج الحدود لمؤشر ضغط DNS في الكومة (تعطيل الخدمة عن بُعد)
تقرأ الدالتان get_name_len() و get_name() في pjlib-util/src/pjlib-util/dns.c مؤشر ضغط DNS بحجم 2 بايت عبر pj_memcpy(&offset, p, 2) دون التحقق من أن البايتين يقعان داخل حدود مخزن الحزمة. عندما تكون بايتة 0xC0 (علامة مؤشر الضغط) هي آخر بايتة في استجابة DNS، تقرأ memcpy بايتة واحدة بعد حدود تخصيص الكومة.
حزمة DNS واحدة مصمّمة بحجم 20 بايت تؤدي إلى القراءة خارج الحدود وتُعطّل أي تطبيق PJSIP (بما في ذلك Asterisk و FreeSWITCH) يحلّل اسم نطاق عبر خادم DNS يتحكم به الشبكة.
يؤكد ASan: heap-buffer-overflow READ of size 2, 0 bytes after 20-byte region في get_name_len().
هذا هو ثالث ثغرة CVE في محلل DNS في ملف dns.c الخاص بمشروع pjproject منذ 2022 (بعد CVE-2022-24793 و CVE-2023-27585). أضاف إصلاح CVE-2022-24793 فحوصات للطول في جميع أنحاء المحلل لكنه أغفل مسار مؤشر الضغط.
المتأثر: pjproject <= 2.16. تم الإصلاح في pjproject 2.17 (الالتزام 5311aee).
# أداة ASan المستقلة (لا تتطلب تثبيت pjproject):
./run.sh
# أو البناء والتشغيل يدويًا:
gcc -fsanitize=address,undefined -g -O0 harness.c -o harness
./harness
# إثبات المفهوم عبر الشبكة -- خادم DNS خادع:
python3 poc.py --port 5353
# ثم وجّه تطبيق PJSIP إلى الخادم الخادع:
# pjsua --nameserver 127.0.0.1:5353 sip:[email protected]
# Docker (يبني pjproject 2.16 من المصدر مع ASan):
docker compose build
docker compose run harness
gcc مع دعم AddressSanitizer| الملف | الوصف |
|---|---|
harness.c | أداة ASan المستقلة -- تعيد تنفيذ get_name_len() الضعيفة بأنواع pjproject الدقيقة |
harness_pjlib.c | أداة بديلة تستدعي pj_dns_parse_packet() الحقيقية (لـ Docker) |
poc.py | خادم DNS خادع -- يستجيب لأي استعلام بحزمة مصمّمة بحجم 20 بايت |
run.sh | يبني ويشغّل أداة ASan |
Dockerfile | يبني pjproject 2.16 من المصدر مع ASan |
docker-compose.yml | إعداد Docker لأداة pjlib |
proof_output.txt | مخرجات ASan الكاملة من التحقق المباشر |
يُطرح هذا المشروع بموجب رخصة GNU GPLv3.
يُقدَّم لأغراض البحث الأمني الدفاعي والتعليم والاختبار المصرّح به. لا تستخدم هذا الكود ضد أنظمة أو خدمات دون إذن صريح من المالك.
قد ينتهك الاستخدام غير المصرّح به القانون المعمول به. لا يمنح المؤلفون إذنًا لاختبار أنظمة الطرف الثالث وليسوا مسؤولين عن سوء الاستخدام.
راجع ملف LICENSE لشروط الضمان والمسؤولية.