En este artículo trataremos de seguir la vía del nacimiento del “instinto de conservación” de los programas nocivos, su evolución bajo la presión de condiciones cada vez más adversas y hacer una estimación de la situación actual.
Pero antes es necesario determinar qué significado tiene para nosotros la expresión “autodefensa de los programas nocivos”. Su sentido no es tan simple como parece a primera vista. Atacar al antivirus es, a todas luces, un tipo de autodefensa. El ocultar las huellas de sus actividades también es, en cierto sentido, autodefensa, aunque ya no tan patente. Pero no es tan evidente que la misma evolución de los programas nocivos sea una especie de autodefensa. Sin embargo, lo es. Sobre todo porque una de las motivaciones del autor de virus para buscar nuevas plataformas de infección y nuevas grietas en el sistema es el deseo de hacer que sus criaturas salgan a la luz, a ese campo adonde no mira nadie porque nunca se encontró nada allí.
Para evitar confusiones en qué considerar tecnología de autodefensa y qué no, analizaremos sólo los métodos más populares y evidentes que usan los programas nocivos para su autodefensa. En primer lugar tenemos diversas formas de modificación y empaquetamiento del código, el camuflaje en el sistema y la alteración del funcionamiento de los sistemas de protección antivirus.
Espacio de clasificación
Los métodos de autodefensa de los programas nocivos son muy numerosos y diversos, por lo que se pueden usar diferentes criterios de clasificación. Algunas de las tecnologías de defensa apuntan a evadir los antivirus basados en firmas; otros, a dificultar que el código sea analizado por los especialistas. Un programa nocivo trata de camuflarse lo mejor posible en el sistema, mientras que otro, para no perder el valioso tiempo del ordenador, se ocupa de buscar y “fusilar” determinados antivirus. Además, hay métodos que se pueden clasificar de diferentes maneras y en diversas categorías.
Como nuestro objetivo no es crear un sistema severo de clasificación de las tecnologías de autodefensa, usaremos un sistema de clasificación que nos permita orientarnos de forma intuitiva. Nuestro fundamento serán dos parámetros que, a nuestro parecer, son los más esenciales y construiremos un sistema especial de coordenadas en cuyos ejes pondremos estos parámetros.
El primer parámetro es el nivel de actividad autodefensiva del programa nocivo. Los representantes más “pasivos” de la fauna digital no pueden defenderse por sí mismos, es decir, no contienen un código que los ayude a hacerlo. Pero tienen una especie de coraza creada por su autor. En cambio, en los más “activos” la autodefensa se convierte en una agresión dirigida.
El segundo parámetros es el nivel de especialización de la defensa del programa nocivo. La especialización más específica de la defensa la tienen los programas nocivos que de una forma u otra interfieren con el funcionamiento de un antivirus en concreto. La defensa más general (“contra todo”) la tienen los programas que aspiran a hacer su presencia en el sistema lo más imperceptible que sea posible en todos los sentidos.
En este sistema de coordenadas pondremos los tipos de autodefensa de los programas nocivos. Es necesario tener en cuenta que el diagrama presentado no es más que una ilustración tentativa, que nos permitirá orientarnos en las tecnologías de autodefensa de los programas nocivos. Este modelo es una construcción subjetiva del autor, que sin embargo está basada en el riguroso análisis del comportamiento de los programas nocivos.
Fig. 1. Espacio de las tecnologías de autodefensa
Cada uno de los métodos de autodefensa del programa nocivo resuelve una o varias tareas. He aquí las tareas más importantes:
- dificultar que el virus sea detectado mediante métodos de firmas;
- dificultar el análisis del código del virus a los especialistas;
- dificultar la detección del programa nocivo en el sistema;
- entorpecer el funcionamiento de los programas de protección (antivirus, cortafuegos, etc.).
En este artículo analizaré sólo los programas nocivos para el sistema operativo Windows (y para su predecesor, DOS), debido a la escasa popularidad y, como consecuencia, el casi ausente desarrollo de programas nocivos para otras plataformas. Todas las tendencias observadas en este artículo respecto a los programas nocivos ejecutables (EXE, DLL, SYS) con las debidas particularidades, se refieren también a los virus de macros y script, por lo que no mencionaré a estos últimos aparte.
Fuentes: polimorfismo, ofuscación y cifrado
Tiene sentido analizar el polimorfismo, la ofuscación y el cifrado juntos, ya que todos ellos resuelven las mismas tareas, en diferentes proporciones. Al principio, la modificación del código del programa nocivo tenía dos objetivos: dificultar la detección del fichero y complicar el análisis del código a los especialistas.
La historia de los programas nocivos empieza en los años 70, y la historia de su autodefensa a finales de los 80. El primer virus que trató de resolver la tarea de defender su cuerpo contra los antivirus de aquel entonces fue el virus para DOS Cascade (Virus.DOS.Cascade). Su autodefensa consistía en el cifrado parcial de su propio código. Esta tarea no fue resuelta, ya que cada ejemplar del virus, a pesar de ser único, contenía una parte invariable, que lo traicionaba y permitía que los antivirus lo detectasen. Sin embargo, dio un nuevo rumbo a los creadores de virus y dos años más tarde apareció el primer virus polimórfico, Chameleon (Virus.DOS.Chameleon), conocido también bajo el nombre de “1260”. Su pariente, Whale, utilizaba un complejo cifrado y ofuscación para defenderse. Dos años después empezaron a aparecer los así denominados generadores polimórficos, que se podían tomar como una solución lista para ser usada en la defensa del código de los programas nocivos.
En este punto es necesario aclarar por qué la modificación del código es una forma de oponerse a la detección de ficheros maliciosos y cómo funciona esta detección.
Hasta estos últimos años el funcionamiento de los antivirus estaba basado exclusivamente en el análisis del código del fichero. Este método, de la detección por firmas, se basaba en la búsqueda de secuencias de bytes, por lo general ubicadas a una distancia fija del inicio del fichero, en el código binario del programa nocivo. El método heurístico, que apareció un poco más tarde, también trabajaba con el código del fichero, pero se basaba en una búsqueda más libre de secuencias de bytes que pudieran pertenecer a un programa nocivo. Es evidente que si cada copia del programa nocivo está compuesta por diferentes secuencias de bytes, le será muy fácil evadir también esta forma de defensa.
El polimorfismo y el metamorfismo son los que resuelven esta tarea. La esencia de estos métodos, sin adentrarnos en detalles técnicos, es que cada nueva copia del programa nocivo es una mutación completa del conjunto de bytes que la componen. Pero sus funciones siguen siendo las mismas. El cifrado y la ofuscación están dirigidos sobre todo a dificultar el análisis del código, pero realizados de determinada manera, pueden resultar ser diversas modalidades de polimorfismo: por ejemplo, en el virus Cascade, el cifrado de cada copia del virus con una llave única. La ofuscación en sí sólo dificulta el análisis, pero si es diferente en cada copia del programa nocivo, obstaculiza a su vez la detección por firmas. Quiero subrayar: no se puede decir que una de las técnicas mencionadas arriba sea más efectiva que otras desde el punto de vista de la autodefensa del programa nocivo. Por el contrario, la efectividad de la técnica depende de las circunstancias concretas y de los métodos de su implementación.
El polimorfismo recibió una amplia difusión sólo en la época de virus DOS que infectaban ficheros. Y esto tiene sus causas. Escribir un código polimórfico es una tarea peculiarmente compleja y que se justifica sólo en los casos en los que el programa nocivo se reproduce por su propia cuenta: cuando cada nuevo ejemplar representa un conjunto más o menos original de bytes. Para la mayoría de los troyanos modernos que no cuentan con una función de reproducción, es una característica innecesaria. Por eso, cuando terminó la época de los virus DOS, el polimorfismo empezó a encontrarse con menos frecuencia en los programas nocivos y se usaba más para la autoafirmación del creador de virus que como una función “útil” desde el punto de vista del programa nocivo.
Fig. 2. Código polimórfico de P2P-Worm.Win32.Polip
En cambio, la ofuscación, al igual que los demás métodos de modificación del código, dificulta más el análisis del código y no la detección, y por eso no pierde su vigencia.
Fig. 3. Diagrama del código ofuscado de Trojan-Dropper.Win32.Small.ue
Desde que los métodos de detección de conductas empezaron a desplazar a los de firmas, las técnicas de modificación del código están perdiendo aceleradamente su capacidad de îbstaculizar la detección de los programas nocivos. Por eso, el polimorfismo y las tecnologías adyacentes no son populares ahora y son sólo un medio de dificultar el análisis del código.
Los virus furtivos (Stealth)
El ocultar un programa nocivo en el sistema fue la segunda forma de defensa contra la detección que los creadores de virus implementaron en la época del DOS. Esta técnica se usó por primera vez en 1990, en el arsenal del virus Whale. Su esencia consiste en que el virus oculto intercepta de una forma u otra los servicios del sistema DOS y entrega al usuario o al programa antivirus datos falsificado: p.e. muestra como “limpio” el contenido del sector de arranque infectado por el programa nocivo.
Lo que en el sistema operativo DOS se denominaba tecnología stealth, diez años más tarde tuvo un “renacimiento” a un nuevo nivel en el SO Windows, esta vez bajo el nombre de tecnología rootkit.
Daremos más detalles de los mecanismos de camuflaje de los virus en el sistema en la sección “Rootkits”.
Empaquetadores (packers)
Poco a poco los virus (programas nocivos que funcionan sólo en el cuerpo de la “víctima” e inofensivos fuera de ella) comenzaron a ser reemplazados por los troyanos, programas nocivos completamente autónomos. Este proceso se inició en aquellos tiempos, cuando Internet era lento y no tan inmenso como hoy, y los discos duros y disquetes eran pequeños, lo que hacía que el tamaño del programa tuviera gran significado. Para reducir el tamaño del fichero troyano, ya en la época de DOS se empezaron a usar los así denominados “empaquetadores”, programas especiales que comprimían los archivos.
Un efecto secundario (útil desde el punto de vista de la autodefensa del programa) del uso de los empaquetadores es que dificultan un poco la detección del programa nocivo con los métodos aplicables a los ficheros.
Lo que pasa es que al elaborar una nueva modificación del programa nocivo, su autor suele cambiar algunos renglones del código, dejando su base sin modificar. En el fichero compilado esto provoca que los bytes cambien en ciertas partes y si la firma del antivirus no tenía esta parte, el programa nocivo se seguirá detectando. Empaquetar el programa con un compresor resuelve este problema, ya que el cambio de aunque sea un sólo byte en el fichero ejecutable hace que el nuevo conjunto de bytes en el fichero empaquetado sea completamente diferente.
Fig. 4. Diferencias en el aspecto de un fichero comprimido y descomprimido
Lo empaquetadores se siguen usando bastante hoy en día. Su variedad y refinamiento siguen en crecimiento. Muchos empaquetadores modernos, aparte de la compresión del fichero original, le brindan funciones adicionales de autodefensa destinadas a dificultar la descompresión del fichero y su análisis por medio de depuradores.
Rootkits
Los programas nocivos para el sistema operativo Windows empezaron a camuflarse a principios del siglo XXI, es decir, unos 10 años después del surgimiento del concepto de camuflar un programa nocivo en el sistema y su realización en DOS. A principios de 2004, Kaspersky Lab recibió un programa sorprendente, que no era visible en la lista de procesos y ficheros de Windows. Para muchos expertos antivirus esto marcó el principio de las tecnologías de camuflaje de los programas en el sistema Windows y para la industria antivirus fue el precursor de una nueva y peligrosa tendencia.
El término “rootkit” tiene sus origen en los utilitarios de Unix destinados a obtener acceso no sancionado a la raíz (root) del sistema sin que el administrador se dé cuenta. En el presente, en la categoría de “rootkit” se encuentran tanto las utilidades especiales que permiten camuflar la información en el sistema, como los programas nocivos capaces de disimular las huellas de su presencia. Estas pueden ser las manifestaciones registrables de la aplicación: un renglón en la lista de procesos, un fichero en el disco, llaves en el registro o hasta el tráfico de red.
¿De qué manera la tecnología de rootkit, destinada al camuflaje del programa nocivo en el sistema, evita ser detectada por los medios de protección? Es muy sencillo: el antivirus es, respecto al sistema, un agente externo, al igual que el usuario. Por lo general, lo que el usuario no puede ver, tampoco lo puede ver el antivirus. Por suerte, un buen antivirus puede incorporar tecnologías que le permitan ver en los lugares donde el usuario no puede hacerlo.
El principio de funcionamiento de los rootkits es el mismo que el de los virus stealth en DOS. Los más frecuentes son los rootkits cuyo mecanismo de funcionamiento se basa en una cadena de llamadas del sistema y por eso se denominan Execution Path Modification. Este rootkit se puede representar como un espía-interceptor que se encuentra en un punto de la ruta que siguen las instrucciones o la información y que las modifica para introducir alteraciones o gestionarlo de forma imperceptible. En teoría, la cantidad de puntos dónde se puede ubicar el interceptor es ilimitada. En la práctica, se utilizan cierta cantidad de tipos de intercepción de las aplicaciones del usuario (API) y de intercepción de las funciones del sistema del núcleo. Este tipo de rootkits se usa en las conocidísimas utilidades Vanquish y Hacker Defender, así como en los programas nocivos Backdoor.Win32.Haxdoor, Email-Worm.Win32.Mailbot, algunas versiones Email-Worm.Win32.Bagle.
Fig. 5. La intercepción de la función ZwQueryDirectoryFile oculta
el fichero del driver en la lista de ficheros
Otro difundido tipo de rootkits, el Direct Kernel Object Modification (DKOM) se puede representar como un espía infiltrado que modifica la información o las instrucciones directamente en su fuente de origen. Estos son los rootkits que alteran los datos del sistema. Uno de sus típicos representantes es el utilitario FU; funciones correspondientes están presentes en el troyano Gromozon (Trojan.Win32.Gromp).
Una tecnología posterior, que formalmente corresponde al tipo de rootkit aquí definido es el camuflaje de ficheros en los flujos alternativos de datos (Alternate Data Streams, ADS) del sistema NTFS. Fue usada por primera vez en el año 2000 en el programa Stream (Virus.Win32.Stream) y reapareció en 2006 en Mailbot y Gromozon. En rigor, la explotación de ADS no es tanto un método de engañar al sistema como el uso de una de sus funciones poco conocidas. Por eso es que tiene pocas perspectivas.
Fig. 6. El programa nocivo Mailbot (Rustock) explota
un flujo del directorio del sistema
Una más de las tecnologías poco conocidas que entra en la definición de rootkit sólo de forma parcial (pero que en grado todavía menor puede pertenecer a las tecnologías de autodefensa analizadas en el presente artículo) es la tecnología que usa ficheros que existen sólo en la RAM y no se graban en el disco duro. En este momento se conocen dos representantes de esta tecnología: el causante del escándalo en 2001 Codered (Net-Worm.Win32.CodeRed), que existía sólo como un fantasma en el contexto de MS IIS y un troyano conceptual descubierto hace poco y que guarda su cuerpo en el registro.
La tendencia de los rootkits modernos apunta a la virtualización y uso de las funciones de los equipos, es decir, a una penetración más profunda en el sistema.
La lucha contra los antivirus
En todas las épocas existían programas nocivos que se defendían activamente. Esta defensa podía ser:
- la búsqueda en el sistema de un antivirus, cortafuegos u otras aplicaciones de protección y la violación de su funcionamiento. Como ejemplo se puede poner el caso cuando el programa nocivo busca un antivirus en particular en la lista de procesos y trata de eliminarlo;
- el bloqueo de ficheros y su apertura con derechos exclusivos para contrarrestar a los antivirus de ficheros;
- la modificación del fichero hosts para bloquear el acceso a los sitios de actualización de los antivirus;
- la detección de ventanas de diálogo del sistema de seguridad (por ejemplo, una ventana del cortafuegos “¿Permitir esta conexión?) y la imitación de la pulsación de la tecla “Permitir”.
De hecho, el ataque dirigido a los medios de protección es más una medida forzada, la defensa de aquel que se ve entre la espada y la pared, que un ataque activo. En las condiciones actuales, cuando los antivirus analizan no sólo el código de los programas nocivos, sino también su conducta, estos resultan desarmados, en mayor o menor grado: en estas condiciones ni el polimorfismo, ni el empaquetamiento, ni la tecnología de esconderse en el sistema . Por esto, a los programas nocivos no les queda más que hacer de francotiradores contra alguna de las manifestaciones o funciones del “enemigo”. Si no fuera por su extrema necesidad, este método de autodefensa no sería tan popular, ya que es demasiado desventajoso desde el punto de vista de una defensa más amplia.
El futuro: ¿virus reflexivos?
La defensa antivirus se desarrolla constantemente, desde el análisis de los ficheros hasta el análisis del comportamiento de los programas. A diferencia del análisis de los ficheros, cuya esencia ha sido explicada en la sección “Polimorfismo, ofuscación…”, el análisis de conductas no se basa en el trabajo con ficheros, sino con los eventos en el sistema, tales como “enumerar los procesos activos en el sistema”, “crear un fichero con un nombre dado en un directorio dado”, “abrir un puerto dado para la recepción de datos”. Analizando las cadenas de estos eventos, el antivirus calcula la probabilidad del proceso que los crea, y de ser necesario, notifica sobre su peligrosidad.
Hacemos notar que en el campo del análisis de comportamientos hay una confusión terminológica que es muy difícil de aclarar. En particular, el módulo del analizador de conductas puede recibir diferentes nombres dependiendo del productor: «HIPS», «defensa proactiva», «heurística» (Heuristic), «caja de arena» (Sandbox)… Pero, independientemente de la terminología es evidente que los programas nocivos resultan indefensos ante el análisis de comportamiento. Y esta gran vulnerabilidad genera el vector de la evolución de los programas nocivos.
En otras palabras, ante los creadores de virus está la tarea de aprender a evadir los analizadores de conductas. De qué exacta manera lo harán, es algo que no está claro. Pero está claro, por ejemplo, que la utilización de la ofuscación al nivel de la conducta es del todo inútil. Pero el desarrollo de tecnologías de diagnóstico del entorno, por el contrario, es muy interesante. En parte porque estas tecnologías suponen el incremento de la “conciencia propia” del virus, que le permitiría saber en qué lugar exacto se encuentra: en el “mundo real” (en el entorno de trabajo del usuario) o en la “matriz” (bajo el control de un analista antivirus).
Las tecnologías de diagnóstico ya tienen un precursor: algunos programas nocivos se suicidan (perdón, se autoeliminan) si se dan cuenta de que están en un entorno virtual (VMWare, Virtual PC). Este mecanismo de autoeliminación del programa nocivo lo pone el autor del programa nocivo para evitar el análisis que a veces se realiza en un entorno virtual.
Tendencias y pronósticos
Desde el punto de vista de las perspectivas y la dinámica del desarrollo, el estado de las tendencias analizadas en este artículo es:
- Los rootkits tratarán de explotar las funciones del hardware y de la virtualización. Sin embargo, esta tendencia todavía no ha madurado y es poco probable que se use de forma masiva en los próximos años.
- La tecnología de evitar grabar el fichero nocivo en el disco: los dos virus conceptuales permiten esperar que este tema se desarrollará en el futuro próximo.
- La utilización de las tecnologías de ofuscación es insignificante, pero siempre vigente.
- La utilización de las tecnologías de detección de los medios de protección y la violación de su funcionamiento es considerable y también siempre vigente.
- La utilización de empaquetadores es considerable y está en constante crecimiento (tanto en su número, como en su calidad).
- La utilización de la tecnología de detección de los depuradores, emuladores, máquinas virtuales, así como de otras tecnologías de diagnóstico del entorno deberá desarrollarse para compensar la masiva transición de los antivirus hacia el análisis de conductas.
Distribución aproximada de las tecnologías de autodefensa
de los programas a principios de 2007Es fácil notar que las tendencias del desarrollo de la autodefensa de los programas nocivos van cambiando a la par que las tendencias del desarrollo de los programas nocivos y la defensa contra los mismos. En los tiempos cuando la mayoría de los programas nocivos infectaban ficheros y los antivirus usaban sólo la detección por firmas, tenían actualidad sólo el polimorfismo y la defensa del código. En la actualidad los programas nocivos son, por lo general, autónomos y los antivirus son cada vez más proactivos. A partir de esto se puede hacer el pronóstico de qué tendencias de la autodefensa de los programas nocivos se desarrollarán con más intensidad que los demás:
- Rootkits La invisibilidad en el sistema siempre da ventaja, aunque no evite la detección. Lo más probable es que aparezcan nuevos tipos de programas nocivos sin cuerpo y un poco más tarde, se use la tecnología de virtualización.
- Ofuscación y cifrado. La introducción de técnicas que dificulten el análisis del código seguirán estando vigentes.
- Oposición a los medios de protección basados en el análisis de conducta. Aquí podemos esperar la aparición de nuevas tecnologías, ya que las que se usan ahora (ataques directos a los antivirus) no son efectivos. Es posible que sean métodos de detección del entorno virtual o algún tipo de cifrado de los patrones de conducta.
Conclusión
¿Qué nos queda por decir? La existencia de los programas nocivos provocó la aparición de los medios de defensa contra ellos. Esto, a su vez, fue la causa de que los programas nocivos empezaran a defenderse. Respecto a esto quisiera exponer algunas reflexiones sobre el tema de la constante lucha que observamos en la naturaleza.
En los años recientes ha tenido mucha vigencia la siguiente situación. Un sujeto perteneciente al medio de los delincuentes cibernéticos (o algún “científico” que se cubre con un sombrero blanco) desarrolla un concepto de código que evade los medios contemporáneos de defensa y en calidad de autopublicidad disfrazada de preocupación por el progreso, lo publica como “indetectable”. Remarcamos: por supuesto, este concepto no es completamente indetectable, sino que es capaz de evadir uno o dos de los niveles de las funciones de protección conocidas. Hacer un rodeo de un paso es bastante fácil si se conocen los mecanismos de defensa.
Semejantes publicaciones hacen que cierto porcentaje de usuarios que no conocen los principios de funcionamiento de los programas nocivos y los antivirus se preocupen (“Y mi antivirus…¿me protegerá de este nuevo tipo de amenazas”?). En esta situación a los productores de medios de defensa no les queda más que lanzar una parte de sus recursos para reestablecer su prestigio: desarrollar tecnologías que protejan del concepto descrito, que serán también de un solo paso. Como resultado, el prestigio se reestablece (¿podía ser de otra manera?), el equilibrio del ecosistema “programa nocivo – antivirus – usuario” vuelve a su estado inicial y el proceso cierra su ciclo. Cada nueva repetición genera programas nocivos cada vez más refinados y aumenta el peso de la artillería de la defensa.
Quiero subrayar que este proceso requiere muchos recursos, no tiene sentido ni final, y desde hace poco tiempo, se está volviendo cada vez más grotesco. Por eso quisiera que las tres partes involucradas sean más conscientes. Los usuarios deben entender que ningún medio de defensa es absoluto y la mejor defensa contra el peligro es evitarlo. Los “conceptualistas” deben pensar sobre la pureza de sus motivos antes de publicar un concepto que arroje más aceite al fuego. Y los defensores deben pensar de forma más amplia y profunda, tratando de adelantarse al “enemigo” no en un paso, sino en mucho más. Y a pesar de que no hablamos del cese total de la “carrera armamentista”, está en las manos de los participantes de este proceso hacer que no se acelere tanto.
* Polimorfismo: clase de tecnologías que permiten a un programa que se reproduce a sí mismo cambiar total o parcialmente la estructura de su código durante el proceso de reproducción.
* Ofuscación: conjunto de técnicas para complicar el código fuente del programa que tienen como objetivo dificultar al máximo su lectura y análisis, pero conservando sus funciones. Las tecnologías de ofuscación pueden aplicarse en cualquier nivel del idioma de programación: de alto nivel, de secuencias y ensamblador. Ejemplos de ofuscación simple: introducción en el código de operadores neutrales (que no cambian las funciones del programa); reducción de su claridad por medio de la utilización desmesuradas de transiciones incondicionales (o disfrazadas de condicionales).
* Se refiere al par dialéctico de términos muy conocidos en el campo de la seguridad informática: Black Hat (“sombrero negro”, delincuente informático) – White Hat (“sombrero negro”, especialista en seguridad informática).
Evolución de las tecnologías de autodefensa usadas por los programas nocivos