Tengo una solución a los problemas de manipulación de rutas de Fortify.
Lo que se queja es que si tomas datos de una fuente externa, entonces un atacante puede usar esa fuente para manipular tu ruta. Por lo tanto, al permitir que el atacante elimine archivos o ponga en peligro su sistema.
El remedio sugerido para este problema es usar una lista blanca de directorios confiables como entradas válidas; y, rechazar todo lo demás.
Esta solución no siempre es viable en un entorno de producción. Por lo tanto, sugiero una solución alternativa. Analizar la entrada para una lista blanca de caracteres aceptables. Rechazar desde la entrada, cualquier carácter que no quieras en la ruta. Podría ser eliminado o reemplazado.
A continuación hay un ejemplo. Esto pasa la revisión de Fortify. Es importante recordar aquí para devolver el literal y no el carácter que se comprueba. Fortify realiza un seguimiento de las partes que provienen de la entrada original. Si usa alguna de las entradas originales, aún puede obtener el error.
clase pública CleanPath {
public static String cleanString(String aString) {
if (aString == null) return null;
String cleanString = "";
for (int i = 0; i < aString.length(); ++i) {
cleanString += cleanChar(aString.charAt(i));
}
return cleanString;
}
private static char cleanChar(char aChar) {
// 0 - 9
for (int i = 48; i < 58; ++i) {
if (aChar == i) return (char) i;
}
// 'A' - 'Z'
for (int i = 65; i < 91; ++i) {
if (aChar == i) return (char) i;
}
// 'a' - 'z'
for (int i = 97; i < 123; ++i) {
if (aChar == i) return (char) i;
}
// other valid characters
switch (aChar) {
case '/':
return '/';
case '.':
return '.';
case '-':
return '-';
case '_':
return '_';
case ' ':
return ' ';
}
return '%';
}
}