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

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

ภาพรวม

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

ผลกระทบ

เมื่อแอปพลิเคชันแยกวิเคราะห์เอกสาร XML แอปพลิเคชันนั้นจะสามารถประมวลผล DTD (คำจำกัดความประเภทเอกสาร หรือที่เรียกว่าเอนทิตีภายนอก) ที่มีอยู่ภายในเอกสาร ผู้โจมตีอาจใช้ประโยชน์จากลักษณะการทำงานนี้โดยการแทรกโค้ดที่เป็นอันตรายเป็น 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 และเอนทิตี้

แหล่งข้อมูล