¿Cómo proteger el código de las aplicaciones de Windows contra el paso de ruta?

3

Estoy escribiendo un servidor HTTP simple en Lua y aunque puedo encontrar fácilmente recursos sobre cómo protegerme contra el cruce de directorios de Unix, ya encontré algunas advertencias en la versión de Windows. Mientras que ya estoy buscando C:\ al principio (C es "cualquier letra" aquí), ../ y /.. (con barra diagonal inversa también como delimitador de directorio) y \ al principio. El código se pasará a ANSI C fopen() , compilado bajo Microsoft Visual C ++ v10 (no tengo idea de cómo se llama el sistema al que se compila esta llamada). ¿Hay otras trampas que debería vigilar en este caso?

Solo me interesan las soluciones que impliquen la modificación de mi código, y más preferiblemente, verificando el nombre del archivo con los patrones.

    
pregunta d33tah 12.09.2013 - 15:26
fuente

1 respuesta

7

Las rutas en Windows son relativamente complejas . En particular, Microsoft tiene el hábito de inventar nuevas características, por lo que incluso si su servidor HTTP está realmente protegido contra el paso de ruta today , puede volverse vulnerable en la próxima versión de Windows, posiblemente incluso en una pequeña actualización. / p>

En este momento, estás utilizando el "pensamiento de lista negra": estás intentando enumerar todas las construcciones "malas" y detectarlas específicamente. Se sabe que las listas negras son frágiles porque es muy difícil ser exhaustivas, y luego seguir siendo exhaustivas. Debería utilizar el pensamiento de lista blanca , es decir, definir una sintaxis para rutas permitidas y excluir todo lo demás.

Por ejemplo, defina que una ruta permitida consiste en una secuencia de componentes separados por caracteres de barra ("/", no "\"), con las siguientes reglas:

  • Un componente contiene solo letras, dígitos, guiones ("-"), guiones bajos ("_") o puntos (".").
  • Es posible que un punto no aparezca como primer o último carácter en un componente.
  • No debe haber dos puntos consecutivos en un componente.
  • Un componente contiene al menos un carácter y como máximo 64 caracteres (límite arbitrario).
  • No pueden aparecer dos barras diagonales consecutivas en una ruta.
  • Una ruta no comienza con una barra inclinada.
  • Un camino no está vacío.
  • La longitud total de una ruta no debe exceder los 250 caracteres.

Todas estas reglas son fáciles de aplicar mediante programación. Y garantizan una "ruta local limpia" que puedes enviar a fopen() . Tenga en cuenta que la mayoría de las funciones de Windows están perfectamente satisfechas con la "/" como separador, pero es posible que desee reemplazar todas las barras diagonales con barras invertidas ( después verificando todas las reglas anteriores, por supuesto).

    
respondido por el Tom Leek 12.09.2013 - 15:38
fuente

Lea otras preguntas en las etiquetas