ofuscación
¿Qué es la ofuscación?
Ofuscación significa hacer algo difícil de entender. El código de programación a menudo se ofusca para proteger la propiedad intelectual o los secretos comerciales, y para evitar que un atacante realice ingeniería inversa a 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 metadatos potencialmente reveladores, reemplazar nombres de clases y variables con etiquetas sin sentido y agregar código sin usar o sin sentido a un script de aplicación. Una herramienta llamada ofuscador convertirá automáticamente el código fuente directo en un programa que funciona de la misma manera, pero que es más difícil de leer y entender.
Desafortunadamente, los escritores de código malicioso también usan estos métodos para evitar que sus mecanismos de ataque sean detectados por herramientas antimalware. El ataque SolarWinds de 2020 es un ejemplo de hackers que utilizan la ofuscación para evadir las defensas.
Las técnicas de desenfoque se pueden utilizar para realizar ingeniería inversa — u deshacer ob ofuscación. Estas técnicas incluyen el corte de programas, 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 del programa son otras dos técnicas de desobfuscación. La ofuscación tiene como objetivo hacer que la ingeniería inversa sea difícil y no valga la pena.
¿Cómo funciona la ofuscación?
La ofuscación en código de computadora utiliza frases 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 determinar el verdadero contenido del mensaje.
Con el código de computadora, 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 realizar ingeniería inversa automática del código fuente; la ofuscación también tiene como objetivo dificultar la descompilación de estos programas.
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 confusa se parece a esto:
var _0x154f=;var _0x52df=function(_0x159d61,_0x12b953){_0x159d61=_0x159d61-0x122;var _0x154f4b=_0x154f;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(_0x19e682());}catch(_0x22c179){_0x19e682(_0x19e682());}}}(_0x154f,0x1918c));var greeting='Hello\x20World';greeting=0xa;var product=greeting*greeting;
La versión ofuscada es casi imposible de seguir usando el ojo humano.
Técnicas de ofuscación
La ofuscación implica varios métodos diferentes. A menudo, se utilizan múltiples técnicas para crear un efecto en 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. En contraste, C++ es más difícil de ofuscar, porque compila a código máquina, que es más difícil para las personas trabajar con él.
Algunas técnicas de ofuscación comunes incluyen las siguientes:
- Cambio de nombre. El ofuscador altera los métodos y los nombres de las variables. Los nuevos nombres pueden incluir caracteres no imprimibles o invisibles.
- Embalaje. Esto comprime todo el programa para que el código sea ilegible.
- Flujo de control. El código descompilado se hace para que parezca lógica espagueti, que es un código desestructurado y difícil de mantener 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 punto del código mirándolo.
- Transformación de patrones de instrucción. 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 ni el resultado del programa.
- Eliminación de metadatos o código no utilizado. El código y los metadatos no utilizados proporcionan 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 predicados opacos. Un predicado en código es una expresión lógica que es verdadero o falso. Los predicados opacos son ramas condicionales, o sentencias if-then, donde los resultados no se pueden determinar fácilmente con análisis estadístico. Insertar un predicado opaco introduce código innecesario que nunca se ejecuta, pero es desconcertante para el lector que intenta comprender la salida descompilada.
- Anti-depuración. Los ingenieros de software y hackers legítimos 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 hackers pueden usarlos para realizar ingeniería inversa del código. Los profesionales de la seguridad de TI pueden usar herramientas anti-depuración para identificar cuando un hacker está ejecutando un programa de depuración como parte de un ataque. Los hackers 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.
- antimanipulación. Estas herramientas detectan 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 particulares.
- Transposición de código. Esto 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 de desobfuscación automatizados determina la fuerza. Cuanto más esfuerzo, tiempo y recursos tome, más fuerte 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) a una métrica utilizada para indicar la complejidad del código. Un DIT superior significa un programa más complejo.
- Gastos. Un método de ofuscación rentable será más útil que uno que sea costoso, particularmente cuando se trata de cuán bien se escala para aplicaciones más grandes.
- Complejidad. Cuantas más capas agregue el ofuscador, más complejo será el programa, haciendo 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 competidores y atacantes. Por el contrario, los malos actores 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 programa y hacer que su ejecución requiera menos recursos.
- Seguridad. La ofuscación es un método de seguridad incorporado, a veces denominado autoprotección de aplicaciones. En lugar de usar un método de seguridad externo, funciona dentro de lo que se está protegiendo. Es adecuado para proteger aplicaciones que se ejecutan en un entorno no confiable 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 características 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:
- Or exclusivo (XOR). Una operación que oculta datos aplicando valores XOR al código para que solo un ojo entrenado pueda descifrarlos.
- ROT-13. Instrucción que sustituye el código por caracteres aleatorios.
Con ofuscación, en lugar de desarrollar nuevo malware, los autores reempaquetan métodos de ataque básicos de uso común para disfrazar sus características. En algunos casos, los actores maliciosos incluyen técnicas específicas del proveedor.
Otra desventaja de la ofuscación es que puede hacer que el código sea más difícil de leer. 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 SolarWinds
Un ataque a SolarWinds, un fabricante de software de gestión y monitoreo de TI de Austin, Texas, que se cree que comenzó en septiembre de 2019, provocó la violación de una gran cantidad de otras empresas y agencias gubernamentales. El ataque fue descubierto en diciembre de 2020 y se atribuye a hackers rusos. Inicialmente, comprometió la plataforma de gestión de TI Orion de SolarWinds.
Los atacantes utilizaron malware Sunburst, que combinaba técnicas de ofuscación, aprendizaje automático y IA para instalar una puerta trasera en las actualizaciones de software para la plataforma Orion. Para disimular sus esfuerzos y evitar las defensas, alteraron los registros de auditoría, eliminaron archivos y programas después de su uso y falsificaron la actividad para que apareciera como aplicaciones legítimas en la red.
Se sospecha que este ataque a la cadena de suministro no se ha detectado durante más de un año. El malware insertado en el código de Orión permanece inactivo y oculto hasta que los usuarios descargan las actualizaciones infectadas. Luego se propagó a través de la red sin ser detectado e infectó a una larga lista de organizaciones que usaban Orion.
La ofuscación es una de las muchas técnicas que los hackers emplean para irrumpir en los sistemas de TI. Obtenga más información sobre la defensa contra varios tipos de ataques de ciberseguridad en la guía de planificación de ciberseguridad en profundidad de TechTarget.