Articulo de referencia

Políglota (informática)

En informática , un políglota es un programa o script (u otro archivo) escrito en una forma válida de múltiples lenguajes de programación o formatos de archivo . [ 1 ] El términ...

En informática , un políglota es un programa o script (u otro archivo) escrito en una forma válida de múltiples lenguajes de programación o formatos de archivo . [ 1 ] El término se acuñó por analogía con el multilingüismo . Un archivo políglota se compone combinando la sintaxis de dos o más formatos diferentes. [ 2 ]

Cuando los formatos de archivo se compilan o interpretan como código fuente , se puede decir que el archivo es un programa políglota , aunque los formatos de archivo y la sintaxis del código fuente son fundamentalmente flujos de bytes, y explotar esta similitud es clave para el desarrollo de políglotas. [ 3 ] Los archivos políglotas tienen aplicaciones prácticas limitadas en compatibilidad , [ 4 ] pero también pueden presentar un riesgo de seguridad cuando se utilizan para eludir la validación o para explotar una vulnerabilidad .

Historia

Los programas políglotas se han creado como desafíos y curiosidades en la cultura hacker desde al menos principios de la década de 1990. Un ejemplo temprano notable, llamado simplemente rec.puzzles, polyglotse publicó en el grupo de Usenet rec.puzzles en 1991, y admitía ocho lenguajes, aunque se inspiró en programas aún más antiguos. [ 5 ] En 2000, un programa políglota fue nombrado ganador en el Concurso Internacional de Código C Ofuscado . [ 6 ]

En el siglo XXI, los programas y archivos políglotas cobraron importancia como mecanismo de canal encubierto para la propagación de malware . [ 3 ] [ 7 ] Los archivos políglotas tienen aplicaciones prácticas limitadas en cuanto a compatibilidad . [ 8 ]

Construcción

Un políglota se compone de la combinación de sintaxis de dos o más formatos diferentes, aprovechando diversas construcciones sintácticas comunes a ambos formatos o construcciones específicas de cada idioma que, sin embargo, tienen un significado distinto en cada uno. Un archivo es un políglota válido si puede ser interpretado correctamente por varios programas intérpretes. Por ejemplo, un políglota PDF-Zip podría abrirse como un documento PDF válido y descomprimirse como un archivo zip válido . Para mantener la validez entre los programas intérpretes, es necesario asegurar que las construcciones específicas de un intérprete no sean interpretadas por otro, y viceversa. Esto se suele lograr ocultando las construcciones específicas de cada idioma en segmentos interpretados como comentarios o texto plano del otro formato. [ 1 ]

Ejemplos

C, PHP y Bash

Dos técnicas comúnmente utilizadas para construir un programa políglota son usar lenguajes que emplean caracteres diferentes para los comentarios y redefinir varios tokens como otros en distintos lenguajes. Estas técnicas se demuestran en este programa políglota de dominio público escrito en ANSI C , PHP y bash :

Destacado para Bash

#define a /* #<?php echo "\010Hello, world!\n" ; // 2 > /dev/null > /dev/null \ ; // 2 > /dev/null ; x = a ; $x = 5 ; // 2 > /dev/null \ ; if (( $x )) // 2 > /dev/null ; then return 0 ; // 2 > /dev/null ; fi #define e ?> #define b */ #include <stdio.h> #define main() int main(void) #define printf printf( #define true ) #define function function main () { printf "Hello, world!\n" true/* 2 > /dev/null | grep -v true*/ ; return 0 ; } #define c /* main #*/

Destacado para PHP

#define a /* # <?php echo " \010 Hola, mundo! \n " ; // 2> /dev/null > /dev/null \ ; // 2> /dev/null; x=a; $x = 5 ; // 2> /dev/null \ ; if (( $x )) // 2> /dev/null; then return 0 ; // 2> /dev/null; fi #define e ?> #define b */ #include <stdio.h> #define main() int main(void) #define printf printf( #define true ) #define function function main () { printf "Hola, mundo! \n " true /* 2> /dev/null | grep -v true*/ ; return 0 ; } #define c /* main #*/

