Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + automatización eficaz

Evitar Código Muerto

Nuestros ethical hackers explican que es el código muerto, algunas de las posibles consecuencias o problemas que se presentan al dejar dicho código en el código fuente de una aplicación y, por último, muestran un ejemplo de dicha problematica en una clase de Java.

Necesidad

Evitar código muerto en Java

Contexto

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

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

  2. Se desea evitar código muerto en la aplicación.

Solución

El código muerto se refiere a secciones de código que son cargadas en memoria o interpretadas pero que nunca son usadas. También se refiere a secciones de código olvidadas que, si no son eliminadas, pueden ocasionar problemas de seguridad. Uno de los mayores problemas de permitir la ejecución de este tipo de código es que se consume tiempo de computo en algo que jamás se llegará a utilizar.

En esta solución se mostrara un fragmento de código muerto en Java y la manera de evitarlo.

  1. Primero, definimos la nueva clase e importamos las clases necesarias desde la biblioteca io.

    dead.java
    1
    2
    3
    import java.io.*;
    
    public class dead {
    
  2. En el método main encontramos el llamado al método listarArchivos el cual retorna la lista de archivos según el parámetro de la ruta. Entre los comentarios, podemos ver una forma antigua de retornar los archivos a través del método ejecutar. Dicho método hace el llamado al sistema operativo del comando especificado.

    1
    2
    3
    4
    5
    6
    public static void main(String[] args) throws Exception {
      // método viejo
      // ejecutar("ls /home/fluid/");
      // método nuevo
      listarArchivos("/home/fluid");
    }
    
  3. El método más seguro para listar los archivos es a través del uso de la clase File.

    1
    2
    public static void listarArchivos(String ruta) {
      File dir = new File(ruta);
    
  4. Dentro del método creamos un array de cadenas que contiene todos los archivos.

  5. Despues, pasamos a imprimir el listado iterando dicho el array previamente creado.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
      String[] archivos = dir.list();
      if (archivos != null) {
        for (int i = 0; i < archivos.length; i++) {
          System.out.println(archivos[i]);
        }
      }
      else {
        System.out.println("La ruta no existe");
      }
    }
    
  6. El antiguo método que no ha sido eliminado, usa el método exec(), el cual es inseguro debido a que hace un llamado al sistema operativo y ejecuta el comando especificado.

  7. Si este método no es eliminado del código, al momento de compilarlo, se mantiene y puede ser usado por clases externas, dichas clases pueden tener contenido malicioso. Además, la misma funcionalidad del código podría permitir a un atacante escalar privilegios en el servidor comprometiendo la confidencialidad, integridad y disponibilidad de la información.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
      public static void ejecutar(String comando) throws Exception {
        String linea = "";
        String resultado = "";
        Process p = Runtime.getRuntime().exec(comando);
        BufferedReader input = new BufferedReader( new InputStreamReader(
          p.getInputStream()));
        while ((linea = input.readLine()) != null) {
          System.out.println(linea);
        }
        input.close();
        p.waitFor();
      }
    }
    

Descargas

Puedes descargar el código fuente pulsando en el siguiente enlace:

dead.java Clase dead muestra el uso de un método antiguo no eliminado.

Referencias

  1. Código muerto

  2. Eliminación de código muerto

  3. REQ.0158: Las funciones, métodos o clases deben ser invocadas en algún escenario funcional del sistema.




Haz un comentario

Estado de los servicios - Términos de Uso