stringtranslate.com

Полиглот (вычислительная техника)

В информатике полиглот это компьютерная программа или скрипт (или другой файл), написанный в допустимой форме нескольких языков программирования или форматов файлов . [1] Название было придумано по аналогии с многоязычием . Файл полиглота составляется путем объединения синтаксиса из двух или более различных форматов. [2]

Когда форматы файлов должны быть скомпилированы или интерпретированы как исходный код , можно сказать, что файл является программой-полиглотом , хотя форматы файлов и синтаксис исходного кода по сути являются потоками байтов, и использование этой общности является ключом к развитию полиглотов. [3] Файлы-полиглоты имеют практическое применение в обеспечении совместимости , [4] но также могут представлять угрозу безопасности , если используются для обхода проверки или эксплуатации уязвимости .

История

Полиглотные программы создавались как вызовы и диковинки в хакерской культуре по крайней мере с начала 1990-х годов. Известный ранний пример, названный просто, polyglotбыл опубликован в группе Usenet rec.puzzles в 1991 году, поддерживая 8 языков, хотя это было вдохновлено еще более ранними программами. [5] В 2000 году полиглотная программа была названа победителем Международного конкурса запутанного кода на языке C. [ 6]

В 21 веке программы и файлы-полиглоты привлекли внимание как механизм скрытого канала для распространения вредоносных программ . [3] [7] Файлы-полиглоты имеют практическое применение в области совместимости , [8]

Строительство

Полиглот состоит из объединения синтаксиса из двух или более различных форматов, используя различные синтаксические конструкции, которые являются общими для форматов или конструкции, специфичные для языка, но несущие разное значение в каждом языке. Файл является допустимым полиглотом, если он может быть успешно интерпретирован несколькими программами интерпретации. Например, полиглот PDF-Zip может быть открыт как допустимый документ PDF и распакован как допустимый архив zip . Чтобы поддерживать валидность в программах интерпретации, необходимо гарантировать, что конструкции, специфичные для одного интерпретатора, не будут интерпретироваться другим, и наоборот. Это часто достигается путем сокрытия языковых конструкций в сегментах, интерпретируемых как комментарии или простой текст другого формата. [1]

Примеры

C, PHP и Bash

Два часто используемых метода построения полиглот-программы — это использование языков, которые используют разные символы для комментариев , и переопределение различных токенов как других в разных языках. Они продемонстрированы в этом общедоступном полиглоте, написанном на ANSI C , PHP и bash :

Выделено для Bash

 #define a /* #<?php echo "\010Привет, мир!\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 "Привет, мир!\n" true/* 2 > /dev/null | grep -v true*/ ; return 0 ; } #define c /* main #*/                                                     

Выделено для PHP

#define a /* # <?php  echo  " \010 Привет, мир! \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  "Привет, мир! \n " true /* 2> /dev/null | grep -v true*/ ;  return  0 ;  }  #define c /*  main  #*/

Выделено для C

 #define a /* #<?php echo "\010Привет, мир!\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 "Привет, мир! \n " true /* 2> /dev/null | grep -v true*/ ; return 0 ; } #define c /* main #*/               

Обратите внимание на следующее:

SNOBOL4, Win32Forth, PureBasicv4.x и REBOL

Следующий код написан одновременно на SNOBOL 4, Win32Forth , PureBasicv 4.x и REBOL :

Выделено для SNOBOL

 * БУФЕР  :  AA  ;  .(  Привет,  мир  !)  @  Включить  ?  Макрос  SkipThis ;  ВЫХОД  =  Char ( 10 )  "Привет, мир !"  ; OneKeyInput  Input ( 'Char' ,  1 ,  '[-f2-q1]' )  ;  Char  End ;  SNOBOL4  +  PureBASIC  +  Win32Forth  +  REBOL  =  < 3  EndMacro :  OpenConsole()  :  PrintN("Привет,  мир  !")  Повторить  :  Пока  Inkey()  :  Макрос  SomeDummyMacroHere REBOL [ Заголовок : "'Привет, мир !' на  4 языках " CopyLeft : "Разработано в 2010 году компанией S ociety" ] Печать "Привет, мир !" EndMacro : func [ ][] set-modes system / ports / input [ binary : true] Input set-modes system / ports / input [ binary : false ] NOP:: EndMacro ; Хотите усовершенствовать его с помощью нового языка ? Продолжайте !                                           

