Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + Tecnología especializada
DXST - SAST - IAST - SCA - DevSecOps
Caja blanca - Caja gris - Caja negra
Atacando Aplicaciones Web, APIs, Apps Móviles,
Cliente Servidor, Servidores, Redes, Dispositivos IoT
IoT SCI: Sistemas de Control Industrial

Validar Tipo de Archivo Usando los Encabezados

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en Scala al validar los tipos de archivos utilizando los encabezados. Al realizar una validación de entradas se aumenta la seguridad de la aplicación evitando diversos tipos de ataques.

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 esta desarrollando una aplicación en lenguaje de programación Scala v2.10.4

  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

Al momento de desarrollar una aplicación es importante realizar un proceso de validación apropiado. Esto se debe a que muchas de las vulnerabilidades de una aplicación pueden ser explotadas a través de sus entradas, lo que las convierte en un blanco común para los atacantes. Por ejemplo, un usuario puede subir un archivo con contenido malicioso que al no ser validado correctamente puede comprometer la integridad de la información confidencial allí consolidada. A continuación te enseñamos cómo validar archivos utilizando los encabezados en el lenguaje Scala.

Dado que el lenguaje no proporciona una biblioteca que permita la detección de tipos de archivo según sus encabezados se hará uso de la biblioteca Mime Type Detection Utility [2] y sus dependencias, Mime Type Detection Utility determina el tipo de archivo revisando los encabezados (magic headers).

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

  1. mime-util-X.X.X.jar

  2. slf4j-api-X.X.X.jar

  3. slf4j-simple-X.X.X.jar

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

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

    creación archivo de prueba
    1
    % echo "fsg" > test.pdf
    
  6. Creamos el archivo Main.java que contendrá el código de la aplicación.

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

    FileExtValidation.scala
    1
    2
    3
    import java.util.Collection
    import java.io.File
    ...
    
  8. 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
    ...
    
  9. Registramos como detector de tipos eu.medsea.mimeutil.detector.MagicMimeMimeDetector (puede usarse cualquier implementación de AbstractMimeDetector).

    1
    2
    3
    4
    object Main{
      def main(args: Array[String]){
        MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
    ...
    
  10. 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
    4
    5
            val f = new File ("test.pdf");
            val mimeTypes = MimeUtil.getMimeTypes(f);
            println(mimeTypes);
        }
    }
    
  11. Finalmente ejecutamos la aplicación para ver los resultados:

    validación de archivo
    1
    2
    % scala -classpath "slf4j-simple-1.7.13.jar:slf4j-api-1.7.13.jar:mime-util-2.1.3.jar" MimeType.scala
    application/octet-stream
    
  12. Podemos darnos cuenta de cómo 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