Estas aquiContenido / Virus en Linux (I)

Virus en Linux (I)


Portxipi- Publicado el14 Mayo 2006

Por Pablo Garaizar Sagarminaga

El mundo de los virus ha acompañado a la microinformática desde sus inicios. Si bien las plataformas más atacadas han sido las de Microsoft, ha habido incursiones en otros sistemas por parte de los escritores de virus. Linux ha permanecido unos años al margen, con unos pocos virus que eran más una prueba de concepto que una amenaza real... pero quizás esto no haya hecho más que empezar.

Linux es un sistema operativo similar a UNIX, con una breve pero intensa historia. No quiero hablaros de Linus Torvalds y de toda la poesía que rodea a Linux. Para ello podéis visitar www.linux.org ó www.fsf.org y así tener un enfoque más global en cuanto al Software Libre. Centrándonos en el tema técnico, diremos que Linux es compatible con la mayoría del software desarrollado para UNIX comerciales, tiene un kernel monolítico con módulos, y utiliza mayoritariamente ejecutables de tipo ELF o scripts de shell, Perl, etc.

¿Qué es un virus?

Un virus informático es, nada más y nada menos, lo siguiente:

Bien; ésta es la definición formal basada en los estudios de Fred Cohen (el inventor del término "virus informático") que hace las delicias de los matemáticos, pero que sólo está aquí para asustar. Afortunadamente, Cohen da otra definición más asequible de virus informático: "un virus es un programa que es capaz de infectar otros programas modificándolos para que incluyan una copia, quizá evolucionada, de él mismo". Es decir, un virus lo que hace es tratar de añadir una copia de su propio código en otros programas.

Si os fijáis ,nadie ha dicho nada de discos duros destrozados, accesos ilícitos a ordenadores o ficheros secretos, etc. Más adelante veremos lo que es el "payload" de un virus, pero no tiene relación con la esencia de los virus en sí.

¿Qué NO es un virus?

Muchas veces oímos por la calle:

  • "Jo, le voy a meter un virus a mi novia para espiarle lo que hace por Internet."
  • "¿Si? Yo necesito un virus para que el día de la entrega de notas estalle el ordenador central de la Universidad."
  • "Lo malo es que nunca seremos capaces de programar un virus tan potente como el Melissa o el ILoveYou..."

Existe una creencia popular que identifica "virus" con "TODO lo que hace daño al ordenador o a su seguridad". Eso es totalmente falso.

En el primero de los casos, lo que nuestro desconfiado amigo quiere es un programa espía, que normalmente suele presentarse en el formato de troyano o "caballo de Troya". Un troyano es un programa que hace otra cosa distinta a la que se supone que hace. Si nosotros troyanizamos un programa que muestra una felicitación de cumpleaños y le incluímos un programa espía que nos informará de todo lo que hace, cuando mandemos esa felicitación y su receptor la abra, se ejecutará la felicitación y el programa espía, de manera análoga a lo que sucedió con el regalo del caballo de Troya.

En el segundo caso estamos hablando de una "bomba lógica". En este tipo de programas hay una condición de activación ("fecha de la entrega de notas") y un efecto ("estallar el ordenador central de la Universidad"). No es necesario infectar ficheros. Sólo conseguir "instalar la bomba lógica".

El tercer caso habla de "afamados virus de ordenador" de los que se ha hablado en los medios de comunicación. En ambos casos se trataba de "gusanos" o "worms" que en lugar de infectar ficheros, lo que infectaban era ordenadores. Es decir, un gusano es similar a un virus, pero en lugar de infectar ficheros se propaga de ordenador en ordenador. En cuanto a la calidad de los citados gusanos... es como si a alguien todavía le extraña por qué un músico de conservatorio nunca venderá tantos discos en su vida como David Bisbal. Así es este mundo :-D

Muchas veces virus, troyanos, bombas lógicas y gusanos utilizan técnicas de unos y otros entremezcladas, por lo que es difícil establecer fronteras fijas.