Выделено для Forth

 *БУФЕР : AA ; . ( Привет, мир !) @ Включить ? Макрос SkipThis; ВЫХОД = Char(10) "Привет, мир !" ;OneKeyInput Input('Char', 1 , '[-f2-q1]') ; Char End; SNOBOL4 + PureBASIC + Win32Forth + REBOL = <3 EndMacro: OpenConsole() : PrintN("Привет, мир !") Повторить : До Inkey() : Макрос SomeDummyMacroHere REBOL [ Заголовок: "'Привет, мир !' на 4 языках" CopyLeft: "Разработано в 2010 году компанией Society" ] Печать "Привет, мир !" EndMacro: func [][] set-modes system/ports/input [двоичный: true] Вход set-modes system/ports/input [двоичный: false] NOP:: EndMacro ; Хотите дополнить его новым языком ? Продолжайте !                                                                                          

Выделено для BASIC

 * БУФЕР : A . A ; . ( Привет , мир ! ) @ Включая ? Макрос SkipThis ; ВЫХОД = Char ( 10 ) " Привет, мир !" ; OneKeyInput Input ( 'Char' , 1, '[-f2-q1]') ; Конец символа ; SNOBOL4 + PureBASIC + Win32Forth + REBOL = < 3 EndMacro: OpenConsole () : PrintN ( " Привет, мир !" ) Повторить : До Inkey () : Макрос SomeDummyMacroHere REBOL [ Заголовок: " ' Привет, мир !' на 4 языках" CopyLeft: " Разработано в 2010 году компанией Society" ] Печать " Привет, мир !" EndMacro: func [][] set - modes system / ports / input [ binary : true ] Input set - modes system / ports / input [ binary : false ] NOP: : EndMacro ; Хотите усовершенствовать его с помощью нового языка ? Продолжайте !                                                                          

Выделено для REBOL

 *БУФЕР  :  AA  ; .(Привет, мир !) @ Включить?  Макрос  SkipThis;  ВЫХОД  =  Char ( 10 )  "Привет, мир !"  ;OneKeyInput Input('Char', 1, '[-f2-q1]') ;  Конец символа;  SNOBOL4  +  PureBASIC  +  Win32Forth  +  REBOL  =  <3  EndMacro:  OpenConsole ()  :  PrintN ( "Привет, мир !" )  Повторить  :  До  Inkey ()  :  Макрос  SomeDummyMacroHere  REBOL  [  Заголовок:  "'Привет, мир !' на 4 языках"  CopyLeft:  "Разработано в 2010 году компанией Society"  ]  Печать  "Привет, мир !"  EndMacro:  func  [][]  set-modes  system /ports/input  [ binary:  true ]  Input  set-modes  system /ports/input  [ binary:  false ]  NOP::  EndMacro  ; Хотите усовершенствовать его с помощью нового языка? Продолжайте!

Пакетный файл DOS и Perl

Следующий файл запускается как пакетный файл DOS , а затем повторно запускается в Perl :

Выделено для пакета DOS

 @ rem = ' --PERL--  @ echo off perl " %~dpnx0 "  %*  goto  endofperl  @ rem '; #!perl распечатать "Привет, мир!\n" ; __КОНЕЦ__ : endofperl

Выделено для Perl

 @rem = ' --PERL-- @echo off perl "%~dpnx0" %* goto endofperl @rem ' ; #!perl print "Привет, мир!\n" ; __END__ :endofperl      

