Joven hacker sonriendo

Validar Tipo de Archivo Usando los Encabezados

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en Java al validar los tipos de archivos utilizando los encabezados. Esta práctica permite evitar ataques de tipo directorio transversal, reforzando así la seguridad de la aplicación.

Necesidad

Validar tipo de archivo usando los encabezados.

Contexto

A continuación se describen las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. Se está desarrollando una aplicación con Java.

  2. Se necesita validar la entrada de datos, específicamente validar el tipo de archivo a ser manipulado.

  3. Se requiere determinar el tipo de archivo usando mecanismos más confiables que solo revisar la extensión.

Solución

Los ataques de tipo directorio transversal se producen cuando una aplicación no cuenta con un nivel de seguridad y validación adecuado. Consiste en que un usuario sin privilegios es capaz de escalar a directorios superiores, visualizando los contenidos de las carpetas y archivos allí contenidos. Esto supone un riesgo para la confidencialidad de los datos presentes en esos archivos. Existen muchas formas de abordar este problema, en el caso de este artículo nos enfocaremos en realizar una validación del tipo de archivo haciendo uso de los encabezados. Para ello debemos seguir los siguientes pasos:

  1. Se hará uso de la biblioteca Mime Type Detection Utility [2], la cual determina el tipo de archivo revisando los encabezados (magic headers).

  2. La aplicación requiere que las dependencias listadas a continuación se encuentren en el classpath [2] [3]:

  3. mime-util-X.X.X.jar

  4. slf4j-api-X.X.X.jar

  5. slf4j-simple-X.X.X.jar

  6. Una opción rápida para agregar clases al classpath es copiando los jar a [jre path]/lib/ext/

  7. Inicialmente creamos un archivo a utilizar en las pruebas que denominaremos test.pdf, cuyo único contenido sera la palabra fsg:

    sample text
    1
    2
    $ cat test.pdf
    fsg
    
  8. Creamos el archivo Main.java que contendrá el código de la aplicación.

  9. Importamos la interfaz java.util.Collection para contener la lista de tipos de archivo y java.io.File que representará el archivo a procesar.

    1
    2
    3
    import java.util.Collection;
    import java.io.File;
    ...
    
  10. Importamos la clase eu.medsea.mimeutil.MimeUtil que será la encargada hacer todo el proceso de consulta del tipo de archivo.

    1
    2
    import eu.medsea.mimeutil.MimeUtil;
    ...
    
  11. Registramos como detector de tipos a eu.medsea.mimeutil.detector.MagicMimeMimeDetector (puede usarse cualquier implementación de AbstractMimeDetector).

    ValidateFile.java
    1
    2
    3
    4
    public class Main {
      public static void main(String[] args) {
        MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
    ...
    
  12. A continuación creamos una instancia de File referenciando a nuestro archivo de prueba test.pdf, la cual se envía al método getMimeTypes para retornar una colección con los tipos de archivos detectados y mostrarlos por la salida estándar.

    1
    2
    3
    File f = new File ("test.pdf");
    Collection mimeTypes = MimeUtil.getMimeTypes(f);
    System.out.println(mimeTypes);
    
  13. Compilamos y ejecutamos la aplicación:

    1
    2
    3
    4
    $ javac -classpath .:mime-util-2.1.3.jar:slf4j-api-1.6.4.jar:slf4j-simple-1.6.4.jar Main.java
    
    $ java -classpath .:mime-util-2.1.3.jar:slf4j-api-1.6.4.jar:slf4j-simple-1.6.4.jar Main
    application/octet-stream
    
  14. Vemos como este mecanismo no tuvo en cuenta la extensión y determinó correctamente que eran datos arbitrarios.




Haz un comentario

Estado de los servicios - Términos de Uso