Path Traversal

หมวดหมู่ 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;
}

แนวทางปฏิบัติแนะนำเพิ่มเติมคือการใช้การตรวจสอบเพื่อให้แน่ใจว่าจะเกิดเฉพาะผลลัพธ์ที่คาดไว้เท่านั้น ตัวอย่างมีดังต่อไปนี้

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