Path Traversal

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

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

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