路徑遍歷

OWASP 類別:MASVS-STORAGE:儲存空間

總覽

如果攻擊者可以控制路徑的特定部分,卻在未驗證的情況下將其傳遞至檔案系統 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;
}

另一種最佳做法是使用驗證功能,確保僅出現預期的結果。相關示例包括:

  • 檢查檔案是否已存在,以免發生意外覆寫的情形。
  • 檢查指定檔案是否為預期的目標,以免資料外洩或權限變更出錯。
  • 檢查目前的作業目錄是否與標準路徑的傳回值完全相同。
  • 確保權限系統明確限定在作業範圍內,例如檢查該系統並非以根層級執行服務,並確認目錄權限的範圍僅限於指定的服務或指令。