2012-04-10 24 views
6

Una revisión de seguridad de Fortify nos informó de algunas vulnerabilidades de manipulación de rutas. La mayoría han sido soluciones obvias y fáciles, pero no entiendo cómo solucionar la siguiente.Manipulación de rutas (vulnerabilidad de seguridad)

string[] wsdlFiles = System.IO.Directory.GetFiles(wsdlPath, "*.wsdl"); 

"wsdlPath" es la entrada de un cuadro de texto. ¿Es esto algo que simplemente no se puede arreglar? Puedo validar que la ruta existe, etc. pero ¿cómo ayuda eso a la vulnerabilidad?

+1

¿Cómo se ejecuta ese código? Si se trata de una aplicación de Windows que se ejecuta con las credenciales del usuario que ingresa el 'wsdlPath', no veo nada incorrecto. Si se ejecuta en un servicio de Windows o como parte de un sitio web, es un problema. –

+0

¿La revisión Fortify proporcionó la cadena inyectada? – Tung

+0

@AndersAbel - aplicación web. un usuario autenticado ingresa a la ruta, y si es una ruta válida, entonces es aceptada. – Induster

Respuesta

8

Si los datos siempre se obtienen de un cuadro de texto cuyos contenidos son determinados por el usuario, y el código se ejecuta con los permisos de ese usuario, entonces la única amenaza es la del usuario que ataca ellos mismos. eso no es una amenaza interesante.

la vulnerabilidad la que la herramienta está tratando de avisarle a es que si baja confianza código hostil puede determinar el contenido de esa cadena, entonces el código hostil puede montar un intento de descubrir hechos sobre la máquina del usuario, como "¿es tal o cual programa que sé que tiene una vulnerabilidad de seguridad instalada y sin parchear?" o "¿hay un usuario llamado 'admin' en esta máquina?", y así sucesivamente.

+0

El único usuario que puede acceder a esta página es un administrador del sistema. Solo hay unas pocas personas con acceso de nivel de administrador. Supongo que esto es suficiente "control de daños" para considerar esta vulnerabilidad "baja". Simplemente no veo ninguna manera de hacer esto más fuerte de lo que es. Gracias por tu contribución. – Induster

+0

Marqué esto como la respuesta porque el usuario autenticado que ingresa esta información no va a obtener ninguna información útil para ellos. Un usuario final, sí absolutamente ...pero ese no es el caso aquí. – Induster

+0

@Induster: lo fortaleces al asegurarte de que la entrada se filtre para permitir solo la ruta y los nombres de archivo válidos. Sí, el acceso de administrador solo mitiga las cosas, pero ¿qué sucede si un atacante obtiene acceso de administrador, esto podría permitirle obtener acceso al servidor en sí, no solo a su aplicación. –

2

Nunca debe alimentar nada directamente a la API del sistema operativo sin filtrar. Debe desinfectar la entrada, asegúrese de que no contenga rutas (es decir, "../../../somefile" Y asegúrese de que trunca nombres largos, y contiene solo caracteres de nombre de archivo válidos (por ejemplo, ha habido varios errores relacionados con caracteres internacionales)

+0

La entrada se está manejando como debería. Obviamente, esto estaba marcado con letras rojas porque se origina a partir de la entrada del usuario. Pero eso necesita permanecer intacto. Para mí, parece que no hay nada que podamos hacer aquí excepto eliminar la entrada del usuario, que no es una opción. Quizás alguien pueda ver algo aquí que yo no puedo ver. – Induster

+1

@Induster - Su respuesta es desconcertante. ¿A qué te refieres con "la entrada se está manejando como debería"? Sus comentarios indican que no es así. Debe desinfectar la entrada para asegurarse de que no está alimentando datos ilegales en una API de sistema operativo, o rutas a archivos que no deberían permitirse. Si crees que es perfectamente aceptable que un usuario ingrese, di el archivo de contraseña del sistema, entonces oye ... olvídate de haber dicho algo. –

1

Con ese código, cualquier usuario que esté autenticado y autorizado para usar esa función, puede acceder al sistema de archivos en el servidor. El acceso se realizará utilizando las credenciales de la cuenta de servicio que ejecuta la aplicación web.

Dependiendo de cómo se usen los datos devueltos, un usuario malintencionado podría obtener más información o hacer que el servidor se comporte de una manera no prevista.

Debe limitar el conjunto de rutas permitidas para que solo consten de uno o unos pocos directorios cuidadosamente seleccionados. Utilice las funciones de la clase Path para combinar cadenas en rutas; se encargan de cosas como que un usuario ingrese c:\allowedpath\..\windows\system32 por usted.