¿Qué es la ofuscación?
La ofuscación significa hacer algo difícil de entender. El código de programación a menudo se confunde para proteger la propiedad intelectual o los secretos comerciales, y para evitar que un atacante realice ingeniería inversa de un programa de software propietario.
Cifrar parte o todo el código de un programa es un método de ofuscación. Otros enfoques incluyen eliminar los metadatos potencialmente reveladores, reemplazar los nombres de clases y variables con etiquetas sin significado y agregar código no utilizado o sin significado a un script de aplicación. Una herramienta llamada ofuscador convertirá automáticamente el código fuente sencillo en un programa que funciona de la misma manera, pero que es más difícil de leer y comprender.
Desafortunadamente, los escritores de códigos maliciosos también usan estos métodos para evitar que las herramientas antimalware detecten sus mecanismos de ataque. El ataque SolarWinds de 2020 es un ejemplo de piratas informáticos que utilizan la ofuscación para evadir las defensas.
Las técnicas de desofuscación se pueden utilizar para realizar ingeniería inversa, o deshacer, la ofuscación. Estas técnicas incluyen la división del programa, que implica reducir el código del programa a solo las declaraciones relevantes en un punto particular del programa. La optimización del compilador y la síntesis de programas son otras dos técnicas de desofuscación. La ofuscación tiene como objetivo hacer que la ingeniería inversa sea difícil y que no valga la pena.
¿Cómo funciona la ofuscación?
La ofuscación en el código de computadora utiliza frases indirectas complejas y lógica redundante para hacer que el código sea difícil de entender para el lector. El objetivo es distraer al lector con la complicada sintaxis de lo que está leyendo y dificultarle la determinación del verdadero contenido del mensaje.
Con el código informático, el lector puede ser una persona, un dispositivo informático u otro programa. La ofuscación también se utiliza para engañar a las herramientas antivirus y otros programas que dependen en gran medida de las firmas digitales para interpretar el código. Los descompiladores están disponibles para lenguajes como Java, sistemas operativos como Android e iOS y plataformas de desarrollo como .NET. Pueden aplicar ingeniería inversa automáticamente al código fuente; La ofuscación tiene como objetivo dificultar la descompilación de estos programas también.
La ofuscación de código no se trata de cambiar el contenido del código original de un programa, sino de hacer que el método de entrega y la presentación de ese código sean más confusos. La ofuscación no altera el funcionamiento del programa ni su salida final.
Lo que sigue es un fragmento de ejemplo de código JavaScript normal:
var greeting = 'Hello World';greeting = 10;var product = greeting * greeting;
Ese mismo fragmento en forma ofuscada se ve así:
var _0x154f=['98303fgKsLC','9koptJz','1LFqeWV','13XCjYtB','6990QlzuJn','87260lXoUxl','2HvrLBZ','15619aDPIAh','1kfyliT','80232AOCrXj','2jZAgwY','182593oBiMFy','1lNvUId','131791JfrpUY'];var _0x52df=function(_0x159d61,_0x12b953){_0x159d61=_0x159d61-0x122;var _0x154f4b=_0x154f[_0x159d61];return _0x154f4b;};(function(_0x19e682,_0x2b7215){var _0x5e377c=_0x52df;while(!![]){try{var _0x2d3a87=-parseInt(_0x5e377c(0x129))*parseInt(_0x5e377c(0x123))+-parseInt(_0x5e377c(0x125))*parseInt(_0x5e377c(0x12e))+parseInt(_0x5e377c(0x127))*-parseInt(_0x5e377c(0x126))+-parseInt(_0x5e377c(0x124))*-parseInt(_0x5e377c(0x12f))+-parseInt(_0x5e377c(0x128))*-parseInt(_0x5e377c(0x12b))+parseInt(_0x5e377c(0x12a))*parseInt(_0x5e377c(0x12d))+parseInt(_0x5e377c(0x12c))*parseInt(_0x5e377c(0x122));if(_0x2d3a87===_0x2b7215)break;else _0x19e682['push'](_0x19e682['shift']());}catch(_0x22c179){_0x19e682['push'](_0x19e682['shift']());}}}(_0x154f,0x1918c));var greeting='Hellox20World';greeting=0xa;var product=greeting*greeting;
La versión ofuscada es casi imposible de seguir con el ojo humano.
Técnicas de ofuscación
La ofuscación implica varios métodos diferentes. A menudo, se utilizan varias técnicas para crear un efecto de capas.
Los programas escritos en lenguajes de software compilados, como C # y Java, son más fáciles de ofuscar. Esto se debe a que crean instrucciones de nivel intermedio que generalmente son más fáciles de leer. Por el contrario, C ++ es más difícil de ofuscar, porque se compila en código de máquina, con el que es más difícil trabajar para la gente.
Algunas técnicas de ofuscación comunes incluyen las siguientes:
- Renombrar. El ofuscador altera los métodos y los nombres de las variables. Los nuevos nombres pueden incluir caracteres invisibles o no imprimibles.
- Embalaje. Esto comprime todo el programa para que el código sea ilegible.
- Flujo de control. El código descompilado está hecho para que parezca una lógica espagueti, que no está estructurada y es difícil de mantener un código donde la línea de pensamiento está oscurecida. Los resultados de este código no son claros y es difícil saber cuál es el objetivo del código con solo mirarlo.
- Transformación de patrones de instrucciones. Este enfoque toma instrucciones comunes creadas por el compilador y las intercambia por instrucciones más complejas y menos comunes que efectivamente hacen lo mismo.
- Inserción de código ficticio. Se puede agregar código ficticio a un programa para que sea más difícil de leer y realizar ingeniería inversa, pero no afecta la lógica o el resultado del programa.
- Eliminación de metadatos o código no utilizado. El código y los metadatos no utilizados brindan al lector información adicional sobre el programa, al igual que las anotaciones en un documento de Word, que pueden ayudarlo a leerlo y depurarlo. La eliminación de metadatos y código no utilizado deja al lector con menos información sobre el programa y su código.
- Inserción de predicado opaco. Un predicado en código es una expresión lógica que es verdadera o falsa. Los predicados opacos son ramas condicionales, o declaraciones si-entonces, donde los resultados no se pueden determinar fácilmente con análisis estadístico. La inserción de un predicado opaco introduce un código innecesario que nunca se ejecuta, pero que desconcierta al lector que intenta comprender la salida descompilada.
- Anti-Debug. Los ingenieros de software legítimos y los piratas informáticos utilizan herramientas de depuración para examinar el código línea por línea. Con estas herramientas, los ingenieros de software pueden detectar problemas con el código y los piratas informáticos pueden utilizarlas para aplicar ingeniería inversa al código. Los profesionales de la seguridad de TI pueden utilizar herramientas anti-depuración para identificar cuando un pirata informático está ejecutando un programa de depuración como parte de un ataque. Los piratas informáticos pueden ejecutar herramientas anti-depuración para identificar cuándo se está utilizando una herramienta de depuración para identificar los cambios que están realizando en el código.
- Anti-manipulación. Estas herramientas detectan el código que ha sido manipulado y, si se ha modificado, detiene el programa.
- Cifrado de cadenas. Este método utiliza cifrado para ocultar las cadenas en el ejecutable y solo restaura los valores cuando son necesarios para ejecutar el programa. Esto hace que sea difícil pasar por un programa y buscar cadenas en particular.
- Transposición de código. Este es el reordenamiento de rutinas y ramas en el código sin tener un efecto visible en su comportamiento.
Cómo medir el éxito de la ofuscación
El éxito de los métodos de ofuscación se puede medir utilizando los siguientes criterios:
- Fuerza. La medida en que el código transformado resiste los intentos automatizados de desofuscación determina la fuerza. Cuanto más esfuerzo, tiempo y recursos requiera, más sólido será el código.
- Diferenciación. El grado en que el código transformado difiere del original es otra medida de cuán efectivo es. Algunas de las formas utilizadas para juzgar la diferenciación incluyen:
- El número de predicados que contiene el nuevo código.
- La profundidad del árbol de herencia (DIT): una métrica utilizada para indicar la complejidad del código. Un DIT más alto significa un programa más complejo.
- Gastos. Un método de ofuscación rentable será más útil que uno que sea caro, sobre todo en lo que respecta a su escalabilidad para aplicaciones más grandes.
- Complejidad. Cuantas más capas agregue el ofuscador, más complejo será el programa, lo que hará que la ofuscación sea más exitosa.
Ventajas de la ofuscación
Las principales ventajas de la ofuscación son las siguientes:
- Secreto. La ofuscación oculta la valiosa información contenida en el código. Esta es una ventaja para las organizaciones legítimas que buscan proteger el código de la competencia y los atacantes. Por el contrario, los delincuentes aprovechan el secreto de la ofuscación para ocultar su código malicioso.
- Eficiencia. Algunas técnicas de ofuscación, como la eliminación de código no utilizado, tienen el efecto de reducir el tamaño del programa y hacer que su ejecución requiera menos recursos.
- Seguridad. La ofuscación es un método de seguridad integrado, a veces denominado autoprotección de la aplicación. En lugar de utilizar un método de seguridad externo, funciona dentro de lo que se protege. Es ideal para proteger aplicaciones que se ejecutan en un entorno que no es de confianza y que contienen información confidencial.
Desventajas de la ofuscación
Una de las principales desventajas de la ofuscación es que también se usa en malware. Los creadores de malware lo utilizan para evadir los programas antivirus que escanean el código en busca de funciones específicas. Al ocultar esas características, el malware parece legítimo para el software antivirus.
Las técnicas comunes que utilizan los autores de malware incluyen:
- Exclusivo o (XOR). Una operación que oculta datos aplicando valores XOR al código para que solo un ojo entrenado pueda descifrarlo.
- ROT-13. Una instrucción que sustituye el código por caracteres aleatorios.
Con la ofuscación, en lugar de desarrollar nuevo malware, los autores vuelven a empaquetar los métodos de ataque de uso común para disfrazar sus características. En algunos casos, los actores malintencionados incluyen técnicas específicas del proveedor.
Otra desventaja de la ofuscación es que puede dificultar la lectura del código. Por ejemplo, el código que utiliza el método de ofuscación de cifrado de cadenas requiere el descifrado de las cadenas en tiempo de ejecución, lo que ralentiza el rendimiento.
Ofuscación y vientos solares
Un ataque a SolarWinds, un fabricante de software de administración y monitoreo de TI de Austin, Texas, que se cree que comenzó en septiembre de 2019, resultó en la violación de una serie de otras empresas y agencias gubernamentales. El ataque fue descubierto en diciembre de 2020 y se atribuye a piratas informáticos rusos. Inicialmente comprometió la plataforma de gestión de TI Orion de SolarWinds.
Los atacantes utilizaron el malware Sunburst, que combinó técnicas de ofuscación, aprendizaje automático y IA para colocar una puerta trasera en las actualizaciones de software para la plataforma Orion. Para disfrazar sus esfuerzos y eludir las defensas, alteraron los registros de auditoría, eliminaron archivos y programas después de su uso y falsificaron la actividad para que aparecieran como aplicaciones legítimas en la red.
Se sospecha que este ataque a la cadena de suministro no ha sido detectado durante más de un año. El malware insertado en el código de Orion permanece inactivo y oculto hasta que los usuarios descargaron las actualizaciones infectadas. Luego se propagó a través de la red sin ser detectado e infectó una larga lista de organizaciones que usaban Orion.
La ofuscación es una de las muchas técnicas que emplean los piratas informáticos para irrumpir en los sistemas de TI. Aprender más acerca de defenderse de varios tipos de ataques de ciberseguridad en la guía de planificación en profundidad de ciberseguridad de Krypton Solid.