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 PHPgłówna
funkcja jest zdefiniowana, ale nie jest wywoływana, aw C nie ma potrzeby jawnego wywoływaniagłó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:
- Instrukcje przetwarzania i deklaracja XML są zabronione w znacznikach polyglot
- Określanie kodowania znaków dokumentu
- DOCTYPE
- Przestrzenie nazw
- Składnia elementu (np. znaczniki końcowe nie są opcjonalne. Użyj znaczników samozamykających się w przypadku pustych elementów).
- Zawartość elementu
- Tekst (tj. pre i textarea nie powinny zaczynać się od znaku nowej linii)
- Atrybuty (tj. wartości muszą być podane w cudzysłowach)
- Odwołania do nazwanych jednostek (tj. Tylko amp, lt, gt, apos, quot)
- Komentarze (np. Użyj )
- 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
- CSE HTML Validator dla Windows z obsługą znaczników polyglot
- Korzyści z poligloty XHTML5
- Poliglota w 387 różnych językach
- Poliglota w 16 różnych językach
- Poliglota w 8 różnych językach (napisany w COBOL , Pascal , Fortran , C , PostScript , Unix shell , język maszynowy Intel x86 i Perl 5)
- Poliglota w 7 różnych językach (napisany w C , Pascal , PostScript , TeX , Bash , Perl i Befunge98 )
- Poliglota w 6 różnych językach (napisany w Perl , C , Unix shell , Brainfuck , Whitespace i Befunge )
- Lista ogólnych poliglotów
- Poliglota PDF-MP3, będący dokumentem PDF będącym jednocześnie wersją audio MP3 swojej zawartości
- PoC||GTFO, publikacja dotycząca bezpieczeństwa publikowana jako wielojęzyczne dokumenty PDF