
مختبر قائم على Docker يوضح استغلال CVE-2017-8291 (GhostButt) عبر معالجة صور EPS في Python PIL/Pillow، مع تطبيق ويب ضعيف واستغلال إثبات المفهوم.
Python PIL (Pillow) هي مكتبة معالجة صور شهيرة للغة Python. تدعم العديد من تنسيقات الصور وتوفر إمكانيات قوية لمعالجة الصور.
تتأثر وحدة معالجة الصور في Python، PIL (Pillow)، بثغرة GhostButt (CVE-2017-8291) لأنها تستدعي داخليًا GhostScript لمعالجة صور EPS. تسمح هذه الثغرة للمهاجمين بتنفيذ أوامر عشوائية على النظام المستهدف.
عند معالجة PIL لصورة ما، تحدد نوع الصورة بناءً على ترويسة الملف (Magic Bytes). إذا تعرفت على ملف EPS (ترويسة تبدأ بـ %!PS)، فإنها تمرر الملف إلى PIL/EpsImagePlugin.py للمعالجة.
في هذه الوحدة، يستدعي PIL أمر GhostScript الخاص بالنظام (gs) لمعالجة ملف الصورة:
command = ["gs",
"-q", # quiet mode
"-g%dx%d" % size, # set output geometry (pixels)
"-r%fx%f" % res, # set input DPI (dots per inch)
"-dBATCH", # exit after processing
"-dNOPAUSE", # don't pause between pages,
"-dSAFER", # safe mode
"-sDEVICE=ppmraw", # ppm driver
"-sOutputFile=%s" % outfile, # output file
"-c", "%d %d translate" % (-bbox[0], -bbox[1]),
# adjust for image origin
"-f", infile, # input file
]
# Code to check if GhostScript is installed is omitted
try:
with open(os.devnull, 'w+b') as devnull:
subprocess.check_call(command, stdin=devnull, stdout=devnull)
im = Image.open(outfile)
على الرغم من تعيين العلم -dSAFER (الوضع الآمن)، فإن ثغرة تجاوز العزل في GhostScript (GhostButt CVE-2017-8291) تسمح بتجاوز هذه الآلية الأمنية، مما يتيح تنفيذ أوامر عشوائية.
حتى وقت كتابة هذا النص، لا يزال أحدث إصدار رسمي من GhostScript، 9.21، متأثرًا بهذه الثغرة. لذلك، طالما أن GhostScript مثبت على نظام التشغيل، فإن PIL تكون عرضة لتنفيذ الأوامر.
المراجع:
نفّذ الأمر التالي لبدء تطبيق ويب عرضة لثغرة CVE-2017-8291:
docker compose up -d
بعد بدء التشغيل، قم بزيارة http://your-ip:8000/ للوصول إلى صفحة الرفع.
الوظيفة الطبيعية لهذا التطبيق تتيح للمستخدمين رفع ملف PNG. يستخدم الخادم الخلفي PIL لتحميل الصورة وإخراج أبعادها. ومع ذلك، يمكننا استغلال ذلك بتغيير امتداد ملف EPS قابل للتنفيذ إلى PNG ورفعه. نظرًا لأن الخادم الخلفي يحدد نوع الصورة بناءً على ترويسة الملف وليس الامتداد، فإن فحص امتداد الملف يمكن تجاوزه.
على سبيل المثال، يمكننا رفع poc.png، والذي سينفّذ الأمر touch /tmp/aaaaa على الخادم. من خلال تعديل الأمر في POC إلى أمر قشرة عكسية (reverse shell)، يمكننا الحصول على وصول بقشرة (shell) إلى الخادم:
