ช่องโหว่ในไลบรารีด้วยการใช้งานหลักของอัลกอริทึม SHA-3

พบช่องโหว่ (CVE-3-2022) ในการใช้ฟังก์ชันแฮชการเข้ารหัส SHA-37454 (Keccak) ที่นำเสนอในแพ็คเกจ XKCP (eXtened Keccak Code Package) ซึ่งอาจนำไปสู่บัฟเฟอร์ล้นในระหว่างการประมวลผลบางรายการ ข้อมูลที่จัดรูปแบบ ปัญหามีสาเหตุมาจากข้อบกพร่องในโค้ดของการใช้งาน SHA-3 โดยเฉพาะ และไม่ใช่จากช่องโหว่ในอัลกอริทึมเอง แพ็คเกจ XKCP ได้รับการขนานนามว่าเป็นการใช้งานอย่างเป็นทางการของ SHA-3 ซึ่งพัฒนาด้วยข้อมูลจากทีมพัฒนา Keccak และใช้เป็นพื้นฐานสำหรับฟังก์ชัน SHA-3 ในภาษาการเขียนโปรแกรมต่างๆ (เช่น รหัส XKCP ถูกใช้ใน Python hashlib โมดูล, ฟังก์ชัน Ruby digest sha3 และ PHP hash_*)

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

ยังไม่ชัดเจนว่าช่องโหว่ส่งผลกระทบต่อแอปพลิเคชันที่มีอยู่ในทางปฏิบัติมากเพียงใด เนื่องจากปัญหาจะปรากฏในโค้ด ต้องใช้การคำนวณแฮชแบบวนในบล็อก และหนึ่งในบล็อกที่ประมวลผลต้องมีขนาดประมาณ 4 GB (อย่างน้อย 2^32 - 200 ไบต์) เมื่อประมวลผลข้อมูลอินพุตในครั้งเดียว (โดยไม่ต้องคำนวณแฮชในส่วนต่างๆ ตามลำดับ) ปัญหาจะไม่ปรากฏขึ้น เนื่องจากเป็นวิธีการป้องกันที่ง่ายที่สุด จึงเสนอให้จำกัดขนาดสูงสุดของข้อมูลที่เกี่ยวข้องกับการคำนวณแฮชซ้ำหนึ่งครั้ง

ช่องโหว่นี้เกิดจากข้อผิดพลาดในการประมวลผลบล็อกข้อมูลอินพุต เนื่องจากการเปรียบเทียบค่ากับประเภท "int" ไม่ถูกต้อง จึงกำหนดขนาดข้อมูลที่ค้างอยู่ไม่ถูกต้อง ซึ่งทำให้ส่วนท้ายถูกเขียนเกินบัฟเฟอร์ที่จัดสรร โดยเฉพาะอย่างยิ่งการเปรียบเทียบใช้นิพจน์ "partialBlock + instance->byteIOIndex" ซึ่งนำไปสู่จำนวนเต็มล้นสำหรับค่าขนาดใหญ่ของส่วนที่เป็นส่วนประกอบ นอกจากนี้ มีประเภทการส่งที่ไม่ถูกต้อง "(unsigned int)(dataByteLen - i)" ในโค้ด ซึ่งทำให้เกิดการโอเวอร์โฟลว์บนระบบที่มีประเภท size_t 64 บิต

โค้ดตัวอย่างที่ทำให้เกิดการโอเวอร์โฟลว์: import hashlib h = hashlib.sha3_224() m1 = b"\x00" * 1; m2 = ข"\x00″ * 4294967295; h.update (m1) h.update (m2) พิมพ์ (h.hexdigest ())

ที่มา: opennet.ru

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