ثغرة أمنية في لغة Python عند التعامل مع الأرقام الكسرية التي لم يتم التحقق من صحتها في أنواع ctypes

تتوفر الإصدارات التصحيحية للغة برمجة Python 3.7.10 و3.6.13، والتي تعمل على إصلاح ثغرة أمنية (CVE-2021-3177) قد تؤدي إلى تنفيذ التعليمات البرمجية عند معالجة أرقام الفاصلة العائمة التي لم يتم التحقق من صحتها في المعالجات التي تستدعي وظائف C باستخدام آلية ctypes . تؤثر المشكلة أيضًا على فرعي Python 3.8 و3.9، لكن التحديثات الخاصة بهما لا تزال في حالة الإصدار المرشح (الإصدار المقرر إصداره في 1 مارس).

سبب المشكلة هو تجاوز سعة المخزن المؤقت في دالة ctypes PyCArg_repr()، والذي يحدث بسبب الاستخدام غير الآمن لـ sprintf. على وجه الخصوص، لمعالجة نتيجة التحويل 'sprintf(buffer, " "، self->tag، self->value.b)" خصصت مخزنًا مؤقتًا ثابتًا يبلغ 256 بايت ("char buffer[256]")، بينما يمكن أن تتجاوز النتيجة هذه القيمة. للتحقق من مدى تعرض التطبيقات للثغرة الأمنية، يمكنك محاولة تمرير القيمة "1e300"، والتي عند معالجتها بواسطة طريقة c_double.from_param، ستؤدي إلى حدوث عطل، نظرًا لأن الرقم الناتج يحتوي على 308 أحرف ولا يتناسب مع المخزن المؤقت 256 بايت. مثال على التعليمات البرمجية الإشكالية: import ctypes; x = ctypes.c_double.from_param(1e300); ممثل (خ)

لا تزال المشكلة دون حل في Debian وUbuntu وFreeBSD، ولكن تم حلها بالفعل في Arch Linux وFedora وSUSE. في RHEL، لا تحدث الثغرة الأمنية بسبب تجميع الحزمة في وضع FORTIFY_SOURCE، الذي يمنع تجاوز سعة المخزن المؤقت في وظائف السلسلة.

المصدر: opennet.ru

إضافة تعليق