ثغرة أمنية في لغة بايثون تسمح باستدعاء أوامر النظام من نصوص برمجية معزولة

تم نشر طريقة لتجاوز أنظمة تنفيذ التعليمات البرمجية المعزولة في بايثون، تعتمد على استخدام خطأ معروف منذ فترة طويلة ظهر في بايثون 2.7، تم تحديده في عام 2012 ولم يتم تصحيحه بعد في بايثون 3. يسمح الخطأ باستخدام روابط خاصة رمز Python لبدء الاتصال بالذاكرة المحررة بالفعل (الاستخدام بعد الحرية) في Python. في البداية، كان من المفترض أن الخطأ لا يشكل تهديدًا أمنيًا وفقط في حالات نادرة جدًا، عادةً ما يتم إنشاؤه بشكل مصطنع، يمكن أن يؤدي إلى إنهاء غير طبيعي للبرنامج النصي.

أصبح باحث أمني تحت الاسم المستعار kn32 مهتمًا بالمشكلة وتمكن من إعداد استغلال عملي يجعل من الممكن استدعاء أي أمر نظام دون الوصول المباشر إلى أساليب مثل os.system. يتم تنفيذ هذا الاستغلال بلغة Python النقية ويعمل بدون استيراد مكتبات خارجية ودون تثبيت معالج "code.__new__". من بين الخطافات، يتم استخدام "builtin.__id__" فقط، وهو أمر غير محظور عادةً. على الجانب العملي، يمكن استخدام الكود المقترح لتجاوز آليات العزل في مختلف الخدمات والبيئات (على سبيل المثال، في بيئات التعلم، والأصداف عبر الإنترنت، والمعالجات المضمنة، وما إلى ذلك)، والتي تسمح بتنفيذ كود بايثون، ولكنها تحد من المكالمات المتاحة ولا تسمح بطرق الاتصال مثل os.system.

الكود المقترح هو نظير لاستدعاء os.system، والذي يعمل عن طريق استغلال ثغرة أمنية في CPython. يعمل هذا الاستغلال مع جميع إصدارات Python 3 على الأنظمة ذات بنية x86-64 ويوضح التشغيل المستقر على Ubuntu 22.04، حتى عند تمكين أوضاع الحماية PIE وRELRO وCET. يتلخص العمل في الحصول على معلومات من كود Python حول عنوان إحدى الوظائف في كود CPython القابل للتنفيذ. بناءً على هذا العنوان، يتم حساب العنوان الأساسي لـ CPython في الذاكرة وعنوان وظيفة النظام () في مثيل libc المحمل في الذاكرة. في النهاية، يبدأ الانتقال المباشر إلى عنوان نظام محدد باستبدال مؤشر الوسيطة الأولى بالسطر "/bin/sh".

ثغرة أمنية في لغة بايثون تسمح باستدعاء أوامر النظام من نصوص برمجية معزولة


المصدر: opennet.ru

إضافة تعليق