Bacterias, programas con vida

El término "virus informático" fue acuñado por Fred Cohen a comienzos de los 80. En mi opinión, no es el nombre más adecuado para este tipo de programas. Un virus biológico destruye las células por las que pasa, monopolizando todo su trabajo vital para su provecho, hasta que termina por matar al organismo. Un virus de computadora puede "convivir" durante años con un sistema de producción, y los buenos virus hacen todo lo posible para no interrumpir la funcionalidad de sus programas "huéspedes".

Yo prefiero llamarlos bacterias, o programas con vida. Quizá esta denominación deje clara mi postura ante los virus de ordenador, y quizá alguno de vosotros estará tirándose de los pelos diciendo: ¿o sea que ahora me dices que los virus de ordenador no son malos? ¿estás loco?. Hay un debate abierto sobre la posibilidad de crear virus benévolos y no me gustaría alargarme en este tema, pero si alguien tiene curiosidad sobre ello, ya proporcionaré bibliografía y referencias acerca de ello.

Repaso de términos relacionados con los virus

Payload

El payload es el efecto de un virus en el sistema. Los virus normalmente se hacen famosos por sus payloads más que por sus métodos de infección. Mucha gente cree que un virus es más o menos potente en función de su efecto destructivo. Esto es absolutamente falso. Un virus mal programado, con un montón de bugs en su código y un payload absurdamente destructivo, podrá salir en los titulares del telediario, pero desde un punto de vista académico o técnico no es más que un aporreo de teclas por parte de algún programador frustrado.

Marca de infección

Los virus, por lo general, necesitan saber si un fichero ha sido infectado ya, para no infectar una y otra vez. Aquí puede residir el punto flaco de un virus en cuanto a su supervivencia: si se define una marca de infección muy específica, ésa será la llave para que un antivirus lo detecte con precisión.

Existen virus famosos que no tenían marca de infección, como el Jerusalem, que infectaba una y otra vez los ficheros y provocaba el colapso en los discos duros.

Actualmente se suelen utilizar marcas de infección muy sutiles, que puedan cumplir ficheros que no estén realmente infectados, para provocar falsos positivos en los antivirus. Si, por ejemplo, definimos como marca de infección que el tamaño del fichero sea múltiplo de 144, no infectaremos a todos los ficheros del sistema, pero un antivirus no podrá detectar el virus usando esa marca de infección, porque habrá muchos ficheros sin infectar que tengan un tamaño múltiplo de 144.

Cavity

Los ficheros y las páginas o segmentos de memoria se guardan en bloques que suelen ser múltiplos de una cantidad fija de bytes (típicamente 4 KB). Cuando la información no ocupa exactamente un múltiplo de ese tamaño de bloque, se hace un rellenado a ceros o "padding" y ese espacio se marca como inútil.

Un virus podrá hacer uso de este espacio sin alterar el tamaño en disco del fichero en el que se aloja. Si cabe en ese "recoveco" cumplirá dos objetivos: pasar desapercibido y meterse dentro del fichero sin corromper ningún dato original.

En la figura siguiente puedes ver un ejemplo de padding en los segmentos de memoria:

Técnicas

Overwrite (sobreescritura)

El método de sobreescritura es el más obvio y el más sencillo de realizar, pero también el más burdo. Consiste simplemente en sobreescribir el host con el código del virus.

Como habréis adivinado, el huésped queda inutilizado, por lo que ocultar la presencia del virus es casi imposible. Además ,el método de infección se convierte en su payload. Un "buen" virus (o mal virus, según se mire) permite que el huésped siga funcionando. Este tipo de infección sólo lo utiliza gente muy vaga o con pocos conocimientos.

Un símil en shell script podría ser el siguiente:

$> cat virus > host

Ejemplo de virus de sobreescritura:

Prepending (copia al principio)

El siguiente paso lógico es que el virus se copie justo antes que el código del huésped, para asegurarse de que el código vírico se va a ejecutar y no interferir en el funcionamiento del huésped.

