En el desarrollo de software , la ofuscación es la práctica de crear código fuente o código máquina intencionalmente difícil de entender para humanos o computadoras. De forma similar a la ofuscación en lenguaje natural , la ofuscación de código puede implicar el uso de formas innecesariamente indirectas de escribir instrucciones. Los programadores pueden ofuscar el código para ocultar su propósito, lógica o valores incrustados. Las principales razones para hacerlo son prevenir la manipulación , disuadir la ingeniería inversa o crear un rompecabezas o desafío recreativo para desofuscar el código, un desafío que a menudo se incluye en los crackmes . Si bien la ofuscación se puede realizar manualmente, es más común usar ofuscadores . [ 1 ]
Descripción general
La arquitectura y las características de algunos lenguajes pueden hacer que sean más fáciles de ofuscar que otros. [ 2 ] [ 3 ] C , [ 4 ] C++ , [ 5 ] [ 6 ] y el lenguaje de programación Perl [ 7 ] son algunos ejemplos de lenguajes fáciles de ofuscar. Haskell también es bastante ofuscable [ 8 ] a pesar de tener una estructura bastante diferente.
Las propiedades que hacen que un lenguaje sea susceptible de ofuscación no son inmediatamente obvias.
Técnicas
Entre los tipos de ofuscación se incluyen la simple sustitución de palabras clave, el uso o la no utilización de espacios en blanco para crear efectos artísticos y los programas autogenerados o altamente comprimidos.
Según Nick Montfort , las técnicas pueden incluir:
- la ofuscación de nombres, que incluye nombrar variables de una manera sin sentido o engañosa;
- confusión entre datos, código y comentarios, lo que incluye hacer que parte del código real parezca comentarios o confundir la sintaxis con los datos;
- doble codificación, que puede mostrar el código en forma de poesía o formas interesantes. [ 9 ]
También existen técnicas más sofisticadas que ofuscan un programa a nivel semántico mediante transformaciones del programa (en lugar de a nivel de código fuente). Estas incluyen:
- Transformaciones que ofuscan el flujo de control, como la fusión del cálculo de expresiones no relacionadas y la división del cálculo de expresiones relacionadas, la aleatorización del orden de las sentencias que pueden calcularse en cualquier orden y la inserción de predicados cuyos valores son conocidos por el ofuscador pero se calculan de maneras no obvias; [ 10 ]
- transformaciones que ocultan la estructura de datos, como modificar la estructura de los arreglos y reorganizar el grafo de herencia; [ 11 ]
- Ocultar las transformaciones de la estructura procedimental del código insertando nuevas abstracciones procedimentales y modificando las existentes para cambiar por completo la estructura del código;
- Ofuscar el flujo de datos de un programa. [ 12 ]
Ejemplo
El siguiente ejemplo ilustra una ofuscación sencilla del código fuente. Ambos programas imprimen el mismo resultado, pero la segunda versión es intencionadamente más difícil de entender.
Borrar código:
#include <stdio.h>int main ( void ) { int x = 5 ; int y = 7 ; printf ( "%d \n " , x + y ); return 0 ; }Código ofuscado:
#include <stdio.h> int main (){ int _ = 5 , __ = 7 ; printf ( "%d \n " , _ -~ __ -1 );}En la versión ofuscada, se eliminan los nombres de variables significativos y las expresiones aritméticas se reescriben de forma menos legible, conservando al mismo tiempo el comportamiento del programa.
Codificación de carga útil para evadir el malware
El cifrado XOR y la codificación Base64 son dos métodos comunes que se utilizan para ocultar el malware a los antivirus . Ambos funcionan modificando la apariencia del código malicioso en su archivo, lo que impide que el software de seguridad reconozca patrones peligrosos.
En la ofuscación XOR, un atacante elige una clave secreta y aplica la operación XOR bit a bit al binario del malware. Esto transforma el ejecutable en lo que parece datos aleatorios. Los nombres de las funciones en la tabla de importación desaparecen, los encabezados PE se corrompen y todo el archivo pierde su estructura. La carga útil ofuscada se incrusta en un dropper , que es un ejecutable de apariencia normal que contiene el malware oculto como una sección de recursos o datos. Cuando un usuario ejecuta el dropper, este realiza la operación XOR nuevamente con la misma clave para reconstruir el malware original, y luego lo ejecuta directamente desde la memoria o lo escribe en el disco antes de ejecutarlo. [ 13 ]
Este proceso elimina varios indicadores en los que se basa el software antivirus. El encabezado MZ ( la firma de 2 bytes "MZ" que marca el inicio de cada ejecutable de Windows ) queda completamente oculto por la operación XOR. Los programas de seguridad suelen buscar esta firma de dos bytes al buscar ejecutables incrustados. La codificación Base64 logra resultados similares mediante un método diferente: convierte los datos binarios en texto ASCII , de modo que un archivo ejecutable termina pareciendo texto plano (en lugar de un programa).
Una investigación realizada en la Competencia de Evasión de Seguridad mediante Aprendizaje Automático de 2020 demostró que estos métodos pueden eludir los sistemas de detección modernos. Los participantes utilizaron combinaciones de codificación XOR, codificación Base64 e inserción de código muerto para evadir los tres modelos de la competencia con menos de cinco intentos por muestra. La detección basada en entropía también falló, y en algunos casos la codificación Base64 incluso redujo la entropía en comparación con los archivos de malware originales. [ 14 ]
La simplicidad de estas técnicas es lo que las hace particularmente peligrosas. La codificación XOR y Base64 solo requiere conocimientos básicos de programación para su implementación, pero han demostrado ser eficaces contra clasificadores avanzados de aprendizaje automático . Esto ha impulsado a los investigadores de seguridad a desarrollar nuevas defensas, incluyendo herramientas automatizadas de recuperación de claves XOR y un análisis más profundo de los recursos incrustados en archivos ejecutables.
Herramientas automatizadas
Existen diversas herramientas para realizar o facilitar la ofuscación de código. Entre ellas se incluyen herramientas de investigación experimental desarrolladas por académicos, herramientas para aficionados, productos comerciales escritos por profesionales y software de código abierto . Además, existen herramientas de desofuscación, cuyo objetivo es revertir el proceso de ofuscación.
Si bien la mayoría de las soluciones comerciales de ofuscación transforman el código fuente del programa o el código de bytes independiente de la plataforma, es decir , el código portátil (como el que utilizan Java y .NET ), algunas también funcionan directamente con binarios compilados.
Recreativo
Escribir y leer código fuente ofuscado puede ser todo un desafío mental . Varios concursos de programación premian el código ofuscado más creativo, como el Concurso Internacional de Código C Ofuscado y el Concurso de Código Perl Ofuscado .
Los programas Perl cortos y ofuscados pueden usarse en las firmas de los programadores Perl, conocidos como JAPH (" Just another Perl hacker "). [ 21 ]
Criptográfico
Los criptógrafos han explorado la idea de ofuscar el código de manera que la ingeniería inversa del mismo sea criptográficamente difícil. Esto se formaliza en las numerosas propuestas de ofuscación de indistinguibilidad , una primitiva criptográfica que, de ser posible construirla de forma segura, permitiría construir muchos otros tipos de criptografía, incluyendo tipos completamente nuevos que nadie sabe cómo crear. (Se sabe que una noción más fuerte, la ofuscación de caja negra , es imposible en general). [ 22 ] [ 23 ]
Desventajas de la ofuscación
- Si bien la ofuscación puede dificultar y hacer más laborioso leer, escribir y realizar ingeniería inversa de un programa, no necesariamente lo hará imposible. [ 24 ]
- Esto añade tiempo y complejidad al proceso de compilación para los desarrolladores.
- Esto puede dificultar enormemente la depuración de problemas una vez que el software ha sido ofuscado.
- Una vez que el código deja de recibir mantenimiento, los aficionados pueden querer mantener el programa, añadir modificaciones o comprenderlo mejor. La ofuscación dificulta que los usuarios finales hagan cosas útiles con el código.
- Ciertos tipos de ofuscación (es decir, código que no es simplemente un binario local y descarga mini binarios de un servidor web según sea necesario) pueden degradar el rendimiento y/o requerir conexión a Internet.
Notificar a los usuarios sobre el código ofuscado.
Algunos programas antivirus, como AVG AntiVirus [ 25 ] , alertan a sus usuarios cuando acceden a un sitio web con código ofuscado manualmente, ya que uno de los propósitos de la ofuscación es ocultar código malicioso. Sin embargo, algunos desarrolladores pueden emplear la ofuscación de código para reducir el tamaño de los archivos o aumentar la seguridad. El usuario promedio no espera que su antivirus le alerte sobre un fragmento de código inofensivo, especialmente si proviene de empresas de confianza, por lo que esta función podría disuadir a los usuarios de usar software legítimo.
Mozilla y Google no permiten extensiones de navegador que contengan código ofuscado en sus tiendas de complementos ( Firefox y Chrome , respectivamente). [ 26 ] [ 27 ]
Ofuscación y licencias copyleft
Se ha debatido si es ilegal eludir las licencias de software copyleft mediante la publicación de código fuente ofuscado, como en los casos en que el autor no está dispuesto a hacerlo público. La Licencia Pública General de GNU aborda esta cuestión exigiendo que se ponga a disposición la «forma preferida para realizar modificaciones». [ 28 ] El sitio web de GNU afirma: «El "código fuente" ofuscado no es código fuente real y no se considera código fuente». [ 29 ]
Descompiladores
Un descompilador es una herramienta que permite realizar ingeniería inversa del código fuente de un ejecutable o biblioteca. Este proceso se conoce a veces como ataque de intermediario (o ataque man-in-the-end), inspirado en el tradicional ataque de intermediario en criptografía. El código fuente descompilado suele ser difícil de leer, ya que contiene nombres de funciones y variables aleatorios, tipos de variables incorrectos y una lógica que difiere del código fuente original debido a las optimizaciones del compilador.
Ofuscación de modelos
La ofuscación de modelos es una técnica para ocultar la estructura interna de un modelo de aprendizaje automático . [ 30 ] La ofuscación convierte un modelo en una caja negra. Es contraria a la IA explicable . Los modelos de ofuscación también se pueden aplicar a los datos de entrenamiento antes de introducirlos en el modelo para añadir ruido aleatorio. Esto oculta información sensible sobre las propiedades de muestras individuales y grupos de muestras. [ 31 ]
Véase también
- Código AARD
- Descompilación
- Gestión de derechos digitales
- Dotfuscator (Ofuscador .Net)
- Lenguaje de programación esotérico
- Ofuscación de hardware
- Ofuscación de indistinguibilidad
- Instrucciones superpuestas
- Código polimórfico
- Estilo de programación
- ProGuard (Ofuscador de Java)
- Quine
- Embellecimiento del código fuente
- Compilador de código fuente a código fuente
- Código espagueti
- Concurso C de juego sucio
Referencias
- ↑ "¿Qué es la ofuscación (obfu)? - Definición de WhatIs.com" . SearchSoftwareQuality . Archivado del original el 2 de febrero de 2019. Consultado el 1 de febrero de 2019 .
- ↑ Binstock, Andrew (6 de marzo de 2003). "Ofuscación: Cómo ocultar tu código de miradas indiscretas" . Archivado del original el 20 de abril de 2008. Consultado el 25 de noviembre de 2013 .
- ↑ Atwood, Jeff (15 de mayo de 2005). "Jeff Atwood, 15 de mayo de 2005" . Codinghorror.com. Archivado del original el 9 de enero de 2010. Recuperado el 25 de noviembre de 2013 .
- ↑ "Ofuscación" . Kenter.demon.nl. Archivado del original el 4 de marzo de 2016. Recuperado el 25 de noviembre de 2013 .
- ↑ "Tutoriales de C++ – Código ofuscado – Una introducción sencilla" . DreamInCode.net. Archivado del original el 28 de junio de 2008. Consultado el 25 de noviembre de 2013 .
- ↑ "Tutoriales de C: Código ofuscado en C" . 7 de julio de 2011. Archivado del original el 27 de diciembre de 2013. Consultado el 25 de noviembre de 2013 .
- ↑ A fecha de 25/11/2013 18:22 GMT. "Perlas en el ruido de la línea" . Perlmonks.org. Archivado del original el 16 de enero de 2009. Recuperado el 25 de noviembre de 2013 .
{{cite web}}: CS1 maint: nombres numéricos: lista de autores ( enlace ) - ↑ "Ofuscación – Haskell Wiki" . 16 de febrero de 2006. Archivado del original el 30 de agosto de 2017. Consultado el 3 de marzo de 2020 .
- ↑ Montfort, Nick. "Código ofuscado" (PDF) . Archivado del original (PDF) el 24 de abril de 2019. Recuperado el 24 de noviembre de 2017 .
- ↑ Collberg, Christian; Thomborson, Clark; Low, Douglas (21 de enero de 1998). «Fabricación de construcciones opacas baratas, resistentes y sigilosas» . Actas del 25.º simposio ACM SIGPLAN-SIGACT sobre principios de lenguajes de programación - POPL '98 . Nueva York, NY, EE. UU.: Association for Computing Machinery. págs. 184-196 . doi : 10.1145/268946.268962 . ISBN 978-0-89791-979-1.
- ↑ Collberg, C.; Thomborson, C.; Low, D. (junio de 1998). «Rompiendo abstracciones y desestructurando estructuras de datos». Actas de la Conferencia Internacional de Lenguajes de Computación de 1998 (Cat. No. 98CB36225) . págs. 28–38 . doi : 10.1109/ICCL.1998.674154 . ISBN 0-8186-8454-2.
- ↑ Linn, Cullen; Debray, Saumya (27 de octubre de 2003). Ofuscación de código ejecutable para mejorar la resistencia al desensamblaje estático . págs. 290–299 . doi : 10.1145/948109.948149 . ISBN 1-58113-738-9. Consultado el 11 de marzo de 2026 .
{{cite book}}:|website=ignorado ( ayuda ) - ↑ Ceschin, Fabrício; Botacin, Marcus; Lüders, Gabriel; Gomes, Heitor Murilo; Oliveira, Luiz S.; Grégio, André (2020). "No es necesario enseñar nuevos trucos al malware antiguo: ganar un desafío de evasión con muestras adversarias basadas en XOR". Actas del Simposio sobre Tendencias Ofensivas y de Reversión . pp. 1–10 . doi : 10.1145/3433667.3433669 .
- ↑ Ceschin, Fabrício; Botacin, Marcus; Lüders, Gabriel; Gomes, Heitor Murilo; Oliveira, Luiz S.; Grégio, André (2020). "No es necesario enseñar nuevos trucos al malware antiguo: ganar un desafío de evasión con muestras adversarias basadas en XOR". Actas del Simposio sobre Tendencias Ofensivas y de Reversión . pp. 1–10 . doi : 10.1145/3433667.3433669 .
- ↑ Ben Kurtovic. "Ofuscando "¡Hola mundo!"" . benkurtovic.com . Archivado del original el 14 de septiembre de 2017 . Consultado el 18 de octubre de 2017 .
- ↑ "Python ofuscado" . wiki.c2.com . Archivado del original el 14 de febrero de 2017. Consultado el 18 de octubre de 2017 .
- ↑ "El primer contenido anual ofuscado de Python" . code.activestate.com . Archivado del original el 25 de mayo de 2023. Consultado el 18 de octubre de 2017 .
- ↑ domas (3 de noviembre de 2022), xoreaxeaxeax/movfuscator , archivado del original el 12 de noviembre de 2022 , recuperado el 5 de noviembre de 2022
- ↑ Break Me00 The MoVfuscator Convirtiendo mov en una pesadilla de RE que aplasta el alma Christopher Domas , 25 de septiembre de 2015, archivado del original el 21 de octubre de 2022 , recuperado el 5 de noviembre de 2022
- ↑ Williams, Al (21 de marzo de 2021). "Una instrucción para gobernarlas a todas: el compilador de C emite solo MOV" . Hackaday . Recuperado el 23 de octubre de 2023 .
- ↑ "JAPH – Just Another Perl Hacker" . pm.org . Perl Mongers. Archivado del original el 16 de mayo de 2013. Recuperado el 27 de febrero de 2015 .
- ↑ "Un avance en criptografía podría hacer que el software sea invulnerable" . Wired . ISSN 1059-1028 . Archivado del original el 14 de abril de 2022. Consultado el 14 de marzo de 2021 .
- ↑ Jain, Aayush; Lin, Huijia ; Sahai, Amit (2020). "Ofuscación de indistinguibilidad a partir de supuestos bien fundamentados" . Cryptology ePrint Archive . arXiv : 2008.09317 . Archivado del original el 3 de marzo de 2022. Recuperado el 14 de marzo de 2021 .
- ↑ ""¿Podemos ofuscar programas?" por Boaz Barak . Math.ias.edu. Archivado del original el 23 de marzo de 2016. Recuperado el 25 de noviembre de 2013 .
- ↑ "Bloqueo del sitio web y la única solución es deshabilitar HTTPS s... | AVG" . support.avg.com . 21 de julio de 2020. Archivado del original el 4 de febrero de 2022. Consultado el 4 de febrero de 2022 .
- ↑ a las 05:01, Thomas Claburn en San Francisco, 2 de octubre de 2018. "Google toma medidas contra el código disfrazado en Chrome Web Store" . www.theregister.co.uk . Archivado del original el 12 de noviembre de 2019. Consultado el 12 de noviembre de 2019 .
{{cite web}}: CS1 maint: nombres numéricos: lista de autores ( enlace ) - ↑ Cimpanu, Catalin. "Mozilla anuncia la prohibición de extensiones de Firefox que contienen código ofuscado" . ZDNet . Archivado del original el 5 de marzo de 2020. Consultado el 12 de noviembre de 2019 .
- ↑ "Razonamiento detrás del lenguaje 'forma preferida de la obra para realizar modificaciones a la misma' en la GPL" . Lwn.net. Archivado del original el 2 de diciembre de 2013. Recuperado el 25 de noviembre de 2013 .
- ↑ "¿Qué es el software libre?" . gnu.org. Archivado del original el 14 de octubre de 2013. Consultado el 18 de diciembre de 2014 .
- ^ Zhou, Mingyi; Gao, Xiang; Wu, Jing; Grundy, John C.; Chen, Xiao; Chen, Chunyang; Li, Li (2023). "Modelo de ofuscación para proteger las redes neuronales implementadas" .
{{cite journal}}: Para citar una revista se requiere|journal=( ayuda ) - ↑ Zhang, Tianwei; He, Zecheng; Lee, Ruby B. (12 de julio de 2018). "Aprendizaje automático que preserva la privacidad mediante la ofuscación de datos". arXiv : 1807.01860 [ cs.CR ].
Lecturas adicionales
- Seyyedhamzeh, Javad, ABCME: Un nuevo motor metamórfico , 17.ª Conferencia Nacional de Computación, Universidad Tecnológica Sharif, Teherán, Irán, 2012.
- B. Barak, O. Goldreich, R. Impagliazzo, S. Rudich, A. Sahai, S. Vadhan y K. Yang. «Sobre la (im)posibilidad de los programas de ofuscación» . XXI Conferencia Internacional Anual de Criptología , Santa Bárbara, California, EE. UU. Springer Verlag LNCS Volumen 2139, 2001.
- Mateas, Michael; Nick Montfort. «Una caja, oscura: ofuscación, lenguajes extraños y estética del código» (PDF) . Actas de la 6.ª Conferencia de Artes y Cultura Digital, Universidad de Tecnologías de la Información de Copenhague, 1-3 de diciembre de 2005. págs. 144-153 . Archivado (PDF) del original el 23 de junio de 2008. Recuperado el 28 de junio de 2008 .
Enlaces externos
- El concurso internacional de código C ofuscado
- Protección del código Java mediante ofuscación de código , ACM Crossroads, número de primavera de 1998
- ¿Podemos ofuscar los programas?
- Yury Lifshits. Apuntes de clase sobre ofuscación de programas (Primavera de 2005)
- c2:Computación de caja negra
- Ofuscación de software
- Código fuente
- Transformación del programa