การส่งผ่านเอนทิตีภายนอก XML (XXE)

หมวดหมู่ OWASP: MASVS-CODE: คุณภาพของโค้ด

ภาพรวม

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

ผลกระทบ

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

สุดท้ายนี้ หากแอปพลิเคชันขยาย DTD อาจทำให้เกิดสถานการณ์ที่มีการทำซ้ำหลายครั้งของเอนทิตีที่อ้างอิง ซึ่งจะทำให้ทรัพยากรของอุปกรณ์หมดและนำไปสู่การปฏิเสธการให้บริการ

การลดปัญหา

ปิดใช้ DTD

วิธีที่ปลอดภัยที่สุดในการป้องกัน XXE คือการปิดใช้ DTD (เอนทิตีภายนอก) โดยสมบูรณ์เสมอ วิธีการอาจคล้ายกับ ตัวอย่างต่อไปนี้สำหรับไลบรารี XML Pull Parser ทั้งนี้ขึ้นอยู่กับโปรแกรมแยกวิเคราะห์ที่ใช้

Java

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

Kotlin

val factory = XmlPullParserFactory.newInstance()
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)

การปิดใช้ DTD ยังช่วยให้ตัวแยกวิเคราะห์ปลอดภัยจากการโจมตีแบบปฏิเสธการให้บริการด้วย หากปิดใช้ DTD ทั้งหมดไม่ได้ คุณต้องปิดใช้เอนทิตีภายนอกและการประกาศประเภทเอกสารภายนอกในลักษณะที่เจาะจงสำหรับแต่ละตัวแยกวิเคราะห์

เนื่องจากมีเครื่องมือแยกวิเคราะห์ XML จำนวนมากในตลาด วิธีป้องกันการโจมตี XXE จึงแตกต่างกันไปในแต่ละเครื่องมือ คุณอาจต้องดูข้อมูลเพิ่มเติมในเอกสารประกอบของเอ็นจิน

ดำเนินการปรับปรุงอินพุต

ควรกำหนดค่าแอปพลิเคชันใหม่เพื่อไม่ให้ผู้ใช้แทรกโค้ดที่กำหนดเองในส่วนนำของเอกสาร XML ต้องมีการยืนยันฝั่งเซิร์ฟเวอร์ เนื่องจากสามารถข้ามการควบคุมฝั่งไคลเอ็นต์ได้

ใช้ไลบรารีอื่น

หากกำหนดค่าไลบรารีหรือวิธีการที่ใช้ในลักษณะที่ปลอดภัยไม่ได้ คุณควรพิจารณาใช้ไลบรารีหรือวิธีการอื่น XML Pull Parser และ SAX Parser สามารถ กำหนดค่าในลักษณะที่ปลอดภัยได้ทั้งคู่ โดยไม่อนุญาต DTD และเอนทิตี

แหล่งข้อมูล