¿Cómo mitigo el cruce de directorios cuando la entrada suministrada por el usuario es un caso de negocio obligatorio?

2

Tengo una instancia en la que tenemos una aplicación que requiere la capacidad de configurar comandos sftp que son especificados por los usuarios administrativos. Se configuran a través del front-end de la aplicación. Veracode ha identificado correctamente un ataque de cruce de directorios aquí.

Trabajo para una empresa B2B, y este proceso sftp es para que nuestros clientes envíen / reciban archivos que especifiquen estructuras de directorios en su propio sistema.

La conexión se maneja a través de una API y la biblioteca actual escapa correctamente los datos como entrada (es decir, si envío "../ & & rm *", se trata como un directorio a "cd" a. El archivo de destino para ser copiado, el sistema lo controla explícitamente, pero eso no significa que siempre sea así.

Pero, a falta de una lista negra de ciertos directorios, las rutas como "../" me pierden en cuanto a otras estrategias en el nivel de aplicación que posiblemente pueda usar para evitar este ataque.

Información adicional

Podría haber estado mal comunicado: el problema es que nuestra aplicación se ejecuta en nuestros servidores como su propia instancia. Chroot jails está bien en nuestro extremo, pero ¿qué pasa con el servidor del cliente? La lógica empresarial es que depositaremos los archivos en un directorio en un sistema que especifiquen. No tenemos control sobre eso, y deberían tener la flexibilidad para poder especificar con precisión en qué directorio quieren que nuestra aplicación deposite sus archivos.

No me gustan los enfoques de listas negras porque nunca sabes lo que te perdiste. Y, en teoría, este proceso podría configurarse para apuntar a un cuadro de Windows en lugar de a un cuadro de Unix, y luego hay dos conjuntos de reglas de lista negra que de repente tiene que codificar, sin mencionar la detección del entorno en el servidor remoto.

    
pregunta avgvstvs 21.03.2014 - 17:52
fuente

2 respuestas

2
  1. chroot las cárceles. Cada cliente debe conectarse a una jerarquía de directorios que no se pueda atravesar a) el sistema o b) otros clientes.
  2. Validación de entrada. Sí, debería incluir en la lista negra cosas como ../, $, *, etc. Si tiene control sobre la API, puede hacerlo aún mejor, como probar la existencia de un directorio antes de intentar pasarlo a CD. Como pasa con la programación defensiva, esto no es ciencia espacial, así que sí, hay un poco de trabajo pesado, pero es lo correcto.
respondido por el gowenfawr 21.03.2014 - 19:49
fuente
1

La siguiente lógica protegería normalmente contra el cruce de directorios:

  • el directorio / nombre de archivo debe expandirse a su ruta canónica absoluta + que resuelva ../ y así sucesivamente, consulte getCanonicalPath
  • compare la ruta con una lista blanca de rutas permitidas

No hay listas negras involucradas.

No estoy seguro si entiendo completamente su caso o su inquietud específica, pero lo anterior tiende a funcionar para un gran número de casos de uso.

    
respondido por el Sandro Gauci 21.03.2014 - 20:42
fuente

Lea otras preguntas en las etiquetas