ช่องโหว่ใน Python ที่อนุญาตให้เรียกใช้คำสั่งระบบจากสคริปต์ที่แยกได้

มีการเผยแพร่วิธีการเพื่อหลีกเลี่ยงระบบการรันโค้ดแบบแยกส่วนใน Python โดยอิงจากการใช้จุดบกพร่องที่รู้จักกันมานานซึ่งปรากฏใน Python 2.7 ซึ่งถูกระบุในปี 2012 และยังไม่ได้รับการแก้ไขใน Python 3 จุดบกพร่องดังกล่าวทำให้สามารถใช้การเชื่อมโยงแบบพิเศษได้ รหัส Python เพื่อเริ่มต้นการเข้าถึงหน่วยความจำที่ว่างแล้ว (ใช้ฟรี) ใน Python ในขั้นต้น สันนิษฐานว่าข้อผิดพลาดไม่ได้ก่อให้เกิดภัยคุกคามด้านความปลอดภัย และเฉพาะในกรณีที่หายากมาก ซึ่งมักจะสร้างขึ้นโดยไม่ตั้งใจเท่านั้นที่สามารถนำไปสู่การยุติสคริปต์อย่างผิดปกติได้

นักวิจัยด้านความปลอดภัยภายใต้นามแฝง kn32 เริ่มสนใจปัญหาและจัดการเพื่อเตรียมช่องโหว่การทำงานที่ทำให้สามารถเรียกคำสั่งระบบใดๆ ได้โดยไม่ต้องเข้าถึงวิธีการเช่น os.system โดยตรง การใช้ประโยชน์ดังกล่าวถูกนำไปใช้ใน Python ล้วนๆ และทำงานได้โดยไม่ต้องนำเข้าไลบรารีภายนอกและไม่ต้องติดตั้งตัวจัดการ “code.__new__” ในบรรดา hooks จะใช้เฉพาะ "builtin.__id__" เท่านั้น ซึ่งโดยปกติจะไม่เป็นสิ่งต้องห้าม ในทางปฏิบัติ โค้ดที่นำเสนอสามารถใช้เพื่อเลี่ยงผ่านกลไกการแยกในบริการและสภาพแวดล้อมต่างๆ (เช่น ในสภาพแวดล้อมการเรียนรู้ เชลล์ออนไลน์ ตัวจัดการในตัว ฯลฯ) ซึ่งช่วยให้สามารถเรียกใช้โค้ด Python ได้ แต่จำกัด การโทรที่มีอยู่และไม่อนุญาตให้ใช้วิธีการโทรเช่น os.system

รหัสที่นำเสนอเป็นแบบอะนาล็อกของการเรียก os.system ซึ่งทำงานโดยใช้ประโยชน์จากช่องโหว่ใน CPython ช่องโหว่นี้ใช้งานได้กับ Python 3 ทุกเวอร์ชันบนระบบที่มีสถาปัตยกรรม x86-64 และสาธิตการทำงานที่เสถียรบน Ubuntu 22.04 แม้ว่าจะเปิดใช้งานโหมดการป้องกัน PIE, RELRO และ CET ก็ตาม งานเกี่ยวข้องกับการรับข้อมูลจากโค้ด Python เกี่ยวกับที่อยู่ของหนึ่งในฟังก์ชันในโค้ด CPython ที่ปฏิบัติการได้ ตามที่อยู่นี้ ที่อยู่ฐานของ CPython ในหน่วยความจำและที่อยู่ของฟังก์ชัน system() ในอินสแตนซ์ libc ที่โหลดในหน่วยความจำจะถูกคำนวณ ในตอนท้าย การเปลี่ยนโดยตรงไปยังที่อยู่ระบบเฉพาะจะเริ่มต้นด้วยการแทนที่ตัวชี้ของอาร์กิวเมนต์แรกเป็นบรรทัด “/bin/sh”

ช่องโหว่ใน Python ที่อนุญาตให้เรียกใช้คำสั่งระบบจากสคริปต์ที่แยกได้


ที่มา: opennet.ru

เพิ่มความคิดเห็น