Emacsem przez sendmaila czyli Vim z dziurą
Jakkolwiek tytułowy slogan „Emacsem przez sendmaila” by nie brzmiał głupkowato i filmowo, to rzeczywistość lubi płatać nieoczekiwane figle. Choćby taka przypadłość jak
CVE-2019-12735 – dzięki niej możliwym jest przekonanie edytora Vim (lub Neovim) do wykonania spreparowanej przez nas komendy.
Brzmi to dość niewinnie. Vim jako taki i ze swoim zestawem możliwości w nieodpowiednich rękach może stać się tak czy siak groźną bronią. Jednak CVE-2019-12735 szczegółowo opisuje przypadek wykonywania przez Vim poleceń zaszytych w plikach tekstowych. Wystarczy tylko otworzyć je do edycji, by uruchomiły się podrzucone w środku komendy. Aby do tego doszło, muszą być spełnione pewne warunki. Otóż, Vim musi działać w trybie modeline (:set modeline lub set modeline w vimrc) oraz być w wersji starszej od 8.1.1365 (Neovim do wersji 0.3.6). Brzmi jak nie do wiary? A jednak.
Wykorzystywany jest fakt, że w trybie modeline Vim wykonuje zaszyte w pliku komendy dla edytora. Jest to typowe zachowanie i zwykle wykorzystywane w sposób:
/* vim: set textwidth=80 tabstop=8: */
W ten sposób otwierając konkretny plik możemy z marszu ustawić edytor do wygodne trybu pracy z rzeczonym plikiem. Oczywiście w tym trybie Vim respektuje jedynie kilka poleceń (ustawień) i jest to uruchamiane w piaskownicy. Niemniej, Vim to potężne narzędzie. Posiada też polecenie umożliwiające wczytanie pliku z poleceniami i wykonanie ich tak, jakbyśmy wpisywali je bezpośrednio w linii komend edytora.
:source! plik-z-komendami
W tym trybie nie ma żadnych ograniczeń – wszak sami otwieramy i wykonujemy to co chcemy, prawda? Bez żadnej piaskownicy. I teraz, CVE-2019-12735 łączy wiedzę na temat trybu modeline a komendy :source!. Po prostu wystarczy skonstruować i zaszyć w pliku takie ustawienia, które Vim w momencie otwierania pliku potraktuje jako swoje parametry, a które w pewnym momencie wyślizną się z piaskownicy za pomocą :source!.
Przykłady? Proszę bardzo. Proszę stworzyć plik poc.txt i wrzucić doń:
:!uname -a||" vi:fen:fdm=expr:fde=assert_fails("source\!\ \%"):fdl=0:fdt="
Vim musi mieć ustawiony tryb modeline (np. w vimrc). I otwieramy plik:
vim poc.txt
Powyższe uruchamia polecenie uname -a, które nie jest przewidziane w zestawie poleceń modeline. Łatwo przewidzieć, że skoro możemy uruchomić uname, to odpalimy także i np. polecenie nc, które to juz może zostać wykorzystane do typowego reverse shella.
Powyższe zostało już załatane i naprawione (od wersji 8.1.1365), a np. w Debianie Vim domyślnie ma wyłączony tryb modeline. Pomimo tego atak za pomocą zwykłego pliku tekstowego działa na wyobraźnię, nieprawdaż?