Análisis de virus: tunneling
Por Fernando Bonsembiante
Vamos a examinar una técnica muy usada últimamente por
los virus para evitar a los antivirus residentes: el
tunneling.
Un tipo de antivirus muy usado en los primeros tiempos de
la lucha contra los virus era el del chequeador de
comportamiento. Todavía es usado por antivirus como el
Norton Anti Virus. Lo que hacen es verificar que algún
residente intente modificar un ejecutable, o escribir en
forma directa al disco, o formatear, o alguna otra acción
sospechosa de que sea peligrosa o causada por un virus.
En principio parece la protección perfecta, pero si
analizamos un poco cómo funciona veremos que no es así.
Monitoreando el DOS
Estos antivirus toman la interrupción 21h, la que
controla el DOS, de la tabla de interrupciones y la hacen
apuntar a su propio código. Cada vez que se llama a la
interrupción 21h, entonces, el anti virus verifica si el
pedido es sospechoso o no. En el caso de que sea
sospechoso, avisa al usuario o toma la acción
predeterminada por su configuración. El mismo esquema se
aplica a la interrupción 13h, que maneja el disco rígido,
y la 40h que maneja los diskettes. El problema es que si
el virus se cargó antes del antivirus puede llamar al DOS
directamente a partir de su punto de entrada guardado por
el virus. Si el antivirus se carga primero que nada, y se
chequea a si mismo contra infección, no habría
posibilidades de que se le escape un virus. En el caso de
los virus de boot sector, el antivirus que use esta
técnica no podría detectarlo si el virus llama a la
interrupción 13h desde el punto de entrada que guardó al
cargarse y no desde la tabla de interrupciones. O sea, si
el virus hace un call [old13h] y no hace un int 13h.
Buscando el punto de entrada
Lo que hacen los virus para evitar esto es buscar el
punto de entrada del DOS original. Si hay residentes
cargados que toman la interrupción 21h, por ejemplo, la
ejecución de la interrupción se va encadenando desde la
tabla de interrupciones hasta el DOS pasando por cada uno
de los residentes. Cada residente tiene en su propio
formato y a su propia manera el punto de entrada al DOS
que había antes en la tabla de interrupciones. Si no lo
hacen el control no volvería nunca a la interrupción 21h
del DOS. De todas formas, seguir este encadenamiento no
es obvio, y requiere de unas técnicas especiales que
detallaremos a continuación. La idea de usar estas
técnicas es evitar que un residente pueda controlar la
llamada de la interrupción, pero al mismo tiempo usar las
rutinas del DOS para infectar los programas.
Para encontrar la dirección original del handler de la
interrupción 13h en el BIOS se puede usar la interrupción
2Fh con el servicio 13h. Esta devuelve el punto de
entrada original del BIOS. De todas formas, hay muchos
antivirus que conocen esta característica del DOS y
previenen su utilización por programas no autorizados.
También esto sirve solamente para la interrupción 13h, y
los virus de archivo necesitan la interrupción 21h para
infectar.
Otra posibilidad es buscar un código determinado en
memoria y determinar que eso es la rutina que está
buscando. El problema es que habiendo tantas versiones
del DOS distintas, es difícil encontrar un código lo
suficientemente confiable como para hacer esto. Esta
técnica es usada por el virus Dark Avenger, como vimos en
Virus Report 9.
También similar a esto es tener una tabla de posibles
puntos de entrada, con lo cual el virus intentaría buscar
las interrupciones originales sabiendo el offset y el
segmento que deberían tener. Esto es muy poco seguro por
el mismo motivo que vimos antes, el DOS tiene muchas
versiones distintas y en cada una puede tener puntos de
entrada distintos. Lo mismo pasa con el BIOS, cada
fabricante puede tener un punto de entrada distinto.
Búsqueda recursiva
Otra forma más genérica de hacer esto es lo que hace el
Köhntark's Recursive Tunneling Toolkit. Este toolkit se
distribuye en los BBS de intercambio de virus, y consiste
en una rutina que se agrega a cualquier virus o programa
con facilidad. Esta rutina es recursiva, y toma como
entrada original el puntero de la tabla de interrupciones
hacia la interrupción 21h. Lo primero que hace es
comparar el segmento de ese puntero con lo que supone que
es el segmento del DOS, sacado de una tabla de datos del
DOS. Luego busca en el segmento al que apuntaba la
interrupción una instrucción de transferencia de control
a otro segmento, como ser un call far, un jump far, o
algunas otras posibilidades. Cuando encuentra esa
instrucción determina el segmento y offset al que se
salta, y verifica si el segmento es el del DOS. Si es
así, considera que encontró el punto de entrada. Si es
distinto, llama nuevamente a la rutina recursiva con ese
puntero como dato. El proceso sigue hasta que encuentra
la rutina original del DOS. Los problemas que pueden
ocurrir es que no encuentre ninguna instrucción del tipo
que busca, ya que hay más de una forma de transferir el
control a una rutina en otro segmento, o que no pueda
determinar el segmento del DOS correctamente, o que
mientras está buscando la interrupción 21h se desvíe de
la cadena de la interrupción 21h y que termine siguiendo
otra interrupción y no la 21h. No es 100% seguro, pero
funciona muy bien, por ejemplo engaña al Norton Anti
Virus sin problemas.
Tracing
Otra forma es usar las mismas facilidades que da el
procesador para debug. Lo que hacen los virus que usan
esta técnica es seguir la ejecución de la interrupción
paso a paso. Es la técnica que usa el virus Predator, por
ejemplo. Para comprender como funciona, primero haremos
una breve explicación de cómo funciona el modo paso por
paso del procesador. Para iniciar este modo, hay que
poner el Trap Flag en 1, y a continuación, toda
instrucción que se ejecute generará una interrupción 1h.
El programa que ponga al procesador en este modo debe
proveer de un handler de esta interrupción, el que tomará
la acción correspondiente cada vez que se ejecute una
instrucción. Entonces, este handler puede contener una
rutina que controle totalmente la ejecución del código,
ya que tomará el control después de la ejecución de cada
instrucción. De esta forma, el virus instala un handler
que controla por que puntos va pasando la ejecución del
código, y llama a la interrupción 21h. La sigue paso a
paso hasta que encuentra el punto de entrada al DOS
original. Determina este punto de entrada de la misma
forma que hacía el método del Tunneling Toolkit:
determina el segmento del DOS buscándolo en las tablas de
datos del DOS, y cuando la ejecución comienza en ese
segmento, supone que encontró al DOS original. Con el
BIOS hace lo mismo, pero con la ventaja de que el
segmento del BIOS es siempre constante.
Los problemas que puede causar este tipo de tunneling es
que este manejo de la interrupción 1h conflictúe con un
debugger o algún otro programa. Pero sería un caso muy
raro, y es un método bastante confiable para encontrar el
punto de entrada al DOS. Este método tiene la ventaja de
que se puede usar para cualquier interrupción, y no solo
para la 21h o 13h, pero siempre que se sepa con
anticipación el segmento original de la misma.
Modo protegido
Un método más novedoso de encontrar el punto de entrada
original es usar el modo protegido del procesador 386 y
superiores. Este procesador puede definir cada parte de
la memoria como que está mapeada en otro lugar, y puede
implementar memoria virtual (o sea, usar el disco como si
fuese memoria) marcando determinadas partes de la memoria
como presentes o no, y si el procesador tiene que hacer
una referencia a esa memoria, puede saber si esa parte
está realmente presente o si está en el disco. En el caso
de que no esté presente, se genera una interrupción
llamada Page Fault, que permite que el sistema operativo
busque esa página de memoria en el disco o donde esté.
Esto es usado también por programas como el QEMM para
hacer 'stealth' de memoria (no confundir con el stealth
de los virus, aunque tiene similitudes).
Lo que haría el virus es poner el procesador en modo
protegido, instalar un handler de page fault, determinar
el segmento del DOS (o del BIOS), y poner todo el
segmento como ausente de la memoria. Entonces, llama a la
interrupción con la que quiere hacer tunneling, y espera
a que se produzca el page fault. Cuando se produce
encontró el segmento del DOS. El problema es que esto
colisiona con otros programas que usen el modo protegido.
Si usamos el QEMM y después el virus quiere hacer
tunneling con este método, el procesador va a negarse a
entrar en modo protegido (porque ya está en ese modo) y
la técnica no va a funcionar. Lo mismo va a pasar con el
Windows, OS/2, o cualquier programa que use el modo
protegido.
Problemas genéricos
El tunneling parece un método ideal para que un virus
evada a los residentes, y lo es, excepto que a veces no
conviene evadir a los residentes. Por ejemplo, uno de los
residentes sobre los que el virus hace tunneling es un
redirector de red, o es el double space del DOS, o es el
Stacker, las referencias a archivos que se hacen a la
interrupción 21h no van a tener correspondencia con
archivos reales. El virus se va a encontrar tratando de
infectar archivos que no existen a nivel de DOS original,
entonces lo más probable es que cause problemas graves.
En una empresa detectaron que tenían un problema de virus
porque el Predator II les destruyó el disco comprimido
con double space tratando de infectar archivos.
La conclusión que podemos sacar de todo esto es que por
más que pareza que una técnica es infalible para un
virus, siempre hay conflictos posibles que causan más
daño que el pretendido por el autor del virus.
Fernando Bonsembiante es jefe de redacción de Virus
Report y está estudiando los virus informáticos desde
hace varios años, y es asesor en el tema para varias
empresas. También es miembro de la comisión directiva del
Círculo Argentino de Ciencia Ficción, (CACyF) y participa
como columnista de varias revistas sobre informática.
Puede ser contactado por Fido en 4:901/303 o en Internet
en ubik@ubik.to