Este método tiene un inconveniente: es costoso en cuanto a tiempo, y además, variable. Imaginémonos que el virus quiere instalarse en un huésped que es un ejecutable de 500 KBs de tamaño. Para ello deberá almacenar el equivalente al tamaño del virus en un buffer, luego copiarse al principio, e ir repitiendo este proceso de desplazamiento del código huésped hasta el final. También se podría crear un fichero temporal en el que se copiaría el código del virus y luego concatenar el huésped, para, por último, mover el fichero temporal sobre el fichero que contenía al huésped. Ambas alternativas son costosas en cuanto a tiempo y Entrada/Salida, por lo que esta técnica tampoco es muy eficiente.

Siguiendo con los ejemplos en shell script, el método de copia al principio (prepending) podría entenderse de la siguiente manera:

$> cat virus > tmp
$> cat host >> tmp
$> mv tmp host

Ejemplo de proceso de prepending:

Appending (copia al final)

Una vez vistas las limitaciones del método anterior, vamos a ver cómo se las ingenian los virus para que el efecto sea el mismo pero reduciendo el tiempo y la Entrada/Salida. La idea es relativamente sencilla: el virus se copia al del huésped y se pone un salto desde el principio del huésped, hasta el principio del código vírico, y cuando termine el virus, otro salto hasta el comienzo del huésped... ¿Me seguís? Veamos:

- Situacion inicial:
Virus, Huésped (separados)

- Situacion final:
[saltar a Virus]Huésped[Fin]Virus[saltar a Huésped]

La ejecución sería:

1. Saltamos a Virus
2. Virus
3. Saltamos a Huésped
4. Huésped
5. Final

Esquema de appending:

Companion

Un companion virus, como su propio nombre indica, lo que hace es acompañar al fichero "huésped", sin modificarlo. Lo que se suele hacer es mover el fichero original a otro (generalmente oculto) y escribir el código vírico en un fichero con el nombre del original.

Este tipo de infección tiene el inconveniente de que si alguien intenta mover o copiar el fichero original, todo el efecto se perderá, ya que se rompera la "compañía" y el código vírico difícilmente encontrará al "huésped" original.

Multipartite (multiplataforma)

Los virus multiplataforma tienen como peculiaridad la posibilidad de infectar diferentes plataformas. Los casos más espectaculares de este tipo de virus pueden infectar diferentes microprocesadores, haciendo verdaderas virguerías en ensamblador.

Normalmente suele hablarse de un virus multipartite cuando infecta ficheros y el sector de arranque, por ejemplo.

Técnicas anti-bait

Muchos antivirus crean ficheros "cebo" ("bait" o "goat files") para ver si hay un virus en el sistema y comprobar cómo ha cambiado ese fichero. Las técnicas anti-bait pretenden detectar esos ficheros y no infectarlos, saltarse la trampa.

Residencia (+ per-process)

Para poder extenderse por el sistema un virus puede infectar fichero a fichero o directorio a directorio, pero este método es bastante lento. Una alternativa a este método de diseminación es permanecer residente e infectar los ficheros a los que se vaya accediendo.

Esto, en MSDOS o las primeras versiones de Mac, era algo muy fácil de hacer (TSRs), pero conforme los sistemas se han ido complicando, las protecciones han sido cada vez más serias y ahora es bastante difícil conseguir una residencia en RING-0 (el nivel más alto de privilegios dentro del procesador) y lo que se utiliza bastante es la residencia en RING-3 (nivel de usuario) "per-process". Esta técnica la inventó Jacky Qwerty, ex-29a, y consiste en parchear una determinada API (por ejemplo CreateProcess) y asi suplantar todas las llamadas a esa API por parte de los procesos hijos que se crean a partir del ejecutable infectado. Este método de infeccion es bastante ingenioso, ya que con pocos privilegios se pueden infectar muchos ficheros.

Residencia "per-process":

Encriptación (cifrado)

