ช่องโหว่ใน Python เมื่อจัดการตัวเลขเศษส่วนที่ไม่ผ่านการตรวจสอบใน ctypes

มีเวอร์ชันแก้ไขของภาษาการเขียนโปรแกรม Python 3.7.10 และ 3.6.13 ซึ่งแก้ไขช่องโหว่ (CVE-2021-3177) ที่อาจนำไปสู่การเรียกใช้โค้ดเมื่อประมวลผลตัวเลขทศนิยมที่ไม่ผ่านการตรวจสอบในตัวจัดการที่เรียกใช้ฟังก์ชัน C โดยใช้กลไก ctypes . ปัญหายังส่งผลกระทบต่อสาขา Python 3.8 และ 3.9 ด้วย แต่การอัปเดตสำหรับพวกเขายังคงอยู่ในสถานะผู้สมัคร (กำหนดการเปิดตัวในวันที่ 1 มีนาคม)

ปัญหามีสาเหตุมาจากบัฟเฟอร์ล้นในฟังก์ชัน ctypes PyCArg_repr() ซึ่งเกิดขึ้นเนื่องจากการใช้ sprintf ที่ไม่ปลอดภัย โดยเฉพาะอย่างยิ่งในการประมวลผลผลลัพธ์ของการแปลง 'sprintf(buffer, " ", self->tag, self->value.b)' จัดสรรบัฟเฟอร์คงที่ขนาด 256 ไบต์ ("char buffer[256]") ในขณะที่ผลลัพธ์อาจเกินค่านี้ หากต้องการตรวจสอบช่องโหว่ของแอปพลิเคชันไปยังช่องโหว่คุณสามารถลองส่งค่า "1e300" ซึ่งเมื่อประมวลผลโดยวิธี c_double.from_param จะทำให้เกิดข้อขัดข้องเนื่องจากหมายเลขผลลัพธ์มีอักขระ 308 ตัวและไม่พอดีกับ บัฟเฟอร์ 256 ไบต์ ตัวอย่างโค้ดที่มีปัญหา: import ctypes; x = ctypes.c_double.from_param(1e300); ตัวแทน(x)

ปัญหายังคงไม่ได้รับการแก้ไขใน Debian, Ubuntu และ FreeBSD แต่ได้รับการแก้ไขแล้วใน Arch Linux, Fedora, SUSE ใน RHEL ช่องโหว่ไม่เกิดขึ้นเนื่องจากการประกอบแพ็คเกจในโหมด FORTIFY_SOURCE ซึ่งจะบล็อกบัฟเฟอร์ล้นดังกล่าวในฟังก์ชันสตริง

ที่มา: opennet.ru

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