¿Qué es la ofuscación?
On octubre 25, 2021 by admin¿Qué es la ofuscación de código?
La ofuscación de código es el proceso de modificar un ejecutable para que deje de ser útil para un hacker pero siga siendo totalmente funcional. Aunque el proceso puede modificar las instrucciones reales del método o los metadatos, no altera la salida del programa. Para ser claros, con suficiente tiempo y esfuerzo, casi todo el código puede ser objeto de ingeniería inversa. Sin embargo, en algunas plataformas como Java, Android, iOS o .NET (por ejemplo, Xamarin, C#, VB.NET, F#) los descompiladores gratuitos pueden aplicar fácilmente la ingeniería inversa al código fuente de un ejecutable o una biblioteca en prácticamente nada de tiempo y sin esfuerzo. La ofuscación automatizada del código hace que la ingeniería inversa de un programa sea difícil y económicamente inviable.
¿Por qué utilizar un ofuscador de código?
Al hacer que una aplicación sea mucho más difícil de someter a ingeniería inversa, puede protegerse contra el robo de secretos comerciales (propiedad intelectual), el acceso no autorizado, la evasión de licencias u otros controles y el descubrimiento de vulnerabilidades.
¿Cómo funciona la ofuscación?
La ofuscación de código consiste en muchas técnicas diferentes que pueden complementarse entre sí para crear una defensa en capas. Es más eficaz para los lenguajes que crean alguna forma de instrucciones de nivel intermedio como Java o los lenguajes .NET como C#, VB.NET, Managed C++, F#, etc. Algunos ejemplos típicos de técnicas de ofuscación y seguridad de aplicaciones incluyen:
Renombrar la ofuscación
Renombrar altera el nombre de los métodos y variables. Hace que el código fuente descompilado sea más difícil de entender para un humano, pero no altera la ejecución del programa. Los nuevos nombres pueden utilizar diferentes esquemas como «a», «b», «c», o números, caracteres no imprimibles o caracteres invisibles. Y los nombres pueden sobrecargarse siempre que tengan un alcance diferente. La ofuscación de nombres es una transformación básica que es utilizada por la mayoría de los ofuscadores de .NET (C#, etc.), iOS, Java y Android.
Encriptación de cadenas
En un ejecutable gestionado, todas las cadenas son claramente descubribles y legibles. Incluso cuando los métodos y variables son renombrados, las cadenas pueden ser usadas para localizar secciones de código críticas buscando referencias a cadenas dentro del binario. Esto incluye los mensajes (especialmente los de error) que se muestran al usuario. Para proporcionar una barrera eficaz contra este tipo de ataque, el cifrado de cadenas oculta las cadenas en el ejecutable y sólo restaura su valor original cuando es necesario. La desencriptación de cadenas en tiempo de ejecución normalmente incurre en una ligera penalización del rendimiento en tiempo de ejecución.
Ofuscación del flujo de control
La ofuscación del flujo de control sintetiza construcciones condicionales, de bifurcación e iterativas que producen una lógica ejecutable válida, pero que producen resultados semánticos no deterministas cuando se descompilan. En pocas palabras, hace que el código descompilado parezca una lógica de espaguetis que es muy difícil de comprender para un hacker. Estas técnicas pueden afectar al rendimiento en tiempo de ejecución de un método.
Transformación de patrones de instrucción
Convierte instrucciones comunes creadas por el compilador en otras construcciones menos obvias. Se trata de instrucciones de lenguaje de máquina perfectamente legales que pueden no asignarse limpiamente a lenguajes de alto nivel como Java o C#. Un ejemplo es el almacenamiento en caché de variables transitorias que aprovecha la naturaleza basada en la pila de los tiempos de ejecución de Java y .NET.
Inserción de código ficticio
Inserción de código en el ejecutable que no afecta a la lógica del programa, pero rompe los descompiladores o hace que el código de ingeniería inversa sea mucho más difícil de analizar.
Eliminación de código y metadatos no utilizados
Eliminar la información de depuración, los metadatos no esenciales y el código utilizado de las aplicaciones las hace más pequeñas y reduce la información disponible para un atacante. Este procedimiento puede mejorar ligeramente el rendimiento en tiempo de ejecución.
Enlace/fusión de binarios
Esta transformación combina múltiples ejecutables/bibliotecas de entrada en uno o más binarios de salida. La vinculación se puede utilizar para hacer que su aplicación sea más pequeña, especialmente cuando se utiliza con el renombramiento y la poda, puede simplificar los escenarios de despliegue y puede reducir la información disponible para los hackers.
Inserción de Predicados Opacos
Se ofusca mediante la adición de ramas condicionales que siempre se evalúan a resultados conocidos-resultados que no pueden ser fácilmente determinados a través del análisis estático. Esta es una forma de introducir código potencialmente incorrecto que nunca se ejecutará realmente, pero es confuso para los atacantes que tratan de entender la salida descompilada.
Anti-Tamper
Un ofuscador puede inyectar autoprotección de la aplicación en su código para verificar que su aplicación no ha sido manipulada de ninguna manera. Si se detecta la manipulación, puede cerrar la aplicación, limitar la funcionalidad, invocar fallos aleatorios (para disfrazar el motivo del fallo) o realizar cualquier otra acción personalizada. También puede enviar un mensaje a un servicio para proporcionar detalles sobre la manipulación detectada.
Anti-Debug
Cuando un hacker está tratando de piratear o falsificar su aplicación, robar sus datos, o alterar el comportamiento de una pieza crítica de software de infraestructura que casi seguramente comenzará con la ingeniería inversa y el paso a través de su aplicación con un depurador. Un ofuscador puede incorporar la autoprotección de la aplicación inyectando código para detectar si su aplicación de producción se está ejecutando dentro de un depurador. Si se utiliza un depurador, puede corromper los datos sensibles (protegiéndolos contra el robo), invocar caídas aleatorias (para disfrazar que la caída fue el resultado de una comprobación de depuración), o realizar cualquier otra acción personalizada. También puede enviar un mensaje a un servicio para proporcionar una señal de advertencia.
¿Debo ofuscar mi aplicación?
Considere fuertemente la utilización de la ofuscación y la autoprotección de la aplicación en tiempo de ejecución si lanza un software que se ejecuta en un entorno no fiable y tiene propiedad intelectual, proporciona acceso a información sensible, o tiene funcionalidad cerrada. La ofuscación hace que sea mucho más difícil para los atacantes revisar el código y analizar la aplicación. También hace que sea difícil para los hackers depurar y manipular su aplicación. El objetivo final es añadir una capa de protección para dificultar la extracción o el descubrimiento de información útil, como secretos comerciales (IP), credenciales o vulnerabilidades de seguridad de una aplicación. También debería dificultar la modificación de la lógica de la aplicación o el reempaquetado de una aplicación con código malicioso.
Deja una respuesta