Resaltado para C

#define a /* #<?php echo "\010Hello, world!\n";// 2> /dev/null > /dev/null \ ; // 2> /dev/null; x=a; $x=5; // 2> /dev/null \ ; if (($x)) // 2> /dev/null; then return 0; // 2> /dev/null; fi #define e ?> #define b */ #include <stdio.h> #define main() int main(void) #define printf printf( #define true ) #define function function main () { printf "Hello, world! \n " true /* 2> /dev/null | grep -v true*/ ; return 0 ; } #define c /* main #*/

Tenga en cuenta lo siguiente:

  • En C, el símbolo de almohadilla (#) indica una instrucción del preprocesador , pero en bash y PHP se considera un comentario.
  • "//" es un comentario tanto en PHP como en C y el directorio raíz en bash.
  • La redirección de shell se utiliza para eliminar salidas no deseadas.
  • Incluso en las líneas comentadas, los indicadores PHP " <?php" y " " siguen teniendo efecto.?>
  • La instrucción " function main()" es válida tanto en PHP como en bash; las directivas #define de C se utilizan para convertirla en " int main(void)" en tiempo de compilación.
  • Los indicadores de comentarios se pueden combinar para realizar diversas operaciones.
  • " if (($x))" es una instrucción válida tanto en bash como en PHP.
  • printfes una función integrada del shell bash que es idéntica a la función printf de C , excepto por la omisión de los corchetes (que el preprocesador de C agrega si se compila con un compilador de C ).
  • Las últimas tres líneas solo las usa Bash para llamar a la mainfunción. En PHP, la mainfunción está definida pero no se llama, y ​​en C no es necesario llamarla explícitamente main.

SNOBOL4, Win32Forth, PureBasicv4.x y REBOL

Lo siguiente está escrito simultáneamente en SNOBOL 4, Win32Forth , PureBasicv 4.x y REBOL :

Destacado para SNOBOL

* BÚFER : AA ; .( ¡Hola, mundo !) @ ¿Incluir ? Macro SaltarEsto ; SALIDA = Carácter ( 10 ) "¡Hola, mundo!" ; Entrada de una tecla Entrada ( 'carácter' , 1 , '[-f2-q1]' ) ; Carácter Fin ; SNOBOL4 + PureBASIC + Win32Forth + REBOL = < 3 FinMacro : AbrirConsola() : ImprimirN("¡Hola, mundo !") Repetir : Hasta Inkey() : Macro S omeDummyMacroHere REBOL [ Título : "'¡Hola, mundo !' en 4 idiomas" CopyLeft : "Desarrollado en 2010 por Society " ] Imprimir "¡Hola, mundo!" FinMacro : func [][] set-modes system / ports / input [ binario : verdadero] Entrada set-modes system / ports / input [ binario : falso] NOP:: FinMacro ; ¿ Deseas perfeccionarlo con un nuevo lenguaje ? ¡ Adelante !

Destacado para el cuarto año

*BUFFER : AA ; . ( Hola, mundo !) @ ¿ Para incluir? Macro SkipThis; SALIDA = Char(10) "¡Hola, mundo !" ;OneKeyInput Input('Char', 1 , '[-f2-q1]') ; Char End; SNOBOL4 + PureBASIC + Win32Forth + REBOL = <3 EndMacro: OpenConsole() : PrintN("¡Hola, mundo !") Repeat : Until Inkey() : Macro SomeDummyMacroHere REBOL [ Título: "'¡Hola, mundo !' en 4 idiomas" CopyLeft: "Desarrollado en 2010 por Society" ] Print "¡Hola, mundo !" EndMacro: func [][] set-modes system/ports/input [binary: true] Input set-modes system/ports/input [binary: false] NOP:: EndMacro ; ¿ Desea refinarlo con un nuevo idioma ? Seguir !

Destacado para BASIC

* BUFFER : A . A ; . ( Hola , mundo ! ) @ To Including ? Macro SkipThis ; OUTPUT = Char ( 10 ) "Hola, mundo !" ; OneKeyInput Input ( 'Char', 1, '[-f2-q1]') ; Char End ; SNOBOL4 + PureBASIC + Win32Forth + REBOL = < 3 EndMacro: OpenConsole () : PrintN ( "Hola, mundo !" ) Repeat : Until Inkey () : Macro SomeDummyMacroHere REBOL [ Título: "'Hola, mundo !' en 4 idiomas" CopyLeft: "Desarrollado en 2010 por Society" ] Print "Hola, mundo !" EndMacro: func [][] set - modes system / ports / input [ binary: true ] Input set - modes system / ports / input [ binary: false ] NOP: : EndMacro ; ¿ Deseas perfeccionarlo con un nuevo lenguaje ? ¡ Adelante !

Destacado para REBOL

*BUFFER : AA ; .( Hola, mundo !) @ ¿Incluir? Macro SkipThis; SALIDA = Char ( 10 ) "¡Hola, mundo!" ;OneKeyInput Input('Char', 1, '[-f2-q1]') ; Char End; SNOBOL4 + PureBASIC + Win32Forth + REBOL = <3 EndMacro: OpenConsole () : PrintN ( "Hola, mundo !" ) Repeat : Until Inkey () : Macro SomeDummyMacroHere REBOL [ Título: "'Hola, mundo !' en 4 idiomas" CopyLeft: "Desarrollado en 2010 por Society" ] Imprimir "¡Hola, mundo!" EndMacro: func [][] set-modes system /ports/input [ binary: true ] Input set-modes system /ports/input [ binary: false ] NOP:: EndMacro ; ¿Deseas perfeccionarlo con un nuevo lenguaje? ¡Adelante!

Archivo por lotes de MS-DOS y Perl

El siguiente archivo se ejecuta como un archivo por lotes de MS-DOS y luego se vuelve a ejecutar en Perl :

Destacado para lotes de DOS

@ rem = ' --PERL-- @ echo off perl " %~dpnx0 " %* ir a endofperl @ rem '; #!perl Imprimir "¡Hola, mundo!\n" ; __FIN__ : fin de perl

Destacado para Perl

@rem = ' --PERL-- @echo off perl "%~dpnx0" %* goto endofperl @rem ' ; #!perl print "Hola, mundo!\n" ; __END__ :endofperl

Esto permite crear scripts de Perl que se pueden ejecutar en sistemas MS-DOS con un mínimo esfuerzo. Cabe destacar que no es necesario que un archivo realice exactamente la misma función en los diferentes intérpretes.

Tipos

Los tipos políglotas incluyen: [ 3 ]

  • pilas , donde se concatenan varios archivos entre sí
  • parásitos donde un formato de archivo secundario está oculto dentro de campos de comentarios en un formato de archivo primario
  • cremalleras donde dos archivos están organizados mutuamente dentro de los comentarios del otro
  • cavidades , donde un formato de archivo secundario se oculta dentro de áreas rellenas con caracteres nulos del archivo principal.

Beneficios

Marcado políglota

El marcado políglota se ha propuesto como una combinación útil de las ventajas de HTML5 y XHTML . [ 9 ] Dichos documentos pueden analizarse como HTML (que es compatible con SGML ) o XML , y producirán la misma estructura DOM en ambos casos. Por ejemplo, para que un documento HTML5 cumpla con estos criterios, los dos requisitos son que debe tener un doctype HTML5 y estar escrito en XHTML bien formado. El mismo documento puede entonces servirse como HTML o XHTML, dependiendo de la compatibilidad del navegador y el tipo MIME.

Tal como lo expresa la recomendación html-polyglot , [ 9 ] para escribir un documento HTML5 políglota, se deben observar los siguientes puntos clave:

  1. Las instrucciones de procesamiento y la declaración XML están prohibidas en el marcado políglota.
  2. Especificar la codificación de caracteres de un documento.
  3. El DOCTYPE
  4. Espacios de nombres
  5. Sintaxis de elementos (es decir, las etiquetas de cierre no son opcionales. Utilice etiquetas de cierre automático para elementos vacíos).
  6. Contenido del elemento
  7. El texto (es decir, pre y textarea no deben comenzar con un carácter de nueva línea )
  8. Atributos (es decir, los valores deben ir entre comillas)
  9. Referencias a entidades nombradas (es decir, solo amp, lt, gt, apos, quot)
  10. Comentarios (es decir, usar < !-- sintaxis -- > )
  11. Escritura y estilo de marcado políglota

Por lo tanto, el documento de marcado políglota más básico posible tendría este aspecto: [ 9 ]

<!DOCTYPE html> < html xmlns = "http://www.w3.org/1999/xhtml" lang = "" xml:lang = "" > < head > < title > El elemento title no debe estar vacío. </ title > </ head > < body > </ body > </ html >

En un documento de marcado políglota, los elementos no vacíos (como script, p, div) no pueden cerrarse solos aunque estén vacíos, ya que esto no es HTML válido. [ 10 ] Por ejemplo, para agregar un área de texto vacía a una página, no se puede usar <textarea/>, sino que hay que usar <textarea></textarea>en su lugar.

Formatos de composición

El formato de imágenes médicas DICOM fue diseñado para permitir la compatibilidad con archivos TIFF , lo que permite un almacenamiento eficiente de los mismos datos de imagen en un archivo que puede ser interpretado tanto por visores DICOM como TIFF. [ 11 ]

Compatibilidad

Los lenguajes de programación Python 2 y Python 3 no fueron diseñados para ser compatibles entre sí, pero existe suficiente similitud de sintaxis como para que se pueda escribir un programa Python políglota que funcione en ambas versiones. [ 12 ]

Implicaciones de seguridad

Un programa que utiliza varios formatos puede componer esteganográficamente una carga útil maliciosa dentro de un formato contenedor aparentemente benigno y ampliamente aceptado, como un archivo JPEG que permite datos arbitrarios en su campo de comentarios. Un renderizador JPEG vulnerable podría entonces ser forzado a ejecutar la carga útil, cediendo el control al atacante. La discrepancia entre lo que espera el programa intérprete y lo que realmente contiene el archivo es la causa principal de la vulnerabilidad. [ 1 ]

La inyección SQL es una forma trivial de políglota, donde un servidor espera ingenuamente que la entrada controlada por el usuario se ajuste a una determinada restricción, pero el usuario proporciona una sintaxis que se interpreta como código SQL.

Cabe señalar que, en un contexto de seguridad, no es necesario que un archivo políglota sea estrictamente válido en múltiples formatos; basta con que el archivo provoque un comportamiento no deseado al ser interpretado por su intérprete principal.

Los formatos de archivo altamente flexibles o extensibles ofrecen mayor margen para el políglota, y por lo tanto, una interpretación más restringida proporciona cierta mitigación contra los ataques que utilizan técnicas políglotas. Por ejemplo, el formato de archivo PDF permite que el número mágico%PDF- aparezca en cualquier parte del archivo, [ 13 ] y muchos intérpretes de PDF aceptan el archivo como un PDF válido siempre que la cadena aparezca dentro de los primeros 1024 bytes. Esto crea una ventana de oportunidad para que los archivos PDF políglotas introduzcan contenido que no es PDF en el encabezado del archivo. [ 3 ] El formato PDF se ha descrito como "diverso y vago", y debido a la variación significativa en el comportamiento entre los diferentes motores de análisis de PDF, es posible crear un PDF-PDF políglota que se muestre como dos documentos completamente diferentes en dos lectores de PDF diferentes. [ 14 ]

La detección de malware oculto en archivos políglotas requiere un análisis más sofisticado que el que se basa en utilidades de identificación de tipos de archivo como file . En 2019, una evaluación de software antimalware comercial determinó que varios de estos paquetes no pudieron detectar ninguno de los tipos de malware políglotas analizados. [ 3 ] [ 2 ]

En 2019, se descubrió que el formato de archivo de imágenes médicas DICOM era vulnerable a la inyección de malware mediante una técnica políglota PE -DICOM. [ 15 ] La naturaleza políglota del ataque, junto con consideraciones regulatorias, generó complicaciones en la desinfección: debido a que "el malware está esencialmente fusionado con archivos de imágenes legítimos", "los equipos de respuesta a incidentes y el software antivirus no pueden eliminar el archivo de malware, ya que contiene información protegida de salud del paciente". [ 16 ]

Ataque GIFAR

Un archivo GIFAR ( Graphics Interchange Format Java Archives ) es un archivo políglota que está simultáneamente en formato GIF y JAR . [ 17 ] Esta técnica puede usarse para explotar vulnerabilidades de seguridad, por ejemplo, subiendo un GIFAR a un sitio web que permite la carga de imágenes (ya que es un archivo GIF válido) y luego haciendo que la parte Java del GIFAR se ejecute como si fuera parte del código previsto del sitio web, siendo entregada al navegador desde el mismo origen . [ 18 ] Java fue parcheado en JRE 6 Update 11, con una CVE publicada en diciembre de 2008. [ 19 ] [ 20 ]

Los GIFAR son posibles porque las imágenes GIF almacenan su encabezado al principio del archivo, y los archivos JAR (al igual que cualquier formato basado en archivos ZIP) almacenan sus datos al final. [ 21 ]

Véase también

Referencias

  1. 1 2 3 Jonas Magazinius; Billy K. Rios; Andrei Sabelfeld (4 de noviembre de 2013). "Políglotas" . Actas de la conferencia ACM SIGSAC de 2013 sobre seguridad informática y de comunicaciones - CCS '13 . págs. 753–764 . doi : 10.1145/2508859.2516685 . ISBN  9781450324779. S2CID 16516484 . Archivado del original el 5 de septiembre de 2022 . Recuperado el 5 de septiembre de 2022 . 
  2. 1 2 Bridges, Robert A.; Oesch, Sean; Verma, Miki E.; Iannacone, Michael D.; Huffer, Kelly MT; Jewell, Brian; Nichols, Jeff A.; Weber, Brian; Beaver, Justin M.; Smith, Jared M.; Scofield, Daniel; Miles, Craig; Plummer, Thomas; Daniell, Mark; Tall, Anne M. (2023). "Más allá de la exageración: una evaluación de los detectores de malware basados ​​en aprendizaje automático disponibles comercialmente". Amenazas digitales: investigación y práctica . 4 (2): 1– 22. arXiv : 2012.09214 . doi : 10.1145/3567432 . S2CID 247218744 . 
  3. 1 2 3 4 5 Koch, Luke; Oesch, Sean; Adkisson, Mary; Erwin, Sam; Weber, Brian; Chaulagain, Amul (2022). "Hacia la detección de archivos políglotas". arXiv : 2203.07561 [ cs.CR ].
  4. "Beneficios de XHTML5 políglota" . Archivado del original el 12 de octubre de 2011. Consultado el 4 de septiembre de 2022 .
  5. "Polyglot: Un programa en ocho idiomas" . Archivado del original el 6 de septiembre de 2022. Consultado el 6 de septiembre de 2022 .
  6. "15º Concurso Internacional de Código C Ofuscado (IOCCC 2000)" . Consultado el 23 de marzo de 2026 .{{cite web}}: CS1 mantenimiento: estado de la URL ( enlace )
  7. Koch, Luke; Oesch, Sean; Chaulagain, Amul; Dixon, Jared; Dixon, Matthew; Huettal, Mike; Sadovnik, Amir; Watson, Cory; Weber, Brian; Hartman, Jacob; Patulski, Richard (2024). "Sobre el abuso y la detección de archivos políglotas". arXiv : 2407.01529 [ cs.CR ].
  8. "Beneficios de XHTML5 políglota" . Archivado del original el 12 de octubre de 2011. Consultado el 4 de septiembre de 2022 .
  9. 1 2 3 "Marcado políglota: Un perfil robusto del vocabulario HTML5" . Archivado del original el 9 de agosto de 2022. Recuperado el 4 de septiembre de 2022 .
  10. Marcado políglota: Documentos XHTML compatibles con HTML: 6.4 Elementos vacíos Archivado el 2 de octubre de 2012 en Wayback Machine . Borrador del editor del W3C, 9 de julio de 2012.
  11. "Archivos DICOM-TIFF de doble personalidad" . Archivado del original el 5 de septiembre de 2022. Recuperado el 5 de septiembre de 2022 .
  12. Schofield, Ed. "Hoja de trucos: Cómo escribir código compatible con Python 2-3" . Archivado del original el 6 de septiembre de 2022. Consultado el 6 de septiembre de 2022 .
  13. ISO/TC 171/SC 2 (2020). ISO 32000-2:2020 Gestión de documentos — Formato de documento portátil Parte 2: PDF 2.0 . Organización Internacional de Normalización. pág. 54. Consultado el 20 de junio de 2026 . {{cite book}}: CS1 maint: nombres numéricos: lista de autores ( enlace )
  14. Wolf, Julia (9 de febrero de 2011). "OMG WTF PDF" . 27.º Congreso de Comunicación del Caos . Archivado del original el 9 de octubre de 2022. Recuperado el 6 de septiembre de 2022 .
  15. Desjardins, Benoit; Mirsky, Yisroel; Ortiz, Markel Picado; Glozman, Zeev; Tarbox, Lawrence; Horn, Robert; Horii, Steven C. (abril de 2020). " ¡ Las imágenes DICOM han sido pirateadas! ¿Y ahora qué?" . American Journal of Roentgenology . 214 (4): 727– 735. doi : 10.2214/AJR.19.21958 . PMID 31770023. S2CID 208318324. Archivado del original el 5 de septiembre de 2022. Recuperado el 5 de septiembre de 2022 .  
  16. "Un fallo generalizado permite que el malware protegido por HIPAA se oculte tras imágenes médicas" . 17 de abril de 2019. Archivado del original el 5 de septiembre de 2022. Consultado el 5 de septiembre de 2022 .
  17. Byrd, Christopher. "Cómo crear un GIFAR" . Archivado del original el 6 de marzo de 2023. Recuperado el 6 de marzo de 2023 .
  18. Eckel, Benjamin (5 de agosto de 2008). "La vulnerabilidad de imagen GIFAR" . Hackaday . Archivado del original el 6 de marzo de 2023. Recuperado el 6 de marzo de 2023 .
  19. "CVE-2008-5343" . cve.mitre.org . 4 de diciembre de 2008. Archivado del original el 20 de abril de 2021. Consultado el 20 de abril de 2021 .
  20. McMillan, Robert (1 de agosto de 2008). "Una foto que puede robar tus credenciales en línea" . Infoworld.com. Archivado del original el 18 de septiembre de 2020.
  21. Rios, Billy (17 de diciembre de 2008). "Billy (BK) Rios » SUN Fixes GIFARs" . Archivado del original el 14 de marzo de 2016. Recuperado el 20 de abril de 2021 . 
  22. Fjeldberg, Hans (2008). Programación políglota: una perspectiva empresarial (PDF) (M.Sc). Universidad Noruega de Ciencia y Tecnología. Archivado (PDF) del original el 4 de marzo de 2016. Recuperado el 28 de mayo de 2015 .
  23. Gupta, Tripta (19 de diciembre de 2018). "Análisis de microservicios políglotas" . Medium . Archivado del original el 5 de agosto de 2019. Recuperado el 5 de agosto de 2019 .