Los primeros antivirus fueron analizadores de cadenas de bytes. Los virus tenían siempre el mismo código, y aislando la parte característica del código del virus, podía detectarse fácilmente con una comprobación (por ejemplo: "Si el fichero contiene 'I Love You, by megah4x0r' entonces ILoveYouDetectado;"). Para tratar de ocultar el código vírico los escritores de virus dividieron el código en dos: una pequeña rutina de desencriptado, y el resto del código vírico encriptado con ese mismo algoritmo.

Virus encriptado:

Poly (polimorfismo)

La anterior técnica oculta el contenido real del virus en cuanto a código, pero sigue generando virus idénticos generación tras generación. Si se combina con el polimorfismo, el virus puede convertirse en una auténtica pesadilla para las casas de antivirus. La idea es que la rutina de encriptado y desencriptado será diferente cada vez, y la clave para encriptar el código vírico será variable. Así, con muchas rutinas de encriptado e infinitas claves posibles, el código del virus va mutando asombrosamente en cada infección, y detectarlo es mucho más difícil.

Para detectar este tipo de virus, en lugar del análisis de cadenas de bytes, se suelen emplear simuladores, que tratan de simular la ejecución del virus para ver si, una vez desencriptado, se trata realmente de un virus.

EPO (Entry Point Obscuring)

Cuando un virus infecta un ejecutable, es bastante normal que cambie el Entry Point o puntero a la dirección de memoria que contiene el comienzo del código ejecutable. Antes, al explicar la infección postpending o de copia al final, ocurría esto: el virus cambia el puntero que apunta al comienzo del código por un puntero que apunta al comienzo de SU código, para asegurarse que será lo primero que se ejecute.

Este método es sencillo, pero muy fácilmente detectable por un antivirus. GriYo, de 29a, ideó una técnica para hacer esto menos transparente, que consiste en ocultar el salto al código vírico dentro del código del fichero infectado. Es decir, el virus deja que el fichero infectado se ejecute normalmente durante unas instrucciones para que el antivirus no lo detecte, y poco después, lanza su código.

Entry Point Obscuring:

[En el segundo capítulo nos adentramos ya en las peculiaridades de los virus para Linux.]

Etiquetas

Comentarios

Selecciona arriba tu forma preferida de visualizar los comentarios y pulsa el botón para guardar tu elección para próximas visitas (sólo si eres usuario registrado).

Fántastico trabajo. Lo que me fastidia es que se titule ""Virus en Linux" y en realidad se trate de "Introducción a los virus informáticos".

Un saludo y que no pare la cosa! ;)

ADobles

Que ya tengo la segunda entrega en el disco duro ;)

Hay un pequeño detalle. Conozco muy bien el virus Jerusalem porque fue la primera vez que llegaba un virus y estaba estudiando así que tuve tiempo de desensamblarlo por completo.

El virus SÍ tenía marca de infección, la cual eran los conocidos caracteres "sUMsDos" (no recuerdo si las mayúsculas y minúsculas eran esas exactamente). El problema era que tenía un bug y en los .exe fallaba la comprobación. En el caso de los .com funcionaba correctamente.

Alejandro Nestor Vargas

Alejandro Nestor Vargas

Muy buen artículo, solo apuntar que los de tipo campanion, en los viejos tiempos (msdos) a veces no movian el fichero original, si no que creaban copias .COM con el mismo nombre que programas .EXE

Debido a la prioridad si ejecutabas con: > PROGRAMA [INTRO] se ejecutaba antes el .COM virico, que luego ejecutaba el EXE.

Ya espero la proxima entrega :)

No hay más Fuego en el Infierno del que hay en nuestras Almas.

Me encanta el artículo y me alegro de ver que tiene un (I) en su título, porque esto significa que tendremos más y mejor :P.

Pero me gustaría criticar una de las partes del artículo, más concretamente Bacterias, programas con vida

Aquí dices que:

