Poliglota (informatyka)

W informatyce poliglota to program komputerowy lub skrypt napisany w prawidłowej formie wielu języków programowania lub formatów plików . Nazwa została ukuta przez analogię do wielojęzyczności . Plik poliglotyczny składa się z połączenia składni z dwóch lub więcej różnych formatów. Gdy formaty plików mają być kompilowane lub interpretowane jako kod źródłowy , można powiedzieć, że plik jest programem poliglotycznym , chociaż formaty plików i składnia kodu źródłowego są zasadniczo strumieniami bajtów, a wykorzystanie tej podobieństwa jest kluczem do rozwoju poliglotów. Pliki Polyglot mają praktyczne zastosowania w zakresie kompatybilności , ale mogą również stanowić zagrożenie dla bezpieczeństwa , gdy są używane do obejścia sprawdzania poprawności lub wykorzystania luki w zabezpieczeniach .

Historia

Programy Polyglot były tworzone jako wyzwania i ciekawostki w kulturze hakerskiej co najmniej od wczesnych lat 90-tych. Godny uwagi wczesny przykład, nazwany po prostu polyglot , został opublikowany w grupie Usenet rec.puzzles w 1991 roku, obsługujący 8 języków, chociaż był inspirowany jeszcze wcześniejszymi programami. W 2000 roku program poliglotyczny został zwycięzcą Międzynarodowego Konkursu Obfuscated C Code Contest .

W XXI wieku programy i pliki poliglockie zyskały zainteresowanie jako mechanizm ukrytego kanału rozprzestrzeniania szkodliwego oprogramowania .

Budowa

Poliglota składa się z połączenia składni z dwóch lub więcej różnych formatów, wykorzystując różne konstrukcje składniowe, które są albo wspólne dla formatów, albo konstrukcje, które są specyficzne dla języka, ale mają różne znaczenie w każdym języku. Plik jest poprawnym poliglotą, jeśli może być pomyślnie zinterpretowany przez wiele programów interpretujących. Na przykład poliglota PDF-Zip może zostać otwarta zarówno jako prawidłowy dokument PDF, jak i zdekompresowana jako prawidłowy plik ZIP archiwum. Aby zachować ważność w różnych programach tłumaczących, należy upewnić się, że konstrukcje specyficzne dla jednego tłumacza nie są interpretowane przez innego i odwrotnie. Osiąga się to często poprzez ukrywanie konstrukcji specyficznych dla języka w segmentach interpretowanych jako komentarze lub zwykły tekst w innym formacie.

Przykłady

C, PHP i Bash

Dwie powszechnie stosowane techniki konstruowania programów poliglotycznych to korzystanie z języków, które używają różnych znaków do komentarzy , oraz przedefiniowanie różnych tokenów jako innych w różnych językach. Zostało to zademonstrowane w tym poliglocie należącym do domeny publicznej , napisanym w ANSI C , PHP i bash :

# zdefiniuj /* # /dev/null > /dev/null \ ; // 2> /dev/null; x=a; $x=5; // 2> /dev/null \ ; if (($x)) // 2> /dev/null; następnie zwróć 0; // 2> /dev/null; fi #define e ?> #define b */ #include #define main() int main(void) #define printf printf( #define true ) #define function function main() { printf "Witaj, świecie!\n"true/* 2> /dev/null | grep -v prawda*/; zwróć 0; } #define c /* main #*/

Uwaga:

  • Znak hash oznacza instrukcję preprocesora w C, ale jest komentarzem zarówno w bash, jak i PHP.
  • „//” to komentarz zarówno w PHP, jak i C oraz w katalogu głównym w bash.
  • Przekierowanie powłoki służy do eliminacji niepożądanych danych wyjściowych.
  • Nawet w liniach z komentarzem, wskaźniki PHP " <?php " i " ?> " nadal działają.
  • Instrukcja „ funkcja main() ” jest poprawna zarówno w PHP, jak i bash; C #defines służy do konwersji go na „ int main(void) ”w czasie kompilacji.
  • Wskaźniki komentarza można łączyć w celu wykonywania różnych operacji.
  • if (($x)) ” jest poprawną instrukcją zarówno w bash, jak i PHP.
  • printf to wbudowana powłoka bash , która jest identyczna z printf C , z wyjątkiem pominięcia nawiasów (które dodaje preprocesor C , jeśli jest to kompilowane za pomocą kompilatora C ).
  • Ostatnie trzy wiersze są używane tylko przez bash do wywołania funkcji main . W PHP główna funkcja jest zdefiniowana, ale nie jest wywoływana, aw C nie ma potrzeby jawnego wywoływania głównej funkcji.

