Traversée de répertoire

Catégorie OWASP : MASVS-STORAGE : stockage

Présentation

Les failles de traversée de répertoire se produisent lorsqu'un pirate informatique peut contrôler une partie du chemin, qui est ensuite transmis aux API du système de fichiers sans validation. Cela peut entraîner des opérations non autorisées dans le système de fichiers. Par exemple, un pirate peut utiliser des caractères spéciaux tels que ../ pour modifier de manière inattendue la cible de la ressource, en se déplaçant en dehors du répertoire ciblé.

Impact

Les conséquences varient en fonction de l'opération et du contenu des fichiers concernés, mais conduisent généralement à l'écrasement de fichiers (par l'écriture de fichiers), à des fuites de données (par la lecture de fichiers) ou à des modifications des autorisations (par la modification des autorisations de fichier/répertoire).

Stratégies d'atténuation

Définissez le chemin d'accès canonique à l'aide de File.getCanonicalPath() et comparez le préfixe avec le répertoire attendu :

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

Une autre bonne pratique consiste à utiliser la validation pour vous assurer que seuls les résultats attendus se produisent. Voici quelques exemples :

  • Vérifiez si le fichier existe déjà pour éviter un écrasement accidentel.
  • Vérifiez si le fichier ciblé est une cible attendue pour éviter les fuites de données ou la modification incorrecte des autorisations.
  • Vérifiez l'exactitude du répertoire actuel de l'opération dans la valeur renvoyée par le chemin canonique.
  • Assurez-vous qu'un système d'autorisations est explicitement limité à l'opération, par exemple en vérifiant qu'il n'exécute pas de services en tant que racine, et que les autorisations de répertoires sont limitées au service ou à la commande spécifiés.