Это позволяет создавать скрипты Perl, которые можно запускать в системах DOS с минимальными усилиями. Обратите внимание, что нет необходимости в том, чтобы файл выполнял одну и ту же функцию в разных интерпретаторах.

Типы

К полиглотическим типам относятся: [3]

Преимущества

Полиглотная разметка

Разметка полиглотов была предложена как полезное сочетание преимуществ HTML5 и XHTML . [9] Такие документы могут быть проанализированы как HTML (который совместим с SGML ) или XML , и в любом случае будет создана та же структура DOM . Например, для того, чтобы документ HTML5 соответствовал этим критериям, два требования заключаются в том, что он должен иметь тип документа HTML5 и быть написанным на правильно сформированном XHTML. Затем один и тот же документ может быть представлен как HTML или XHTML, в зависимости от поддержки браузера и типа MIME.

Как указано в рекомендации html-polyglot [9] , для написания полиглотного документа HTML5 необходимо соблюдать следующие ключевые моменты:

  1. Инструкции по обработке и декларация XML запрещены в полиглотной разметке.
  2. Указание кодировки символов документа
  3. DOCTYPE-ТИП
  4. Пространства имен
  5. Синтаксис элемента (т. е. закрывающие теги не являются обязательными. Используйте самозакрывающиеся теги для пустых элементов.)
  6. Содержание элемента
  7. Текст (т.е. pre и textarea не должны начинаться с символа новой строки)
  8. Атрибуты (т.е. значения должны быть заключены в кавычки)
  9. Ссылки на именованные сущности (т.е. только amp, lt, gt, apos, quot)
  10. Комментарии (т.е. используйте синтаксис <!-- -->)
  11. Скриптинг и стилизация полиглот-разметки

Таким образом, наиболее простой возможный документ полиглотной разметки будет выглядеть следующим образом: [9]

<!DOCTYPE html> < html  xmlns = "http://www.w3.org/1999/xhtml"  lang = ""  xml:lang = "" >  < head >  < title > Элемент title не должен быть пустым. </ title >  </ head >  < body >  </ body > </ html >

В документе полиглотной разметки непустые элементы (такие как script, p, div) не могут быть самозакрывающимися, даже если они пустые, поскольку это недопустимый HTML. [10] Например, чтобы добавить пустую текстовую область на страницу, нельзя использовать <textarea/>, вместо этого нужно использовать <textarea></textarea>.

Форматы сочинения

Формат медицинских изображений DICOM был разработан для обеспечения возможности многоязычного использования файлов TIFF , что позволяет эффективно хранить одни и те же данные изображения в файле, который может быть интерпретирован как средствами просмотра DICOM, так и средствами просмотра TIFF. [11]

Совместимость

Языки программирования Python 2 и Python 3 не были разработаны для обеспечения совместимости друг с другом, но у них достаточно общего синтаксиса, чтобы можно было написать многоязычную программу на Python, которая будет работать в обеих версиях. [12]

Последствия для безопасности

Полиглот двух форматов может стеганографически составить вредоносную полезную нагрузку внутри якобы безвредного и широко распространенного формата-оболочки, такого как файл JPEG, который допускает произвольные данные в своем поле комментариев. Уязвимый рендерер JPEG затем может быть принужден к выполнению полезной нагрузки, передавая управление злоумышленнику. Несоответствие между тем, что ожидает интерпретирующая программа, и тем, что на самом деле содержит файл, является основной причиной уязвимости. [1]

SQL-инъекция — это тривиальная форма полиглота, при которой сервер наивно ожидает, что вводимые пользователем данные будут соответствовать определенным ограничениям, но пользователь предоставляет синтаксис, который интерпретируется как код SQL.

Обратите внимание, что в контексте безопасности не существует требования, чтобы файл-полиглот был строго допустим в нескольких форматах; достаточно, чтобы файл вызывал непреднамеренное поведение при интерпретации его основным интерпретатором.

