Polimorfismo (malware) para niños
En el contexto del malware, un código polimórfico es aquel que usa la técnica del polimorfismo, que consiste en usar un motor polimórfico embebido para cambiar su propio código mientras mantiene su algoritmo original intacto. Cambia solo parte del código, en contraste con el metamorfismo que cambia todo el código, manteniendo otra parte del código igual.
Por ejemplo, es habitual que un virus polimórfico tenga un cuerpo de programa de virus cifrado (EVB, del inglés Encrypted Virus Body) y una rutina de descifrado de virus (VDR, del inglés Virus Decryption Routine) que hace de descifrador/cargador. Cuando se inicia una aplicación infectada, el VDR se encarga de cargar en memoria el texto cifrado, descifrarlo en memoria y finalmente ejecutarlo. Una vez ejecutado, el virus se vuelve a cifrar y se agrega a otra aplicación vulnerable. El cuerpo del virus, que está cifrado no se altera. En el descifrador/cargador, que quedaría invariante, aplicamos polimorfismo para generar diferentes versiones del mismo. A veces, la clave de cifrado de cada copia es distinta y es generada aleatoriamente para cambiar la apariencia del cuerpo del virus cifrado.
Al malware que tiene código polimórfico se le llama malware polimórfico.
El polimorfismo previene la detección e identificación del malware mediante mecanismos de ajuste de patrones. Consigue que el malware no tenga una manifestación constante, ya sea en almacenamiento o en memoria, y que una vez que una instancia sea conocida los sistemas de detección no puedan encontrarla siempre. El polimorfismo varía la apariencia de las instancias de malware. La detección de malware usando ajuste de patrones de códigos es una técnica que usan antivirus y sistemas de detección de intrusiones para intentar localizar programas maliciosos analizando ficheros, paquetes de red, memoria,... Si ese tipo de software encuentra patrones de código que coinciden con el de una amenaza conocida, toman los pasos apropiados para neutralizar dicha amenaza.
Para conseguir código polimórfico el malware dispone de un motor polimórfico embebido que automáticamente puede generar distintas transformaciones del código, del orden de millones. Para realizar estas transformaciones el motor polimórfico usa técnicas de ofuscación y, a veces, cifrado De esta forma el motor polimórfico cambia las características identificables del malware (nombres de ficheros, tipos, cadenas, flujo de control, claves de cifrado,...) mientras mantiene su funcionalidad. Para facilitar la creación del motor polimórfico se han creado toolkits polimórficos.
Es habitual que muchos tipos de malware sean polimórficos incluyendo virus, gusanos, troyanos, keyloggers o bots
Historia
El primer malware polimórfico fue 1260 también llamado V2PX, creado en 1989 por Mark Washburn como prueba de concepto para demostrar las carencias para detectar malware de las firmas en base a strings. Este malware insertaba código basura, que hacía que el tamaño del fichero fuera engañoso y así evitaba la detección. Más tarde esta prueba de concepto evolucionaría a un nuevo virus conocido como V2P2. A partir de estos desarrollos, otros investigadores desarrollaron los toolkits polimórficos, que facilitaban desarrollo de malware polimorfico. El primer toolkit polimórfico se creó en 1992 y se llamaba Mutation Engine (MtE).
Hay multitud de ejemplos de malware polimórfico. En 2016 investigadores afirmaban que el 97% de las infecciones de malware emplean técnicas polimórficas. Ejemplo de malware polimórfico son LoveLetter, Storm Worm Email y los ransomware CryptoWall, Virlock, CryptXXX, CryptoLocker y Wannacry.
Ejemplo simple
Un algoritmo que usa, por ejemplo, las variables A y ß, pero no la variable C, puede permanecer intacto incluso tras añadir grandes cantidades de código que modifiquen la variable C
Algoritmo original:
Inicio: GOTO Codigo_De_Descifrado
Cifrado: ... Mucho código cifrado ...
Codigo_De_Descifrado: A = Cifrado Loop: B = *A ß = ß XOR ClaveDeDescifrado *A = ß A = A + 1 GOTO Loop IF NOT A = Codigo_De_Descifrado GOTO Cifrado
ClaveDeDescifrado: numero_aleatorio
El mismo algoritmo con código innecesario que modifica la variable C:
Inicio: GOTO Codigo_De_Descifrado
Cifrado: ... Mucho código cifrado ...
Codigo_De_Descifrado: A = Cifrado C = 3 Loop: B = *A C = C + ß B = B XOR ClaveDeDescifrado *A = ß C = C * A A = A + 1 C = C + 20 GOTO Loop IF NOT A = Codigo_De_Descifrado C = A + C C = 2 + ß GOTO Cifrado
ClaveDeDescifrado: numero_aleatorio
El código dentro de la sección "Cifrado" puede posteriormente buscar el código entre "Codigo_De_Descifrado" y "ClaveDeDescifrado" eliminando todo el código que altere la variable C. Antes de que el algoritmo de cifrado sea usado de nuevo, puede añadir de nuevo código que afecte a la variable C, o incluso modificar el código del algoritmo por nuevo código con la misma finalidad.
Normalmente el creador de un malware utiliza una clave nula (con valor cero) en la primera generación del malware, esto hace que sea todo más fácil para el desarrollador ya que con esta clave el virus no se encuentra cifrado. Luego para las siguientes infecciones puede implementar una clave incremental o aleatoria.
Véase también
En inglés: Polymorphic code Facts for Kids