SNOBOL4, Win32Forth, PureBasicv4.x i REBOL

Poniższe jest napisane jednocześnie w SNOBOL 4, Win32Forth , PureBasicv 4.x i REBOL :







    
      
    *BUFOR: AA; .(Witaj, świecie!) @ Aby włączyć?   Pomiń to makro; WYJŚCIE = Char(10) "Witaj, świecie!"   ;OneKeyInput Input('Char', 1, '[-f2-q1]') ; koniec  zwęglenia   ; SNOBOL4 + PureBASIC + Win32Forth + REBOL = <3   EndMacro: OpenConsole() : PrintN("Witaj, świecie!")  Powtórz: Aż do Inkey(): Makro SomeDummyMacroHere  REBOL [  Tytuł:  "Witaj, świecie!" w 4 językach"   CopyLeft:  "Opracowany w 2010 roku przez Towarzystwo"  ]  Drukuj  "Witaj, świecie!"  Koniec makro:       
      
      
  func  [][]  set-modes  system  /ports/input  [  binary:  true  ]  Wejście  set-modes  system  /ports/input  [  binary:  false  ]  NOP::  EndMacro  ; Chcesz udoskonalić go nowym językiem?  Kontynuować !  

Plik wsadowy DOS i Perl

Poniższy plik działa jako plik wsadowy DOS , a następnie ponownie uruchamia się w Perlu :

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

Pozwala to na tworzenie skryptów Perla, które można uruchamiać w systemach DOS przy minimalnym wysiłku. Należy zauważyć, że nie ma wymogu, aby plik wykonywał dokładnie tę samą funkcję w różnych interpreterach.

typy

Typy poliglotów obejmują:

  • stosy , w których wiele plików jest ze sobą połączonych
  • pasożyty , w których dodatkowy format pliku jest ukryty w polach komentarza w podstawowym formacie pliku
  • zamki błyskawiczne , w których dwa pliki są wzajemnie ułożone w ramach swoich komentarzy
  • wnęki , gdzie drugorzędny format pliku jest ukryty w pustych obszarach pliku podstawowego.

Korzyści

Znacznik poligloty

Znaczniki Polyglot zostały zaproponowane jako użyteczna kombinacja zalet HTML5 i XHTML . Takie dokumenty mogą być analizowane jako HTML (który jest zgodny z SGML ) lub XML i tak czy inaczej dadzą taką samą strukturę DOM . Na przykład, aby dokument HTML5 spełniał te kryteria, musi mieć typ dokumentu HTML5 i być napisany w dobrze sformułowanym języku XHTML. Ten sam dokument może być następnie wyświetlany jako HTML lub XHTML, w zależności od obsługi przeglądarki i typu MIME.

Zgodnie z zaleceniem html-polyglot , aby napisać poliglotyczny dokument HTML5, należy przestrzegać następujących kluczowych punktów:

  1. Instrukcje przetwarzania i deklaracja XML są zabronione w znacznikach polyglot
  2. Określanie kodowania znaków dokumentu
  3. DOCTYPE
  4. Przestrzenie nazw
  5. Składnia elementu (np. znaczniki końcowe nie są opcjonalne. Użyj znaczników samozamykających się w przypadku pustych elementów).
  6. Zawartość elementu
  7. Tekst (tj. pre i textarea nie powinny zaczynać się od znaku nowej linii)
  8. Atrybuty (tj. wartości muszą być podane w cudzysłowach)
  9. Odwołania do nazwanych jednostek (tj. Tylko amp, lt, gt, apos, quot)
  10. Komentarze (np. Użyj )
  11. Skrypty i stylizacja znaczników poliglotów

Najbardziej podstawowy możliwy dokument znaczników poliglotów wyglądałby zatem tak:


   
  
    
  
  
  
 <!DOCTYPE html>  <  html  xmlns  =  "http://www.w3.org/1999/xhtml"  lang  =  ""  xml:lang  =  ""  >  <  head  >  <  title  >  Element tytułu nie może być pusty.  </  tytuł  >  </  głowa  >  <  treść  >  </  treść  >  </  html  > 

W poliglotowym dokumencie znaczników niepuste elementy (takie jak script , p , div ) nie mogą być samozamykające się, nawet jeśli są puste, ponieważ nie jest to poprawny HTML. Na przykład, aby dodać pusty obszar tekstowy do strony, nie można użyć <textarea/> , ale zamiast tego należy użyć <textarea></textarea> .

Formaty komponowania

Format obrazowania medycznego DICOM został zaprojektowany, aby umożliwić poliglotowanie plików TIFF , umożliwiając efektywne przechowywanie tych samych danych obrazu w pliku, który może być interpretowany przez przeglądarki DICOM lub TIFF.

Zgodność

Języki programowania Python 2 i Python 3 nie zostały zaprojektowane tak, aby były ze sobą kompatybilne, ale istnieje wystarczająca powszechność składni, aby można było napisać poliglotyczny program w Pythonie, który działa w obu wersjach.

Implikacje bezpieczeństwa

Poliglota dwóch formatów może steganograficznie skomponować szkodliwy ładunek w pozornie nieszkodliwym i powszechnie akceptowanym formacie opakowania, takim jak plik JPEG, który dopuszcza dowolne dane w polu komentarza. Podatny na ataki program renderujący JPEG może zostać następnie zmuszony do wykonania ładunku, przekazując kontrolę atakującemu. Podstawową przyczyną luki jest niezgodność między oczekiwaniami programu interpretującego a zawartością pliku.

SQL Injection to trywialna forma poligloty, w której serwer naiwnie oczekuje, że dane wejściowe kontrolowane przez użytkownika będą zgodne z pewnymi ograniczeniami, ale użytkownik dostarcza składnię, która jest interpretowana jako kod SQL.

Należy zauważyć, że w kontekście bezpieczeństwa nie ma wymogu, aby plik poliglotyczny był ściśle poprawny w wielu formatach; wystarczy, aby plik wywołał niezamierzone zachowanie podczas interpretacji przez jego głównego tłumacza.

Wysoce elastyczne lub rozszerzalne formaty plików mają większe możliwości poliglotowania, a zatem bardziej ograniczona interpretacja zapewnia pewne ograniczenie ataków przy użyciu technik poliglot. Na przykład format pliku PDF wymaga, aby magiczna liczba %PDF pojawia się przy zerowym przesunięciu bajtów, ale wiele interpreterów PDF rezygnuje z tego ograniczenia i akceptuje plik jako prawidłowy PDF, o ile ciąg pojawia się w pierwszych 1024 bajtach. Stwarza to okno możliwości dla wielojęzycznych plików PDF do przemycania treści innych niż PDF w nagłówku pliku. Format PDF został opisany jako „różnorodny i niejasny”, a ze względu na znacznie różniące się zachowanie różnych silników analizujących PDF możliwe jest stworzenie poligloty PDF-PDF, który renderuje jako dwa całkowicie różne dokumenty w dwóch różnych czytnikach PDF.

Wykrywanie złośliwego oprogramowania ukrytego w plikach polyglot wymaga bardziej zaawansowanej analizy niż poleganie na narzędziach do identyfikacji typów plików, takich jak file . W 2019 roku ocena komercyjnego oprogramowania chroniącego przed złośliwym oprogramowaniem wykazała, że ​​kilka takich pakietów nie było w stanie wykryć żadnego z testowanych poliglotów.

W 2019 roku stwierdzono, że format pliku obrazowania medycznego DICOM jest podatny na wstrzykiwanie złośliwego oprogramowania przy użyciu techniki poliglot PE -DICOM. Poliglotyczny charakter ataku w połączeniu z kwestiami prawnymi doprowadził do komplikacji związanych z leczeniem: ponieważ „złośliwe oprogramowanie jest zasadniczo połączone z legalnymi plikami obrazów”, „zespoły reagowania na incydenty i oprogramowanie A/V nie mogą usunąć pliku złośliwego oprogramowania, ponieważ zawiera on chronione zdrowie pacjenta Informacja".

Atak GIFAR

Archiwa Java w formacie wymiany grafiki ( GIAR ) to wielojęzyczny plik, który jest jednocześnie w formacie GIF i JAR . Ta technika może być wykorzystana do wykorzystania luk w zabezpieczeniach, na przykład poprzez przesłanie pliku GIFAR na stronę internetową, która umożliwia przesyłanie obrazu (ponieważ jest to prawidłowy plik GIF), a następnie spowodowanie wykonania części GIFAR w języku Java, tak jakby była częścią zamierzonego kodu witryny, który jest dostarczany do przeglądarki z tego samego źródła . Java została poprawiona w JRE 6 Update 11, a CVE opublikowano w grudniu 2008 roku.

Pliki GIFAR są możliwe, ponieważ obrazy GIF przechowują swój nagłówek na początku pliku, a pliki JAR (jak w przypadku każdego formatu opartego na archiwum ZIP) przechowują swoje dane na końcu.

Powiązana terminologia

  • Programowanie poliglotowe , odnoszące się do praktyki budowania systemów przy użyciu wielu języków programowania, ale niekoniecznie w tym samym pliku.
  • Trwałość poligloty jest podobna, ale dotyczy baz danych .

Zobacz też

Linki zewnętrzne