Edytor Vim i jego fork NeoVim to bardzo popularne edytory tekstu wykorzystywane od wielu, wielu lat przez programistów na całym świecie. Niestety, w ostatnim czasie odnaleziono w nich niebezpieczną podatność, która może prowadzić do opuszczenia piaskownicy i wykonanie dowolnego kodu.
Podatne są wersje zarówno na Linuksa, gdzie została wydana już łatka, jak i na macOS-a. Wersja na komputery Apple wciąż jest podatna, niemniej aby atak był możliwy, konieczna jest na macOS-ie zmiana domyślnych ustawień. Chodzi o włączenie domyślnie wyłączonej funkcji modelines. Sytuacja jest tym groźniejsza, że w wielu dystrybucjach Linuksa znajdziemy preinstalowany pakiet Vima już z domyślnie włączoną obsługą modelines.
Modelines pozwalają na ustawianie parametrów edytora przez plik. Wystarczy w pierwszej lub w ostatnich pięciu linijkach wprowadzić wartości dla określonych zmiennych, by zdecydować np. o tym, ile znaków w danym pliku powinno się zmieścić przed zawinięciem do kolejnej linijki czy jakie wymiary dla danego pliku powinno mieć okno. Przykład: /* vim: tw=60 ts=2: */
sprawi, że dany plik po otwarciu w Vimie czy NeoVimie będzie dopuszczał maksymalnie 60 znaków w linijce.
Zobacz też: Exim dziurawy – ponad połowa wszystkich serwerów poczty w niebezpieczeństwie
Jak nietrudno się domyślić, do ataku z wykorzystaniem podatności modelines wystarczy uruchomienie w edytorze odpowiednio spreparowanego pliku tekstowego. Co prawda Vim obsługuje tylko kilka ustawień modelines, zaś wartości zawierające wyrażenia wykonywane są w izolowanej piaskownicy. Jak jednak dowiódł użytkownik GitHuba przedstawiający się jako Arminius, wystarczy umieścić w modelines polecenie :source!
, by opuścić piaskownicę.
Edytory co prawda blokują polecenie execute
, ale i to zabezpieczenie udało się obejść. W rezultacie luka pozwala wykonanie kodu zupełnie tak, jakby polecenie zostało wprowadzone z poziomu konsoli. Użytkownikom Vima i NeoVima zaleca się jak najszybszą aktualizację, a ponadto wyłączenie obsługi modelines poprzez dodanie do pliku konfguracyjnego vima (.vimrc) linijek set modelines=0
oraz set nomodeline
. Vim bezpieczny jest od wersji 8.1.1365, Neovim od v0.3.6.
Zobacz też: Thrangrycat: groźna sprzętowa podatność w milionach routerów Cisco