Un virus biológico destruye las células por las que pasa, monopolizando todo su trabajo vital para su provecho, hasta que termina por matar al organismo. Un virus de computadora puede "convivir" durante años con un sistema de producción

Pero esto es Incorrecto.

Los virus líticos y lisogénicos evidentemente si que destruyen al organismo al que infectan porque producen la lisis de sus células, pero también existen muchos otros virus denominados Virus Persistentes que pueden mantener viva a la célula produciendo nuevos virus.

En Resumen:
Un Virus es "biológico" por concepto, No tienen en absoluto la necesidad de matar al huésped al que infecta.

PD: Si quieren pueden leer más en Ciclo reproductivo de los virus en la wikipedia por ejemplo.

PD:PD: Anque el tema queda un poco offtopic por ser mas de biología que de seguridad, pienso que es importante que todos los conocimientos que podamos adquirir en Kriptopolis sean de un tema u otro deben de ser correctos y libres de errores. Por todo lo demás Felicidades por el Excelente Articulo.

Lo dicho, me han encantado las aportaciones que habéis ido haciendo al artículo, coincido en todas ellas:

1) anv: Tienes razón, el Jerusalem fue famoso por sus reinfecciones, pero no por carecer de marca de infección, sino por un bug en el código. Gracias por el apunte.

2) Sr. Oscuro: Sí, recuerdo la precedencia de los .COM frente a los .EXE en las llamadas desde el COMMAND.COM si no se especificaba la extensión. Ese era un truco muy usado, pero el enfoque más genérico de un companion sí es el de mover el huesped a otro sitio y reemplazar el nombre del huesped con el código vírico. Recuerda que el artículo pretende servir de introducción a los Virus en Linux, y en Linux como en cualquier UNIX, las extensiones de los nombres de ficheros no funcionan como en DOS. De todas maneras, es entrañable que todos nos acordemos de aquellos trucos de hace ¿tanto? tiempo ;-)

3) Kain06, muchas gracias por la precisión. Mis conocimientos de biología se remontan al bachillerato y a las pocas asignaturas que he tenido relacionadas con ella durante la universidad. Gracias de verdad por mejorar el artículo con la clase sobre virus.

Dado que este es un texto copyleft, quizá podamos hacer una versión 2.0 entre todos con las sugerencias y correcciones que estáis aportado :-)

Un saludo,

Pablo Garaizar Sagarminaga

A todo esto me sigo preguntando hacia dónde nos quieres llevar. ¿Virus en Linux?. Cuando precisamente dichos programas no se prodigan mucho en ese OS. Estoy intrigado. En VX Heaven apenas cuenta con 188 ejemplares para dicha plataforma contra los 37mil de su colección. ¿a dónde nos quieres llevar ?
________________________________________________________
Alex Bergonzini :: http://www.bergonzini.com
*** GPG Public Key available

________________________________________________________
Alex Bergonzini :: http://www.bergonzini.com
*** GPG Public Key available

Hola,

no os quiero llevar a ningún lado, solamente comentar la breve y escueta historia de esos menos de 200 ejemplares, explicar cómo se han ido adaptando técnicas de otros SOs como la infección per-process y hacia dónde puede ir el futuro en este tema.

Está clarísimo que hoy en día los virus para GNU/Linux no son ninguna amenaza, y supongo que así seguirá siendo por bastante tiempo, aunque hay unos cuantos mitos que convendría desterrar como el de que "GNU/Linux es invulnerable a los virus".

Supongo que cuando salga la segunda entrega del artículo, se entenderá el objetivo de esta primera parte ;-)

Sigue txipi sigue, que me da que hay algo de falsa sensación de seguridad con la intrísecamente mayor impermeabilidad de los sistemas GNU/Linux|BSD&Co. a los virus y un poco de realidad al respecto (aunque sea en plan hipotético) va a resultar muy saludable.

Patrocinadores

Kriptópolis alojado en
Zilos-Veloxia Network

Tu mejor defensa:
Bufet Almeida