Recientemente, comencé a aprender más sobre la forma en que funcionan los antivirus y otros productos anti malware, y me di cuenta de que la mayoría de ellos utilizan 3 técnicas diferentes para detectar y detener el malware:
- Detección basada en firmas
- análisis heurístico
- Sandboxing (para los archivos que pasan por el filtrado de 1. y 2.)
Al principio me pareció una gran idea, especialmente las funciones inteligentes de sandboxing que pueden ser capaces de detectar retrasos en la ejecución, contramedidas de máquinas virtuales, cifrado y más.
Entonces, una forma de evitar esas técnicas de detección vino a mi mente, así que lo probé y funciona contra todos los antivirus que probé y probablemente en cualquiera que confíe en esas técnicas:
¿Qué sucede si el código malicioso está encriptado en un archivo de apariencia inocente con una frase de paso que solo será conocida por la víctima (que por supuesto no lo sabe) y que será necesaria para descifrar el código malicioso y ejecutarlo? ¿En tiempo de ejecución?
Digamos que algunos códigos maliciosos se cifran mediante la función de cifrado AES256 con una frase de contraseña específica. Luego, la cadena resultante encriptada se coloca en un archivo JScript que contiene las instrucciones para descifrarla una vez que el usuario escribe la frase de acceso y la ejecuta a través de una función eval () en tiempo de ejecución. No hay forma de que el antivirus sepa ni adivine la frase de contraseña, ¿verdad? Y no hay forma de saber que hay un código malicioso oculto dentro de ese archivo JScript. Y como se descifrará en la memoria solo en tiempo de ejecución, sin haber sido escrito en el disco, la detección basada en firmas y el análisis heurístico fallarán. Lo mismo para el sandboxing, ya que no se activará ninguna acción maliciosa sin que el usuario escriba la frase de contraseña.
Ahora, para hacer que el usuario escriba la contraseña, se puede usar un tipo simple de Captcha, que le pide que escriba las palabras que ve en una imagen (o un dibujo ASCII, por ejemplo, ^^) para asegurarse de que está no es un robot Luego, cuando el usuario lo escriba, el código malicioso se descifrará y se ejecutará.
¿Cómo se defendería uno contra este tipo de ataque? Tal vez un antivirus avanzado que utilice técnicas de aprendizaje profundo pueda detectarlo, pero me parece que los programas antivirus actuales son completamente vulnerables a él.
Actualizado: ejemplo de código que ilustra la técnica anterior
Aquí hay una implementación simple en JScript:
var encryptionFunction = ; // Any encryption function, e.g. AES256 from CryptoJS
var hiddenCode = ; // Write any code here, e.g. WScript.Echo('My code has been executed !');
var passphrase = "Any pass phrase"; // It'll be used as a CAPTCHA challenge-response, e.g. picture with the passphrase or ASCII drawing
var encryptedCode = encryptionFunction(hiddenCode, passphrase); // Our hidden code will be encrypted with the passphrase
var template = "var decryptionFunction = ;" + // The decryption function is defined here
"var passphrase = InputBox('Your CAPTCHA challenge goes here');" + // CAPTCHA in an Input Box, user's input = passphrase
"eval(decryptionFunction('" + encryptedCode + "', passphrase))"; // Decryption of the encrypted code thanks to the user's input and run at execution time through eval()
var file = ; // Create a new JScript file (or WSF) and put the template as its content
08/04/2017 - Prueba de concepto + análisis antivirus
He añadido una prueba de concepto:
enlace
Es básicamente un simple archivo WSF que mostrará una ventana solicitando una contraseña, oculta en un dibujo ASCII. Una vez que el usuario escribe la contraseña correcta, el código cifrado incrustado dentro del archivo se descifra y ejecuta en tiempo de ejecución, mostrando un mero "¡Mi código ha sido ejecutado!" dentro de una ventana.
Como pensé, la rutina de descifrado no fue considerada como maliciosa por ningún antivirus en VirusTotal (0/56), aquí está el análisis antivirus:
enlace