ช่องโหว่ในไลบรารีมาตรฐานของ Rust

มีการระบุช่องโหว่ (CVE-2022-21658) ในไลบรารีมาตรฐานของ Rust เนื่องจากสภาวะการแข่งขันในฟังก์ชัน std::fs::remove_dir_all() หากใช้ฟังก์ชันนี้เพื่อลบไฟล์ชั่วคราวในแอปพลิเคชันพิเศษ ผู้โจมตีสามารถลบไฟล์ระบบและไดเร็กทอรีต่างๆ ได้โดยอำเภอใจ ซึ่งปกติแล้วผู้โจมตีไม่สามารถเข้าถึงเพื่อลบได้

ช่องโหว่นี้เกิดจากการใช้การตรวจสอบลิงก์สัญลักษณ์อย่างไม่ถูกต้องก่อนที่จะลบไดเร็กทอรีแบบวนซ้ำ แทนที่จะป้องกันไม่ให้ติดตาม Symlink ให้ Remove_dir_all() ตรวจสอบก่อนว่าไฟล์นั้นเป็น Symlink หรือไม่ หากมีการกำหนดลิงก์ ลิงก์นั้นจะถูกลบเป็นไฟล์ และหากเป็นไดเร็กทอรี การดำเนินการลบเนื้อหาแบบเรียกซ้ำจะถูกเรียกใช้ ปัญหาคือมีความล่าช้าเล็กน้อยระหว่างการตรวจสอบและการเริ่มการดำเนินการลบ

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

Rust ทุกเวอร์ชันตั้งแต่ 1.0.0 ถึง 1.58.0 จะได้รับผลกระทบ ขณะนี้ปัญหาได้รับการแก้ไขในรูปแบบแพทช์แล้ว (การแก้ไขจะรวมอยู่ในรุ่น 1.58.1 ซึ่งคาดว่าจะภายในไม่กี่ชั่วโมง) คุณสามารถตรวจสอบการกำจัดช่องโหว่ในการแจกแจงในหน้าเหล่านี้: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch, FreeBSD ผู้ใช้โปรแกรม Rust ทุกคนที่ทำงานด้วยสิทธิ์ระดับสูงและใช้ฟังก์ชัน Remove_dir_all ควรอัปเดต Rust เป็นเวอร์ชัน 1.58.1 อย่างเร่งด่วน เป็นที่น่าสนใจว่าแพตช์ที่ปล่อยออกมาไม่สามารถแก้ปัญหาได้ในทุกระบบ ตัวอย่างเช่น ใน REDOX OS และ macOS เวอร์ชันก่อน 10.10 (Yosemite) ช่องโหว่จะไม่ถูกบล็อกเนื่องจากไม่มีแฟล็ก O_NOFOLLOW ซึ่งจะปิดใช้งานการติดตามสัญลักษณ์ ลิงค์

ที่มา: opennet.ru

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