
PoC تعليمي لـ CVE-2017-8291 (GhostButt) يوضح تنفيذ أوامر عن بُعد عبر معالجة صور EPS باستخدام Python PIL/Pillow مع تجاوز صندوق الحماية لـ GhostScript.
Python PIL (Pillow) هي مكتبة معالجة صور شائعة للغة Python. تدعم العديد من تنسيقات الصور وتوفر إمكانيات قوية لمعالجة الصور.
تتأثر وحدة معالجة الصور PIL (Pillow) في Python بثغرة 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 (الوضع الآمن)، إلا أن ثغرة تجاوز الصندوق الرملي (sandbox bypass) في 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) إلى أمر شل عكسي، يمكننا الحصول على وصول شل إلى الخادم:
