stringtranslate.com

Políglota (informática)

En informática , un políglota es un programa o script informático (u otro archivo) escrito en una forma válida de múltiples lenguajes de programación o formatos de archivo . [1] El nombre fue acuñado 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 deben compilar o interpretar 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 característica común es clave para el desarrollo de políglotas. [3] Los archivos políglotas tienen aplicaciones prácticas en compatibilidad , [4] pero también pueden presentar un riesgo de seguridad cuando se usan para eludir la validación o 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 los años 1990. Un ejemplo temprano notable, llamado simplemente rec.puzzles, polyglotse publicó en el grupo Usenet rec.puzzles en 1991, admitiendo 8 idiomas, aunque esto se inspiró en programas incluso anteriores. [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 ganaron atención como un mecanismo de canal encubierto para la propagación de malware . [3] [7] Los archivos políglotas tienen aplicaciones prácticas en compatibilidad , [8]

Construcción

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

Ejemplos

C, PHP y Bash

Dos técnicas que se utilizan habitualmente para construir un programa políglota son utilizar lenguajes que utilizan 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 "\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 #*/                                                     

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  #*/

Destacado para C

 #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 #*/               

Tenga en cuenta lo siguiente:

SNOBOL4, Win32Forth, PureBasicv4.x y REBOL

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

Destacado para SNOBOL

 * BUFFER  :  AA  ;  .(  ¡Hola,  mundo  !)  @  Para  incluir?  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  S omeDummyMacroHere  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  ;  ¿ Desea  refinarlo  con un nuevo lenguaje ? ¡ Adelante !        

Destacado para Forth

 *BUFFER : AA ; . ( ¡Hola, mundo !) @ Para incluir? 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 ; ¿ Desea refinarlo con un nuevo idioma ? Seguir !                                                                                          

Destacado para BASIC

 * BUFFER : A . A ; . ( Hola , mundo ! ) @ Para Incluir ? 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 - modos sistema / puertos / entrada [ binario: verdadero ] Input set - modos sistema / puertos / entrada [ binario: falso ] NOP: : EndMacro ; ¿ Quieres perfeccionarlo con un nuevo lenguaje ? ¡ Adelante !                                                                          

Destacado para REBOL

 *BUFFER  :  AA  ; .( ¡Hola, mundo !) @ Para Incluir?  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  ; ¿Quieres perfeccionarlo con un nuevo lenguaje? ¡Adelante!

Archivo por lotes de DOS y Perl

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

Destacado para lotes DOS

 @ rem = ' --PERL--  @ echo desactivado perl " %~dpnx0 "  %*  ir  al final de perl  @ 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 DOS con un mínimo esfuerzo. Tenga en cuenta que no existe ningún requisito para que un archivo realice exactamente la misma función en los diferentes intérpretes.

Tipos

Los tipos políglotas incluyen: [3]

Beneficios

Marcado políglota

Se ha propuesto el marcado políglota como una combinación útil de los beneficios de HTML5 y XHTML . [9] Dichos documentos se pueden analizar como HTML (que es compatible con SGML ) o XML , y producirán la misma estructura DOM de cualquier manera. 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 se puede servir como HTML o XHTML, según la compatibilidad del navegador y el tipo MIME.

Como se expresa en la recomendación html-polyglot [9] , para escribir un documento HTML5 políglota se deben tener en cuenta los siguientes puntos clave:

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

El documento de marcado políglota más básico posible se vería así: [9]

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

En un documento de marcado políglota, los elementos no nulos (como script, p, div) no pueden cerrarse automáticamente incluso si 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 se debe usar <textarea></textarea>en su lugar.

Formatos de composición

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

Compatibilidad

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

Implicaciones de seguridad

Un políglota de dos formatos puede componer esteganográficamente una carga 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 verse obligado a ejecutar la carga, cediendo el control al atacante. La falta de correspondencia entre lo que el programa de interpretación espera y lo que el archivo realmente contiene 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.

Tenga en cuenta que, en un contexto de seguridad, no existe ningún requisito de que un archivo políglota sea estrictamente válido en múltiples formatos; es suficiente con que el archivo desencadene un comportamiento no deseado al ser interpretado por su intérprete principal.

Los formatos de archivo altamente flexibles o extensibles tienen un mayor alcance para la poliglotización y, por lo tanto, una interpretación más restringida ofrece cierta mitigación contra los ataques que utilizan técnicas políglotas. Por ejemplo, el formato de archivo PDF requiere que el número mágico %PDF aparezca en el byte de desplazamiento cero, pero muchos intérpretes PDF renuncian a esta restricción y aceptan el archivo como 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 sea PDF en el encabezado del archivo. [3] El formato PDF ha sido descrito como "diverso y vago", y debido a la variación significativa del comportamiento entre los diferentes motores de análisis de PDF, es posible crear un PDF-PDF políglota que se represente como dos documentos completamente diferentes en dos lectores PDF diferentes. [13]

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 tipo de archivo, como file . En 2019, una evaluación de software antimalware comercial determinó que varios de esos paquetes no pudieron detectar ninguno de los programas maliciosos políglotas que se estaban probando. [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. [14] La naturaleza políglota del ataque, combinada con consideraciones regulatorias, generó complicaciones de 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 A/V no pueden eliminar el archivo de malware ya que contiene información de salud protegida del paciente". [15]

Ataque GIFAR

Un archivo Java de formato de intercambio de gráficos ( GIFAR ) es un archivo políglota que está simultáneamente en formato GIF y JAR . [16] Esta técnica se puede utilizar para explotar vulnerabilidades de seguridad, por ejemplo, cargando 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 entregado al navegador desde el mismo origen . [17] Java fue parcheado en JRE 6 Update 11, con un CVE publicado en diciembre de 2008. [18] [19]

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

Terminología relacionada

Véase también

Referencias

  1. ^ abc 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 las comunicaciones - CCS '13 . págs. 753–764. doi :10.1145/2508859.2516685. ISBN 9781450324779. S2CID  16516484. Archivado desde el original el 5 de septiembre de 2022 . Consultado el 5 de septiembre de 2022 .
  2. ^ ab 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 publicidad: una evaluación de 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. ^ abcde 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 del XHTML5 políglota". Archivado desde el original el 12 de octubre de 2011. Consultado el 4 de septiembre de 2022 .
  5. ^ «Polyglot: Un programa en ocho idiomas». Archivado desde el original el 6 de septiembre de 2022. Consultado el 6 de septiembre de 2022 .
  6. ^ "15º Concurso Internacional de Código C Ofuscado (2000)". Archivado desde el original el 6 de septiembre de 2022 . Consultado el 6 de septiembre de 2022 .
  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 del XHTML5 políglota". Archivado desde el original el 12 de octubre de 2011. Consultado el 4 de septiembre de 2022 .
  9. ^ abc «Polyglot Markup: A robust profile of the HTML5 dictionary». Archivado desde el original el 9 de agosto de 2022. Consultado el 4 de septiembre de 2022 .
  10. ^ Polyglot Markup: HTML-Compatible XHTML Documents: 6.4 Void Elements Archivado el 2 de octubre de 2012 en Wayback Machine . Borrador del editor del W3C del 9 de julio de 2012.
  11. ^ "Archivos de doble personalidad DICOM-TIFF". Archivado desde el original el 5 de septiembre de 2022 . Consultado el 5 de septiembre de 2022 .
  12. ^ Schofield, Ed. "Hoja de referencia: cómo escribir código compatible con Python 2-3". Archivado desde el original el 6 de septiembre de 2022. Consultado el 6 de septiembre de 2022 .
  13. ^ Wolf, Julia (9 de febrero de 2011). "OMG WTF PDF". 27º Congreso de Comunicación del Caos . Archivado desde el original el 9 de octubre de 2022. Consultado el 6 de septiembre de 2022 .
  14. ^ 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 desde el original el 5 de septiembre de 2022 . Consultado el 5 de septiembre de 2022 .
  15. ^ "Un error omnipresente permite que malware protegido por HIPAA se oculte detrás de imágenes médicas". 17 de abril de 2019. Archivado desde el original el 5 de septiembre de 2022. Consultado el 5 de septiembre de 2022 .
  16. ^ Byrd, Christopher. «Cómo crear un GIFAR». Archivado desde el original el 6 de marzo de 2023. Consultado el 6 de marzo de 2023 .
  17. ^ Eckel, Benjamin (5 de agosto de 2008). «La vulnerabilidad de la imagen GIFAR». Hackaday . Archivado desde el original el 6 de marzo de 2023. Consultado el 6 de marzo de 2023 .
  18. ^ "CVE-2008-5343". cve.mitre.org . 4 de diciembre de 2008. Archivado desde el original el 20 de abril de 2021 . Consultado el 20 de abril de 2021 .
  19. ^ McMillan, Robert (1 de agosto de 2008). "Una foto que puede robar tus credenciales en línea". Infoworld.com. Archivado desde el original el 18 de septiembre de 2020.
  20. ^ Ríos, Billy (17 de diciembre de 2008). «Billy (BK) Ríos » SUN corrige GIFAR». Archivado desde el original el 14 de marzo de 2016. Consultado el 20 de abril de 2021 .
  21. ^ 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. Consultado el 28 de mayo de 2015 .
  22. ^ Gupta, Tripta (19 de diciembre de 2018). «Análisis de microservicios políglotas». Medium . Archivado desde el original el 5 de agosto de 2019. Consultado el 5 de agosto de 2019 .

Enlaces externos