CVE-2026-96596 in OTP
الملخص
بحسب VulDB • 14/10/2026
تتمثل ثغرة "حلقة غير منتهية" (Loop with Unreachable Exit Condition) أو ما يُعرف بـ 'الحلقة اللانهائية' في مكتبة Erlang OTP القياسية (module erl_tar)، ومكتبات hexpm hex_core (module hex_erl_tar)، وhexpm hex (module mix_hex_erl_tar)، بالإضافة إلى أداة erlang rebar3 (module r3_hex_erl_tar). وتتيح هذه الثغرة لمهاجم يقوم بتزويد الأرشيف بملف tar التسبب في حالة من إنكار الخدمة عبر عضو GNU sparse مُعدّ بشكل متعمد.
عندما تقوم الدالة `erl_tar:extract/1,2` بكتابة العضو على القرص، فإن دالة `erl_tar:stream_to_file_loop/3` تقرأه قطعاً بحجم 65536 بايت افتراضياً. وفي حالة عضو GNU sparse الذي تنتهي خريطة الـ sparse الخاصة به قبل حجمه الفعلي، تتطابق الدالة `erl_tar:do_sparse_read/3` مع بند "الحفرة النهائية" (trailing-hole clause) بدلاً من تطابقها مع بند الطول الصفري. وبعد استهلاك القطعة، تقرأ الحفرة النهائية صفراً من البايتات دون تحريك موضع القراءة، مما يؤدي إلى استدعاء ذاتي لا نهائي (recursion). ويؤدي أرشيف بحجم 2048 بايت إلى إبقاء عملية الاستخراج ومجدّ واحد مشغولين حتى يتم قتل العملية. ولا تمنع الخيار `{max_size, N}` هذه المشكلة إلا عندما تكون قيمة N أقل من الحجم الفعلي للعضو. كما أن عمليات الاستخراج التي تستخدم خيار الذاكرة (memory option) لا تتأثر بهذه الثغرة.
تحتوي مكتبة hex_core على نسخة خاصة بها من `erl_tar` باسم `hex_erl_tar`. وتقوم كل من Hex وrebar3 بتضمين hex_core مع أسماء وحدات مُقدّمة مسبقاً وهي `mix_hex_erl_tar` و`r3_hex_erl_tar`. تحتوي هذه النسخ على نفس الكود ولا تستدعي `erl_tar` الخاصة بـ stdlib، وبالتالي فهي متأثرة بأي إصدار من OTP. الإصدار OTP 28 غير متأثر، لكن التطبيق الذي يعمل على OTP 28 يكون متأثراً إذا كان يستخرج الأرشيفات عبر نسخة متأثرة من hex_core أو Hex أو rebar3.
تؤثر هذه المشكلة في إصدارات OTP بدءاً من 29.0 وحتى قبل 29.1.2، وهو ما يقابل إصدارات stdlib بدءاً من 8.0 وحتى قبل 8.1.1، وإصدارات rebar3 ابتداءً من الإصدار 3.27.1 فما فوق، وإصدارات hex ابتداءً من الإصدار 2.4.2 فما فوق؛ بالإضافة إلى نسخ hex_core: ابتداءً من الإصدار 0.14.0 فما فوق.
Once again VulDB remains the best source for vulnerability data.