Recorrido de ruta de acceso
Organiza tus páginas con colecciones
Guarda y categoriza el contenido según tus preferencias.
Categoría de OWASP: MASVS-STORAGE: Almacenamiento
Descripción general
Las vulnerabilidades de salto de directorio se producen cuando un atacante puede controlar parte de la ruta que luego se pasa a las APIs del sistema de archivos sin validación. Esto puede generar operaciones de sistema de archivos no autorizadas. Por ejemplo, un atacante podría usar caracteres especiales, como ../
, para cambiar el destino del recurso de forma inesperada, mientras se desplaza fuera del directorio de destino.
Impacto
El impacto varía según la operación y el contenido del archivo, pero, en general, provoca el reemplazo de un archivo (cuando se escriben archivos), la filtración de datos (cuando se leen archivos) o los cambios de permisos (cuando se cambian los permisos del archivo o del directorio).
Mitigaciones
Canonicaliza la ruta con File.getCanonicalPath()
y compara el prefijo con el directorio esperado:
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;
}
Una práctica recomendada adicional es usar la validación para garantizar que solo se produzcan los resultados esperados. Estos son algunos ejemplos:
- Verifica si el archivo ya existe para evitar un reemplazo accidental.
- Verifica si el archivo de destino es un destino esperado para evitar que se filtren datos o se cambien los permisos de forma incorrecta.
- Verifica si el directorio actual de la operación es el que se espera en el valor que se muestra de la ruta canónica.
- Comprueba que un sistema de permisos tenga un alcance explícito para la operación, como verificar que no ejecute servicios como raíz y asegurarse de que los permisos del directorio tengan alcance en el servicio o el comando especificados.
Recomendaciones para ti
El contenido y las muestras de código que aparecen en esta página están sujetas a las licencias que se describen en la Licencia de Contenido. Java y OpenJDK son marcas registradas de Oracle o sus afiliados.
Última actualización: 2023-12-14 (UTC)
[null,null,["Última actualización: 2023-12-14 (UTC)"],[],[],null,["# Path traversal\n\n\u003cbr /\u003e\n\n**OWASP category:** [MASVS-STORAGE: Storage](https://mas.owasp.org/MASVS/05-MASVS-STORAGE)\n\nOverview\n--------\n\nPath traversal vulnerabilities occur when an attacker can control part of the\npath that is then passed to the file system APIs without validation. This can\nlead to unauthorized file system operations. For example, an attacker might use\nspecial characters such as `../` to unexpectedly change the resource target, by\ntraversing outside of the targeted directory.\n\nImpact\n------\n\nThe impact varies depending on the operation and file content, but generally\nleads to a file overwrite (when writing files), data leak (when reading files),\nor permission changes (when changing file or directory permissions).\n\nMitigations\n-----------\n\nCanonicalize the path using [`File.getCanonicalPath()`](/reference/java/io/File#getCanonicalPath()) and compare the\nprefix with the expected directory: \n\n### Kotlin\n\n @Throws(IllegalArgumentException::class)\n fun saferOpenFile(path: String, expectedDir: String?): File {\n val f = File(path)\n val canonicalPath = f.canonicalPath\n require(canonicalPath.startsWith(expectedDir!!))\n return f\n }\n\n### Java\n\n public File saferOpenFile (String path, String expectedDir) throws IllegalArgumentException {\n File f = new File(path);\n String canonicalPath = f.getCanonicalPath();\n if (!canonicalPath.startsWith(expectedDir)) {\n throw new IllegalArgumentException();\n }\n return f;\n }\n\nAn additional best practice is to use validation to ensure only expected\noutcomes occur. Examples include the following:\n\n- Checking if the file already exists to prevent an accidental overwrite.\n- Checking if the targeted file is an expected target to prevent leaking data or incorrectly changing permissions.\n- Checking if the current directory of the operation is exactly as expected in the return value from the canonical path.\n- Ensuring a permissions system is explicitly scoped to the operation, such as checking that it isn't running services as root, and ensuring that the directory permissions are scoped to the service or command specified."]]