หมวดหมู่ OWASP: MASVS-STORAGE: Storage
ภาพรวม
ช่องโหว่ Path Traversal เกิดขึ้นเมื่อผู้โจมตีสามารถควบคุมบางส่วนของเส้นทางที่ส่งไปยัง API ของระบบไฟล์โดยไม่มีการตรวจสอบ ซึ่งอาจนำไปสู่การดำเนินการกับระบบไฟล์โดยไม่ได้รับอนุญาต ตัวอย่างเช่น ผู้โจมตีอาจใช้อักขระพิเศษ เช่น ../ เพื่อเปลี่ยนเป้าหมายของทรัพยากรโดยไม่คาดคิดด้วยการข้ามออกจากไดเรกทอรีเป้าหมาย
ผลกระทบ
ผลกระทบจะแตกต่างกันไปตามการดำเนินการและเนื้อหาของไฟล์ แต่โดยทั่วไปจะนำไปสู่การเขียนทับไฟล์ (เมื่อเขียนไฟล์) ข้อมูลรั่วไหล (เมื่ออ่านไฟล์) หรือการเปลี่ยนแปลงสิทธิ์ (เมื่อเปลี่ยนสิทธิ์ของไฟล์หรือไดเรกทอรี)
การบรรเทา
ทำให้เส้นทางเป็นมาตรฐานโดยใช้ 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;
}
แนวทางปฏิบัติแนะนำเพิ่มเติมคือการใช้การตรวจสอบเพื่อให้มั่นใจว่าจะเกิดผลลัพธ์ที่คาดไว้เท่านั้น ตัวอย่างมีดังต่อไปนี้
- การตรวจสอบว่ามีไฟล์อยู่แล้วหรือไม่เพื่อป้องกันการเขียนทับโดยไม่ตั้งใจ
- การตรวจสอบว่าไฟล์เป้าหมายเป็นเป้าหมายที่คาดไว้หรือไม่เพื่อป้องกันการรั่วไหลของข้อมูลหรือการเปลี่ยนแปลงสิทธิ์อย่างไม่ถูกต้อง
- การตรวจสอบว่าไดเรกทอรีปัจจุบันของการดำเนินการตรงกับที่คาดไว้ในค่าที่แสดงผลจากเส้นทางมาตรฐานหรือไม่
- การตรวจสอบว่าระบบสิทธิ์มีขอบเขตที่กำหนดไว้สำหรับการดำเนินการอย่างชัดเจน เช่น การตรวจสอบว่าระบบไม่ได้เรียกใช้บริการในฐานะผู้ใช้ระดับราก และการตรวจสอบว่าสิทธิ์ของไดเรกทอรีมีขอบเขตที่กำหนดไว้สำหรับบริการหรือคำสั่งที่ระบุ