La lógica informática recomienda evitar el uso de sistemas operativos de seguridad no garantizada en entornos críticos. Pero la preeminencia de Microsoft con sus sistemas operativos, hace que sea habitual encontrar equipos basados en Windows en este tipo de entornos.
Para estos entornos existen otro tipo de sistemas operativos más robustos como: OpenBSD, Trusted-Solaris, HP/UX Virtual Vault, Hardened-Linux, etc.
Aunque la seguridad de Windows ha ido mejorando con las nuevas versiones, no llega al nivel de los anteriores y sigue siendo una plataforma especialmente vulnerable a algunos tipos de ataques. Por ejemplo a la infección por medio de malware.
La principal herramienta de protección frente a este tipo de ataques ha sido tradicionalmente el uso de software Antivirus. Pero este tipo de software ha sido diseñado principalmente para entornos domésticos o corporativos y se queda corto en entornos gubernamentales.
¿Por qué? Porque el malware enfocado a este tipo de entornos no se parecen al que encontraríamos en entornos civiles.
Los antivirus actuales basan la detección principalmente en 2 mecanismos:
Detección basada en firmas: El antivirus mantiene una base de datos de virus conocidos y de patrones binarios reconocibles que permiten identificar posible malware.
La detección basada en firmas puede ser evitada principalmente de 2 formas:
- Evitando que el malware sea catalogado por las casas de antivirus. Los virus o troyanos con objetivos militares o de inteligencia suelen ser desarrollados a medida, de forma que no han sido distribuidos anteriormente y no han podido ser analizados por los fabricantes de antivirus.
- Evitando que el malware tenga patrones identificables mediante una firma. Esto normalmente se consigue haciendo que el virus cambie de forma en cada infección. Para ello se utilizan técnicas de polimorfismo que codifican el binario de forma diferente cada vez que se copia.
Un virus polimórfico lo que hace normalmente es cifrar su propio código utilizando una llave de cifrado diferente cada vez. La parte del código que no puede ser cifrada (principalmente el código que realizara el proceso de descodificación) se genera mediante mutaciones. Estas mutaciones hacen que el código pueda seguir realizando las mismas funciones pero sustituyendo las instrucciones en ensamblador por otras equivalentes.
Para automatizar estas mutaciones los desarrolladores de malware suelen utilizar herramientas llamadas packers. Estas herramientas comprimen y codifican el cuerpo del binario de forma automática.
Los antivirus pueden intentar definir una firma específica para cada packer. Pero en entornos militares estos packers son desarrollados a medida, de forma que los antivirus no tienen forma de catalogarlos.
Detección basada en heurística: El antivirus realiza una simulación de lo que haría el binario a analizar si fuese ejecutado. Si detecta algún tipo de comportamiento sospechoso (o habitual del malware), podrá identificar un binario malicioso aunque no haya sido catalogado previamente.
Para realizar esta simulación la mayoría de antivirus lo que hacen es crear una especie de máquina virtual donde ejecutan el código del binario a modo de emulador. Dentro de esta emulación se analiza el comportamiento del binario durante unos breves segundos (no pueden hacerlo durante mucho tiempo ya que ralentizarían en exceso el equipo).
Para evitar este tipo de detección el malware moderno suele utilizar las siguientes técnicas:
- No realizar acciones sospechosas que puedan delatar su actividad: Simplificando las funcionalidades del malware podemos evitar que sea detectado por heurística. Pero este tipo de ocultación es limitada ya que impide al malware realizar ciertas acciones.
Además cada modelo de antivirus considera sospechosas una serie de acciones diferentes. De forma que aunque podamos evitar la detección por un antivirus en concreto, puede que otro si nos detecte.
- Técnicas anti-debugging: Estas técnicas consisten en hacer que el código no pueda ser analizado en un debugger o hacer que el código se comporte de forma diferente (para parecer inocuo) si detecta que está siendo debuggeado.
Para evitar que el código pueda ser analizado lo que se suele hacer es aprovechar defectos de diseño de las herramientas de debug para conseguir que fallen a la hora de analizar el binario.
Para detectar la presencia de un debugger se suelen utilizar funciones estándar de Windows como: IsDebuggerPresent(), CheckRemoteDebuggerPresent(), NtQueryInformationProcess(),leer NtGlobalFlag o acceder directamente al PEB.
- Técnicas anti-emulación: Estas técnicas consisten en actuar de forma no previsible para hacer que el antivirus no sea capaz de detectar la verdadera funcionalidad del binario.
Algunas de las técnicas más utilizadas son: Usar APIs no documentadas, usar funciones no soportadas por el emulador, retrasar la ejecución del código malicioso y realizar operaciones pesadas que consuman el tiempo del emulador.
Algunos packers avanzados ya incluyen “de serie” muchas de estas técnicas de forma que le ahorran trabajo al desarrollador del malware y dificultan su análisis. Cuanto más personalizado (y adaptado este el binario al sistema objetivo) más compleja será la detección.
Informe brutal sobre mal comportamiento y detección de éste en software. Brillante.
ResponderEliminar