ช่องโหว่ในไลบรารีเครือข่ายของภาษา Rust and Go ที่ช่วยให้คุณสามารถข้ามการตรวจสอบที่อยู่ IP ได้

ช่องโหว่ที่เกี่ยวข้องกับการประมวลผลที่อยู่ IP ที่ไม่ถูกต้องด้วยเลขฐานแปดในฟังก์ชันการแยกวิเคราะห์ที่อยู่ได้รับการระบุในไลบรารีมาตรฐานของภาษา Rust and Go ช่องโหว่นี้ทำให้สามารถเลี่ยงการตรวจสอบที่อยู่ที่ถูกต้องในแอปพลิเคชันได้ เช่น เพื่อจัดระเบียบการเข้าถึงที่อยู่อินเทอร์เฟซแบบย้อนกลับ (127.xxx) หรือเครือข่ายย่อยอินทราเน็ต เมื่อทำการโจมตี SSRF (การปลอมแปลงคำขอฝั่งเซิร์ฟเวอร์) ช่องโหว่ดังกล่าวยังคงดำเนินต่อไปตามวงจรของปัญหาที่ระบุไว้ก่อนหน้านี้ในไลบรารี่ node-netmask (JavaScript, CVE-2021-28918, CVE-2021-29418), private-ip (JavaScript, CVE-2020-28360), ipaddress (Python, CVE- 2021-29921 ), Data::Validate::IP (Perl, CVE-2021-29662) และ Net::Netmask (Perl, CVE-2021-29424)

ตามข้อกำหนด ค่าสตริงที่อยู่ IP ที่ขึ้นต้นด้วยศูนย์ควรตีความว่าเป็นเลขฐานแปด แต่ไลบรารีจำนวนมากไม่ได้คำนึงถึงสิ่งนี้และเพียงละทิ้งศูนย์โดยถือว่าค่าเป็นเลขทศนิยม ตัวอย่างเช่น ตัวเลข 0177 ในฐานแปดจะเท่ากับ 127 ในฐานสิบ ผู้โจมตีสามารถขอทรัพยากรได้โดยการระบุค่า "0177.0.0.1" ซึ่งในรูปแบบทศนิยมจะสอดคล้องกับ "127.0.0.1" หากใช้ไลบรารีที่มีปัญหาแอปพลิเคชันจะไม่ตรวจพบว่าที่อยู่ 0177.0.0.1 อยู่ในซับเน็ต 127.0.0.1/8 แต่ในความเป็นจริงเมื่อส่งคำขอจะสามารถเข้าถึงที่อยู่ “0177.0.0.1” ซึ่ง ฟังก์ชั่นเครือข่ายจะประมวลผลเป็น 127.0.0.1 ในทำนองเดียวกัน คุณสามารถโกงการตรวจสอบการเข้าถึงที่อยู่อินทราเน็ตได้โดยการระบุค่าเช่น "012.0.0.1" (เทียบเท่ากับ "10.0.0.1")

ใน Rust ไลบรารีมาตรฐาน "std::net" ได้รับผลกระทบจากปัญหา (CVE-2021-29922) ตัวแยกวิเคราะห์ที่อยู่ IP ของไลบรารีนี้จะละทิ้งศูนย์ก่อนค่าในที่อยู่ แต่เฉพาะในกรณีที่ระบุไม่เกินสามหลักเท่านั้น เช่น "0177.0.0.1" จะถูกมองว่าเป็นค่าที่ไม่ถูกต้องและผลลัพธ์ที่ไม่ถูกต้อง จะถูกส่งกลับเพื่อตอบสนองต่อ 010.8.8.8 และ 127.0.026.1 แอปพลิเคชันที่ใช้ std::net::IpAddr เมื่อแยกวิเคราะห์ที่อยู่ที่ระบุโดยผู้ใช้อาจเสี่ยงต่อการโจมตี SSRF (การปลอมแปลงคำขอฝั่งเซิร์ฟเวอร์), RFI (Remote File Inclusion) และ LFI (Local File Inclusion) ช่องโหว่ได้รับการแก้ไขแล้วในสาขา Rust 1.53.0

ช่องโหว่ในไลบรารีเครือข่ายของภาษา Rust and Go ที่ช่วยให้คุณสามารถข้ามการตรวจสอบที่อยู่ IP ได้

In Go ไลบรารีมาตรฐาน "net" จะได้รับผลกระทบ (CVE-2021-29923) ฟังก์ชันในตัว net.ParseCIDR ข้ามศูนย์นำหน้าก่อนเลขฐานแปดแทนที่จะประมวลผล ตัวอย่างเช่น ผู้โจมตีสามารถส่งค่า 00000177.0.0.1 ซึ่งเมื่อตรวจสอบในฟังก์ชัน net.ParseCIDR(00000177.0.0.1/24) จะถูกแยกวิเคราะห์เป็น 177.0.0.1/24 ไม่ใช่ 127.0.0.1/24 ปัญหายังปรากฏอยู่ในแพลตฟอร์ม Kubernetes ด้วย ช่องโหว่ได้รับการแก้ไขใน Go รุ่น 1.16.3 และเบต้า 1.17

ช่องโหว่ในไลบรารีเครือข่ายของภาษา Rust and Go ที่ช่วยให้คุณสามารถข้ามการตรวจสอบที่อยู่ IP ได้


ที่มา: opennet.ru

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