Очень гибкие или расширяемые форматы файлов имеют больше возможностей для полиглоттинга, и поэтому более жестко ограниченная интерпретация предлагает некоторое смягчение против атак с использованием полиглоттинговых методов. Например, формат файла PDF требует, чтобы магическое число %PDF появлялось в байтовом смещении ноль, но многие интерпретаторы PDF отказываются от этого ограничения и принимают файл как действительный PDF, пока строка появляется в пределах первых 1024 байт. Это создает окно возможностей для полиглоттинговых файлов PDF для контрабанды не-PDF-контента в заголовке файла. [3] Формат PDF был описан как «разнообразный и неопределенный», и из-за значительно различающегося поведения между различными механизмами синтаксического анализа PDF можно создать полиглотт PDF-PDF, который отображается как два совершенно разных документа в двух разных программах для чтения PDF. [13]

Обнаружение вредоносного ПО, скрытого в файлах-полиглотах, требует более сложного анализа, чем использование утилит идентификации типа файла, таких как file . В 2019 году оценка коммерческого программного обеспечения для защиты от вредоносных программ показала, что несколько таких пакетов не смогли обнаружить ни одно из тестируемых вредоносных программ-полиглотов. [3] [2]

В 2019 году было обнаружено, что формат файла медицинской визуализации DICOM уязвим для внедрения вредоносного ПО с использованием полиглотной техники PE -DICOM. [14] Полиглотная природа атаки в сочетании с нормативными соображениями привела к осложнениям при дезинфекции: поскольку «вредоносное ПО по сути объединено с легитимными файлами изображений», «группы реагирования на инциденты и аудио- и видеопрограммы не могут удалить файл вредоносного ПО, поскольку он содержит защищенную информацию о состоянии здоровья пациента». [15]

GIFAR-атака

Архивы формата обмена графикой Java ( GIFAR ) — это многоязычный файл, который одновременно находится в форматах GIF и JAR . [16] Этот метод может использоваться для эксплуатации уязвимостей безопасности, например, путем загрузки GIFAR на веб-сайт, который позволяет загружать изображения (поскольку это допустимый файл GIF), а затем путем выполнения части GIFAR Java, как если бы она была частью предполагаемого кода веб-сайта, доставляемого в браузер из того же источника . [17] Java была исправлена ​​в JRE 6 Update 11, с CVE, опубликованным в декабре 2008 года. [18] [19]

GIFAR-файлы возможны, поскольку GIF-изображения хранят свои заголовки в начале файла, а файлы JAR (как и любой формат на основе ZIP-архива) хранят свои данные в конце. [20]

Сопутствующая терминология

Смотрите также

