Yol geçişi

OWASP kategorisi: MASVS-STORAGE: Depolama

Genel Bakış

Dosya yolu manipülasyonu güvenlik açıkları, saldırganın, dosya sistemi API'lerine doğrulama olmadan iletilen yolun bir bölümünü kontrol edebilmesi durumunda ortaya çıkar. Bu durum, yetkisiz dosya sistemi işlemlerine yol açabilir. Örneğin, bir saldırgan, hedef dizinin dışına çıkarak kaynak hedefini beklenmedik şekilde değiştirmek için ../ gibi özel karakterler kullanabilir.

Etki

Etki, işleme ve dosya içeriğine bağlı olarak değişir ancak genellikle dosyanın üzerine yazılması (dosya yazılırken), veri sızıntısı (dosya okunurken) veya izin değişikliklerine (dosya ya da dizin izinleri değiştirilirken) yol açar.

Çözümler

File.getCanonicalPath() kullanarak yolu standartlaştırın ve öneki 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;
}

Beklenen sonuçların elde edildiğinden emin olmak için doğrulama kullanmak da en iyi uygulamalardan biridir. Örnekler arasında aşağıdakiler sayılabilir:

  • Yanlışlıkla üzerine yazılmasını önlemek için dosyanın zaten mevcut olup olmadığı kontrol edilir.
  • Veri sızıntısını önlemek veya izinleri yanlışlıkla değiştirmemek için hedeflenen dosyanın beklenen bir hedef olup olmadığını kontrol etme
  • İşlemin geçerli dizininin, kanonik yoldan döndürülen değerde tam olarak beklendiği gibi olup olmadığını kontrol etme.
  • İzin sisteminin, işlemin kapsamına açıkça alındığından emin olun. Örneğin, hizmetlerin root olarak çalışmadığını kontrol edin ve dizin izinlerinin belirtilen hizmet veya komutla sınırlandırıldığından emin olun.