Czytając szczegóły CVE-2009-4487 (który dotyczy niebezpieczeństwa sekwencji specjalnych w plikach dziennika) jestem nieco zaskoczony.
Cytując CVE-2009-4487 :
nginx 0.7.64 zapisuje dane do pliku dziennika bez odkażania znaków niedrukowalnych, co może pozwolić zdalnym atakującym na modyfikację tytułu okna, ewentualnie wykonanie dowolnych poleceń lub zastąpienie plików, za pośrednictwem żądania HTTP zawierającego sekwencję ucieczki dla emulatora terminala.
Najwyraźniej tak naprawdę nie chodzi o lukę w zabezpieczeniach w nginx, ale w emulatorach terminali.
Jasne, być może przesłanie cat
pliku dziennika do terminala dzieje się tylko przypadkowo, ale grep
plik dziennika jest dość powszechny. less
może dezynfekuje sekwencje specjalne, ale kto wie, które polecenia powłoki nie zmieniają sekwencji specjalnych ...
Zwykle zgadzam się z odpowiedzią lakieru :
Mądrość ucieczek terminala-odpowiedź w ogóle była kwestionowana w regularnych odstępach czasu, ale nadal żaden z głównych programów emulacji terminalu nie uznał za stosowne odrzucić te sekwencje, prawdopodobnie w przypadku błędnej próby zgodności z nieużywaną już technologią z lat 70-tych. [..] Zamiast obwiniać wszystkie programy, które zapisują logi, byłoby znacznie bardziej produktywne, z punktu widzenia bezpieczeństwa, aby programy do emulacji terminali przestały robić głupie rzeczy, a tym samym naprawić to i inne problemy bezpieczeństwa raz i dla wszystkich.
Zatem moje pytania:
Jak mogę zabezpieczyć swój Xterm, aby nie było już możliwe wykonywanie poleceń ani zastępowanie plików za pomocą sekwencji ucieczki?
Jakie emulatory terminali dla X są zabezpieczone przed tym atakiem?
źródło
Odpowiedzi:
Terminale VT100 (które do pewnego stopnia emulują wszystkie współczesne emulatory terminali) obsługiwały wiele problematycznych poleceń, ale nowoczesne emulatory lub dystrybucje wyłączają te bardziej problematyczne i mniej przydatne. Oto niewyczerpująca lista potencjalnie ryzykownych sekwencji ucieczki (z wyłączeniem tych, które po prostu sprawiają, że wyświetlanie jest w jakiś sposób nieczytelne):
ENQ
(Ctrl+E
). Powoduje to wstawienie tekstu do terminala, tak jakby użytkownik go wpisał. Jednak ten tekst nie jest pod kontrolą atakującego: jest to nazwa terminala, zwykle coś w rodzajuxterm
lubscreen
. W moim systemie (ściśnięcie Debiana) xterm domyślnie zwraca pusty ciąg znaków (jest to kontrolowane przezanswerbackString
zasób).ESC [ c
i znajomych. Terminal odpowiadaESC [ … c
(gdzie…
może zawierać tylko cyfry i znaki interpunkcyjne ASCII). Jest to sposób na sprawdzenie niektórych możliwości terminalu, głównie przestarzałych, ale być może używanych przez stare aplikacje. Ponownie, odpowiedź terminalu jest nie do odróżnienia od danych wprowadzonych przez użytkownika, ale nie jest pod kontrolą atakującego. Sekwencja kontrolna może wyglądać jak klawisz funkcyjny, ale tylko wtedy, gdy użytkownik ma nietypową konfigurację (żadne z typowych ustawień, które napotkałem, nie ma prawidłowej sekwencji specjalnej klawisza funkcyjnego, która jest prefiksem odpowiedzi terminala).ESC P
).DECUDK
(ustawiając klucze zdefiniowane przez użytkownika) w typowym emulatorze terminali.DECRQSS
(Request Status String) to kolejne polecenie, na które terminal reaguje sekwencją ucieczki, tym razem zaczynając od\eP
; może to być problematyczne, ponieważ\eP
jest to prawidłowy klucz ( Alt+ Shift+ P).ESC P + p …
orazESC P + q …
, aby uzyskać i ustawić ciągi termcap. Z opisu można tego użyć przynajmniej do modyfikacji działania klawiszy funkcyjnych.ESC [ … n
(Raport o stanie urządzenia). Terminal odpowiada sekwencją ucieczki. Większość tych sekwencji ucieczki nie odpowiada sekwencjom ucieczki klawiszy funkcyjnych. Jeden wydaje się problematyczny: raportESC [ 6 n
ma formę, gdzie i są sekwencjami cyfrowymi, i może to wyglądać jak w przypadku niektórych modyfikatorów.ESC [ x ; y R
x
y
F3ESC [ … t
.ESC [ 2 0 t
i odpowiednioESC [ 2 1 t
zawierają etykietę i tytuł okna terminala, a atakujący może je wybrać.allowWindowOps
zasób lub selektywnie poprzezdisallowedWindowOps
zasób. Gnome-terminal pod Ubuntu 10.04 domyślnie implementuje nawet odpowiedzi zwrotne tytułu. Nie sprawdziłem innych terminali ani wersji.ESC ] digit ; title ESC \
ESC k title ESC \
Uważam, że odpowiedź Varnisha jest nieszczera. Wygląda na to, że albo próbuje zmienić winę, albo działa w trybie nazistowskim (wszelkie obawy dotyczące bezpieczeństwa, autentyczne lub nie, uzasadniają blackballing funkcji).
Wiele odpowiedzi zwrotnych to przydatne funkcje: aplikacja musi wiedzieć takie rzeczy, jak pozycja kursora i rozmiar okna. Bardzo przydatne jest również ustawienie tytułu okna. Byłoby możliwe poleganie wyłącznie na
ioctl
wywołaniach tych, jednak wymagałoby to dodatkowego kodu i narzędzi do wykonania tychioctl
wywołań i przekształcenia ich w tekst w stylu uniksowym, przekazujący deskryptory plików. Zmiana tych interfejsów byłaby teraz bardzo pracochłonna, bez większych korzyści.Pliki tekstowe nie powinny zawierać znaków niedrukowalnych, takich jak znaki kontrolne. Pliki dziennika są zwykle plikami tekstowymi. Pliki dziennika nie powinny zawierać znaków kontrolnych.
Jeśli martwisz się, że plik może zawierać sekwencje, otwórz go w edytorze lub zobaczyć ją
less
bez-r
lub-R
opcji, lub zobaczyć go przezcat -v
.źródło
To nie jest takie proste; wiele osób ma kod, aby ustawić
xterm
tytuł w ramach monitu itp., i to z bardzo dobrych powodów (jak każdy, kto jestshutdown
niewłaściwą maszyną z niewłaściwego okna terminala, może ci powiedzieć!). Prawidłowe naprawienie go wymaga zatem wprowadzenia kontekstów bezpieczeństwa, a tym samym poważnego komplikowania interakcji między powłokami i emulatorami terminali a prawdopodobnie także plikami kropkowymi ludzi. Lub możesz zastosować rozwiązanie z niskim czynszem dezynfekujące wszystko, co może być wyświetlane w terminalu; ogranicza się to w dużej mierze do ucieczkowych znaków kontrolnych, co prawdopodobnie powinno być zrobione, aby się wyróżnić (ponieważ w pliku dziennika mogą wskazywać, że ktoś próbuje wstrzyknąć kod powłoki).( Nawiasem mówiąc , punycode jest poważniejszym przykładem tego samego rodzaju problemu - i mimo to został oficjalnym standardem. Czasami bezpieczeństwo sprowadza się do łagodzenia niepewnych projektów, które są poza kontrolą użytkownika.)
źródło