Ссылки

  1. ^ abc Jonas Magazinius; Billy K. Rios; Andrei Sabelfeld (4 ноября 2013 г.). "Polyglots". Труды конференции ACM SIGSAC 2013 г. по компьютерной и коммуникационной безопасности - CCS '13 . стр. 753–764. doi :10.1145/2508859.2516685. ISBN 9781450324779. S2CID  16516484. Архивировано из оригинала 5 сентября 2022 г. . Получено 5 сентября 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). «За пределами шумихи: оценка коммерчески доступных детекторов вредоносных программ на основе машинного обучения». Цифровые угрозы: исследования и практика . 4 (2): 1–22. arXiv : 2012.09214 . doi :10.1145/3567432. S2CID  247218744.
  3. ^ abcde Кох, Люк; Ош, Шон; Адкиссон, Мэри; Эрвин, Сэм; Вебер, Брайан; Чаулагайн, Амул (2022). «К обнаружению файлов-полиглотов». arXiv : 2203.07561 [cs.CR].
  4. ^ "Преимущества полиглота XHTML5". Архивировано из оригинала 12 октября 2011 г. Получено 4 сентября 2022 г.
  5. ^ "Полиглот: программа на восьми языках". Архивировано из оригинала 6 сентября 2022 года . Получено 6 сентября 2022 года .
  6. ^ "15th International Obfuscated C Code Contest (2000)". Архивировано из оригинала 6 сентября 2022 г. Получено 6 сентября 2022 г.
  7. ^ Кох, Люк; Ош, Шон; Чаулагайн, Амул; Диксон, Джаред; Диксон, Мэтью; Хютталь, Майк; Садовник, Амир; Уотсон, Кори; Вебер, Брайан; Хартман, Джейкоб; Патульски, Ричард (2024). «О злоупотреблении и обнаружении файлов полиглотов». arXiv : 2407.01529 [cs.CR].
  8. ^ "Преимущества полиглота XHTML5". Архивировано из оригинала 12 октября 2011 г. Получено 4 сентября 2022 г.
  9. ^ abc "Polyglot Markup: A robust profile of the HTML5 vocabulary". Архивировано из оригинала 9 августа 2022 г. Получено 4 сентября 2022 г.
  10. ^ Разметка полиглота: HTML-совместимые документы XHTML: 6.4 Элементы Void Архивировано 2 октября 2012 г. на Wayback Machine . Черновик редактора W3C 9 июля 2012 г.
  11. ^ "DICOM-TIFF файлы двойной личности". Архивировано из оригинала 5 сентября 2022 г. Получено 5 сентября 2022 г.
  12. ^ Schofield, Ed. "Cheat Sheet: Writing Python 2-3 compatible code". Архивировано из оригинала 6 сентября 2022 г. Получено 6 сентября 2022 г.
  13. ^ Вольф, Джулия (9 февраля 2011 г.). "OMG WTF PDF". 27th Chaos Communication Congress . Архивировано из оригинала 9 октября 2022 г. Получено 6 сентября 2022 г.
  14. ^ Desjardins, Benoit; Mirsky, Yisroel; Ortiz, Markel Picado; Glozman, Zeev; Tarbox, Lawrence; Horn, Robert; Horii, Steven C. (апрель 2020 г.). «DICOM Images Have Been Hacked! Now What?». American Journal of Roentgenology . 214 (4): 727–735. doi :10.2214/AJR.19.21958. PMID  31770023. S2CID  208318324. Архивировано из оригинала 5 сентября 2022 г. . Получено 5 сентября 2022 г. .
  15. ^ «Повсеместная ошибка позволяет вредоносному ПО, защищенному HIPAA, скрываться за медицинскими изображениями». 17 апреля 2019 г. Архивировано из оригинала 5 сентября 2022 г. Получено 5 сентября 2022 г.
  16. ^ Берд, Кристофер. «Как создать GIFAR». Архивировано из оригинала 6 марта 2023 г. Получено 6 марта 2023 г.
  17. ^ Eckel, Benjamin (5 августа 2008 г.). «Уязвимость изображений GIFAR». Hackaday . Архивировано из оригинала 6 марта 2023 г. Получено 6 марта 2023 г.
  18. ^ "CVE-2008-5343". cve.mitre.org . 4 декабря 2008 г. Архивировано из оригинала 20 апреля 2021 г. Получено 20 апреля 2021 г.
  19. ^ Макмиллан, Роберт (1 августа 2008 г.). «Фотография, которая может украсть ваши учетные данные в сети». Infoworld.com. Архивировано из оригинала 18 сентября 2020 г.
  20. ^ Риос, Билли (17 декабря 2008 г.). «Билли (БК) Риос » SUN исправляет GIFAR». Архивировано из оригинала 14 марта 2016 г. Получено 20 апреля 2021 г.
  21. ^ Fjeldberg, Hans (2008). Polyglot Programming - A Business Perspective (PDF) (M.Sc). Норвежский университет науки и технологий. Архивировано (PDF) из оригинала 4 марта 2016 года . Получено 28 мая 2015 года .
  22. ^ Гупта, Трипта (19 декабря 2018 г.). «Анализ полиглотных микросервисов». Medium . Архивировано из оригинала 5 августа 2019 г. . Получено 5 августа 2019 г. .

Внешние ссылки