14 - La importancia de las actualizaciones - 21/08/2005


Autor: Lic. Cristian F. Borghello

http://www.segu-info.com.ar



Esta vez no hice nada mal: no recibí ni hice doble click sobre ningún archivo extraño, actualicé el antivirus todos los días y solo tengo mi sistema para enviar y recibir correo. Pero... tengo conexión a Internet, ¿habrá sido ese mi "error"?.


En el caso que nos ocupa siento decir que sí lo fue: un gusano encontró un puerto abierto en mi computadora, en ese puerto "escucha" un programa vulnerable que no había actualizado. Esta vulnerabilidad le permitió al gusano ejecutar un comando y bajar su propio código desde una dirección de Internet. Este código abrió otro puerto instalando un troyano mediante el cual otra persona puede utilizar "mi" computadora. Ahora estoy infectado con un gusano que seguirá buscando otros sistemas para seguir propagándose. Y todo esto sin haber bajado ni ejecutado nada ni haber hecho click en ningún lugar.


Ese párrafo sacado del mejor libro de ciencia ficción tiene una explicación.


Comencemos por las definiciones:

Un Puerto es una interfaz mediante la cual distintos programa se comunican a través de una red enviando y recibiendo diferentes tipos de datos.
Existen 2^16 puertos, es decir 65536 puertas de entrada y salida a nuestra computadora.


Un Gusano es un programa que se replica a sí mismo. Los fines de los mismos pueden ser muy variados y van desde sólo replicarse a causar daño en el sistema infectado.


Un Troyano es un programa, generalmente malicioso, capaz de alojarse en computadoras y permitir el acceso a usuarios externos y ajenos al sistema.


Una Vulnerabilidad es un fallo que compromete la seguridad de un programa o sistema.
Generalmente son errores de programación que pueden ser utilizados para ejecutar código arbitrario, detener el sistema o aprovecharse del mismo para sacar cualquier tipo de beneficio.
Las vulnerabilidades existen porque los desarrolladores de sistemas son personas y como tales son susceptibles de cometer errores. Cada vez que una vulnerabilidad es descubierta, la misma es corregida y se publica el "parche" asociado para que todos puedan subsanar el error.


Un Exploit es un código, un método o un programa, que realiza una acción contra un sistema o programa que tiene una vulnerabilidad, "explotándola", y sacando un beneficio de la misma. Más información aquí.

Si bien puede pensarse que es difícil que se den todas las condiciones de existencia de vulnerabilidades, exploits, inexistencia de parches y sistemas no parcheados; esto es común y queda demostrado por la gran cantidad de gusanos que hoy circulan por Internet.


Con la gran cantidad de computadoras conectadas a Internet ¿por qué fue mi sistema el elegido para ser infectado?. Aquí es donde entran en juego las direcciones IP y los puertos. Cada vez que nos conectamos a Internet se nos asigna una dirección IP y cada puerto de nuestro sistema es abierto (si, los 65536).


Si un programa cualquiera del sistema que utiliza un puerto tiene un error de programación, el mismo es vulnerable, el puerto es vulnerable y el sistema en su totalidad es vulnerable. Nuestra IP es "elegida" aleatoriamente por un programa dañino que busca ese puerto y programa vulnerable específico.


Tenemos todas las cuestiones resueltas excepto que debe haber "alguien" que ejecute el código malicioso. Esta es la mala noticia, no existe ese alguien ya que los programas que "escuchan" en los puertos lo hacen justamente para eso: para realizar una acción cada vez que ingrese un requerimiento al puerto que escuchan. Si estos programas tienen una vulnerabilidad, los mismos puede manipularse, mediante un Exploit, para que ejecuten lo que se desee.


Para graficar esta situación; en Windows el puerto 445 está abierto por defecto, con el objetivo de compartir archivos con sistemas remotos. A este puerto están asociados distintos programas. Si algunos de ellos tiene un error y el mismo es encontrado, como paso en estos días, se puede realizar otro programa (Exploit) que se aproveche del error para realizar una tarea distinta a la original, generalmente algún daño.


Programa Original (1)

  1. Entrada
  2. Guardar 8 bytes para trabajar
  3. Almacenar "1234567" <-- Menos de 8 bytes.
  4. Escribir "1234567" <-- Correcto.
  5. Salida <-- Sale normalmente

Programa con Error (2)

  1. Entrada
  2. Guardar 8 bytes para trabajar
  3. Almacenar "12345678XX" <-- Sobran 2 bytes no válidos. Esto causará un fallo en el programa saliendo con error.
  4. Escribir "1234567" <-- No se llega hasta aquí por el error anterior.
  5. Salida <-- No se llega hasta aquí por el error anterior.

Programa Explotado (3)

  1. Entrada
  2. Guardar 8 bytes para trabajar
  3. Almacenar "12345678Exploit" <-- Si bien hay más de 8 bytes, "Exploit" es un programa válido por lo que será ejecutado en este momento.
  4. Escribir "12345678" <-- Se escriben los 8 bytes esperados.
  5. Salida <-- Sale normalmente.

Programa "Exploit"

  1. Replicarse
  2. Borrar todos los archivos .doc
  3. Salir <-- Vuelve al programa que lo llamó (3).

Como vemos en el último caso, el encargado de ejecutar el código dañino "Exploit" fue el programa original (3), continuando luego su flujo normal sin que el usuario se percate de ello.


Si el autor de un Exploit decide publicarlo, el mismo puede ser utilizado para explotar vulnerabilidades no corregidas. En el caso que exista la correción, existe la posibilidad de estudiar el código del parche (Ingeniería Inversa) y así descubrir el código que fue corregido. De nuevo, con este código, se puede desarrollar un exploit vulnere sistemas aun no parcheados.


Los gusanos que conocemos utilizan los conceptos volcados en estas líneas para aprovecharse de sistemas vulnerables. En esto radica la importancia de aplicar a tiempo las actualizaciones y mantenerse informado sobre los fallos en los sistemas para disminuir los riesgos de que nuestra computadora deje de ser nuestra.


Otras definiciones:

Puerto
Puertos comunes
Gusano
Malware
Parche
Ingeniería Inversaa
IP
Exploit




Buenos Aires, 21 de agosto de 2005



Actualidad

Virus-Antivirus