Yol geçişi

OWASP kategorisi: MASVS-STORAGE: Depolama

Genel Bakış

Yol geçişi güvenlik açıkları, saldırganlar yolun bir bölümünü kontrol edebildiğinde ve bu bölüm daha sonra doğrulama yapılmadan dosya sistemi API'lerine aktarıldığında ortaya çıkar. Bu durum, yetkisiz dosya sistemi işlemlerine neden olabilir. Örneğin, bir saldırgan, hedeflenen dizinin dışına geçiş yaparak kaynak hedefini beklenmedik bir şekilde değiştirmek için ../ gibi özel karakterleri kullanabilir.

Etki

Etki, işleme ve dosya içeriğine bağlı olarak değişir ancak genellikle dosyaların üzerine yazılmasına (dosya yazarken), veri sızıntısına (dosya okurken) veya izin değişikliklerine (dosya ya da dizin izinlerini değiştirirken) neden olur.

Çözümler

File.getCanonicalPath() kullanarak yolu standartlaştırın ve ön eki beklenen dizinle karşılaştırın:

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;
}

Yalnızca beklenen sonuçların elde edilmesini sağlamak için doğrulama kullanmak da en iyi uygulamalardan biridir. Örnekler arasında aşağıdakiler sayılabilir:

  • Yanlışlıkla üzerine yazmayı önlemek için dosyanın zaten mevcut olup olmadığı kontrol ediliyor.
  • Veri sızıntısını veya izinlerin yanlışlıkla değiştirilmesini önlemek için hedeflenen dosyanın beklenen bir hedef olup olmadığını kontrol etme.
  • İşlemin geçerli dizininin, standart yoldaki döndürülen değerde tam olarak beklendiği gibi olup olmadığını kontrol eder.
  • İzin sisteminin açıkça işlem kapsamına alındığından emin olma (ör. hizmetlerin root olarak çalıştırılmadığından ve dizin izinlerinin belirtilen hizmet veya komut kapsamına alındığından emin olma).