หมวดหมู่ OWASP: MASVS-STORAGE: พื้นที่เก็บข้อมูล
ภาพรวม
ช่องโหว่การข้ามเส้นทางเกิดขึ้นเมื่อผู้โจมตีสามารถควบคุมส่วนหนึ่งของเส้นทางซึ่งส่งไปยัง File System API โดยไม่ผ่านการตรวจสอบ ซึ่งอาจนำไปสู่การดําเนินการระบบไฟล์ที่ไม่ได้รับอนุญาต ตัวอย่างเช่น ผู้โจมตีอาจใช้สัญลักษณ์พิเศษอย่าง ../
เพื่อเปลี่ยนเป้าหมายทรัพยากรโดยไม่คาดคิดโดยการข้ามผ่านไดเรกทอรีเป้าหมาย
ผลกระทบ
ผลกระทบจะแตกต่างกันไปตามการดำเนินการและเนื้อหาของไฟล์ แต่โดยทั่วไปแล้วจะนำไปสู่การเขียนไฟล์ทับ (เมื่อเขียนไฟล์) การรั่วไหลของข้อมูล (เมื่ออ่านไฟล์) หรือการเปลี่ยนแปลงสิทธิ์ (เมื่อเปลี่ยนสิทธิ์ของไฟล์หรือไดเรกทอรี)
การลดปัญหา
กําหนดเส้นทางเป็นหน้า Canonical โดยใช้ File.getCanonicalPath()
และเปรียบเทียบส่วนหน้ากับไดเรกทอรีที่คาดไว้
Kotlin
@Throws(IllegalArgumentException::class)
fun saferOpenFile(path: String, expectedDir: String?): File {
val f = File(path)
val canonicalPath = f.canonicalPath
require(canonicalPath.startsWith(expectedDir!!))
return f
}
Java
public File saferOpenFile (String path, String expectedDir) throws IllegalArgumentException {
File f = new File(path);
String canonicalPath = f.getCanonicalPath();
if (!canonicalPath.startsWith(expectedDir)) {
throw new IllegalArgumentException();
}
return f;
}
แนวทางปฏิบัติแนะนำเพิ่มเติมคือการใช้การตรวจสอบเพื่อให้แน่ใจว่าจะเกิดเฉพาะผลลัพธ์ที่คาดไว้เท่านั้น ตัวอย่างมีดังต่อไปนี้
- ตรวจสอบว่ามีไฟล์อยู่แล้วหรือไม่เพื่อป้องกันการเขียนทับโดยไม่ตั้งใจ
- ตรวจสอบว่าไฟล์เป้าหมายเป็นเป้าหมายที่คาดหวังไว้เพื่อป้องกันข้อมูลรั่วไหลหรือการเปลี่ยนแปลงสิทธิ์อย่างไม่ถูกต้องหรือไม่
- ตรวจสอบว่าไดเรกทอรีปัจจุบันของการดำเนินการตรงกับที่คาดไว้ทุกประการในค่าที่แสดงผลจากเส้นทางตามแบบแผนหรือไม่
- ตรวจสอบว่าระบบสิทธิ์กําหนดขอบเขตไว้อย่างชัดเจนสําหรับการดำเนินการ เช่น ตรวจสอบว่าไม่ได้เรียกใช้บริการในฐานะรูท และตรวจสอบว่าสิทธิ์ไดเรกทอรีกําหนดขอบเขตไว้สําหรับบริการหรือคําสั่งที่ระบุ