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

Compilar Proyecto de Forma Estricta

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en Java al compilar de forma estricta. Los mensajes de compilación pueden contener información que permita a un atacante la identificación y explotación de vulnerabilidades en la aplicación.

Necesidad

Compilar un proyecto desarrollado en Java de forma estricta.

Contexto

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

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

Solución

Por defecto, Java impone un ambiente de compilación bastante estricto en cuanto al manejo de tipos. Sin embargo, algunas opciones de compilación pueden ser bastante útiles a la hora de ayudar en la producción de un código más seguro.

  1. En general, y como primera regla, no es buena idea compilar un programa en Java usando miembros o clases obsoletas. La opción -deprecation (o - Xlint:deprecation) da mayor información sobre los elementos obsoletos utilizados en el programa. Esto puede ayudar a evitar que los programadores hagan uso de funciones inseguras.

  2. De manera general, las advertencias sobre este tipo de situaciones no deberían ignorarse.

  3. Por ejemplo, se crea una clase que use el método stop de la clase Thread.

    stop.java
    1
    2
    3
    4
    5
    6
    class T implements Runnable {
      public void run() {
        Thread thisThread = Thread.currentThread();
        thisThread.stop();
      }
    }
    
  4. Se nota que compilando del modo tradicional, solamente se informa que se está haciendo uso de clases obsoletas, pero no se ofrece mucho detalle al respecto.

    1
    2
    3
    % javac T.java
    Note: T.java uses or overrides a deprecated API.
    Note: Recompile with -Xlint:deprecation for details.
    
  5. En cambio, al utilizar la opción -deprecation, la información obtenida es mayor, en este caso, si se indica el lugar exacto donde se produce el problema.

    1
    2
    3
    4
    5
    % javac -deprecation T.java
    T.java:5: warning: [deprecation] stop() in Thread has been deprecated
     thisThread.stop();
     ^
    1 warning
    
  6. Se observa que utilizando la opción -Xlint:deprecation se consigue el mismo resultado:

    1
    2
    3
    4
    5
    % javac -Xlint:deprecation T.java
    T.java:5: warning: [deprecation] stop() in Thread has been deprecated
     thisThread.stop();
     ^
    1 warning
    
  7. Por defecto, Java incluye información de depuración sobre el número de línea y el nombre archivo. Sin embargo, esto puede modificarse para que Java no de tanta información. En producción esto no es deseable y se sugiere remover toda la información de depuración

  8. Por ejemplo, se comparará la ejecución del siguiente código.

    1
    2
    3
    4
    5
    class X {
      public static void main(String... args) {
        int x = 5 / 0;
      }
    }
    
  9. Cuando se compila del modo tradicional, se observa que el mensaje de la excepción informa que el error fue producido en la línea 5 en un archivo llamado +X.java.

    1
    2
    3
    4
    % javac X.java
    % java X
    Exception in thread "main" java.lang.ArithmeticException: / by zero
     at X.main(X.java:5)
    
  10. Por el contrario, cuando se compila usando la opción -g:none, simplemente se informa que que la fuente es desconocida:

    1
    2
    3
    4
    % javac -g:none X.java
    % java X
    Exception in thread "main" java.lang.ArithmeticException: / by zero
     at X.main(Unknown Source)
    
  11. Por último, Java permite la generación de archivos clase para los archivos fuente cargados implícitamente. Esto puede ser peligroso, se sugiere deshabilitar esta característica.

    1
    javac -deprecation -g:none -implicit:none
    



Haz un comentario

Estado de los servicios - Términos de Uso