Jak bezpieczne jest przechowywanie dowolnych plików?


77

Czasami, gdy catprzez pomyłkę jestem plikiem binarnym, mój terminal jest zniekształcony. Nic szybkiego resetnie może naprawić, ale czy osoba atakująca nie mogłaby teoretycznie stworzyć pliku, który po wyświetleniu na terminalu wykonałby dowolny kod? Poprzez exploit w emulatorze terminali lub w inny sposób.


3
Czasami, kiedy to robię, moja powłoka powie na końcu „<garbage> nieznane polecenie”. Zastanawiam się, czy to rzeczywiście możliwe.
Keith,

5
Były emulatory dla emulatora terminali, np. Linuxsecurity.com/content/view/104657 lub securityfocus.com/bid/6936/discuss, więc nie jest to konieczne szczególnie bezpieczne
Ulrich Dangel

1
Dlatego lepiej jest użyć czegoś, co będzie przeszkadzać w plikach binarnych (jak more) lub jest świadome terminalu ( less) w celu zbadania zawartości plików. Nie tylko nie spowoduje to, że twój terminal będzie w dziwnym stanie, cały plik nie przejdzie w jednym ujęciu.
Blrfl

stty saneKomenda resetuje xterm (lub podobne), które zostało włączone do np innego zestawu znaków.
Thorbjørn Ravn Andersen

moshdokumentacja zawiera pewne przemyślenia na ten temat: mosh.mit.edu/#techinfo
Max Ried

Odpowiedzi:


34

To, czy takie wyjście może zostać wykorzystane, zależy od programu terminala i tego, co robi ten terminal, w zależności od wysyłanych kodów specjalnych. Nie wiem, czy programy terminalowe mają takie możliwe do wykorzystania funkcje, a jedynym problemem będzie teraz, jeśli wystąpi nieznane przepełnienie bufora lub coś takiego, które można wykorzystać.

W przypadku niektórych starszych hardwareterminali może to stanowić problem, gdy programujesz np. Klawisze funkcyjne z tego rodzaju sekwencjami ucieczki, przechowując sekwencję poleceń dla tego klawisza w sprzęcie. Nadal potrzebujesz fizycznego naciśnięcia klawisza, aby to aktywować.

Ale zawsze są (jak Hauke ​​tak słusznie oznaczony „braindead”) ludzie gotowi dodać taką cechę, jeśli rozwiązuje to dla nich problem, nie rozumiejąc, jaką tworzą lukę. Z mojego doświadczenia z oprogramowaniem open source wynika, że ​​z powodu wielu oczu spoglądających na kod, jest to mniej prawdopodobne, niż w przypadku zamkniętego źródła. (Pamiętam, że w programie pocztowym na Irixie Silicon Grahpics w połowie lat dziewięćdziesiątych można było dołączyć polecenia do wykonania na maszynie odbiorników, prawdziwe ścieżki do plików wykonywalnych, ...)


3
„możesz dołączyć polecenia do wykonania na maszynie odbiorników” Masz na myśli coś takiego jak zawarcie e-maila VBScript, który woła do hosta skryptów Windows? :)
CVn

Nie, dokładnie, możesz uruchomić plik wykonywalny, który był już na komputerze, jak odtwarzanie dźwięku. Nie pamiętam dokładnej składni (to było prawie 20 lat temu) ani tego, czy można wyłączyć tę „funkcję” w konfiguracji. Świetnie się bawiliśmy z automatycznie odtwarzanymi filmami zapisanymi w naszej sieci.
Anthon

Nie mówisz o NeWS, prawda? IIRC SGI była jedną z ostatnich potyczek.
luser droog

@luserdroog Nie, to był standardowy program pocztowy oparty na graficznym interfejsie użytkownika w systemie Irix
Anthon

1
@Anthon Nie jestem pewien, czy nadal jest to możliwe, ale możliwość użycia kodów specjalnych, aby terminal mógł „powtarzać” tekst przychodzący do niego z writepolecenia - w ten sposób wykonując polecenia / skrypty jako użytkownik będący właścicielem terminala. To prawdopodobnie powód, dla którego wielu zaleca wyłączenie wiadomości mesg -ndla użytkowników przez większość czasu i na root zawsze . AFAIK, faktycznie tak się stało - chociaż nie wiem, czy kiedykolwiek został wykorzystany. Tak więc losowy tekst z catpliku wykonywalnego Ted może być prawdopodobnie wykonany.
Baard Kopperud

33

Większość emulatorów terminali odeśle odpowiedź, jeśli otrzymają pewne sekwencje specjalne (zobacz dokumentację sekwencji kontrolnych xterm ). Na przykład możesz wysłać \e[0cdo emulatora podobnego do VT100, a on odeśle atrybuty urządzenia, coś w stylu \e[?1;2c (Prawdopodobnie to właśnie zauważył Keith). Ale te odpowiedzi nie są ciągami arbitralnymi. Mimo to posiadanie pliku wykonywalnego o nazwie 2cgdzieś w systemie, który robi coś śmiertelnego, jest złym pomysłem.

Aktualizacja: Ryzyko jest w rzeczywistości większe niż myślałem, ze względu na możliwość ustawienia tytułu okna xterm i odesłania tytułu za pomocą odpowiednich sekwencji specjalnych ( http://www.securityfocus.com/bid/6940/ ) . W przeciwieństwie do powyższego przykładu, tytuł może być prawie dowolnym ciągiem znaków.


To już bardzo blisko.
Gunchars,

Istnieje jeszcze starsza funkcja - „wiadomość zwrotna”, wysyłana w odpowiedzi na znak ENQ (Ce). Na prawdziwym VT100 jest ustawiany przez użytkownika w menu SETUP terminala; być może istnieją emulatory terminali, które pozwalają na zdalne ustawienie ...
sendmoreinfo

16

Zmienia to tytuł terminala w GNOME Terminal 3.6.1, chyba że zostanie zastąpiony przez coś takiego jak PS1 :

printf "\033]2;Script Kiddie was here\007"

Teraz otwórz nowe okno Terminal GNOME, aby przetestować catwersję:

printf "\033]2;Script Kiddie was here\007" > test.bin
cat test.bin

Tak, to także ustawia tytuł terminala.

Kiedyś występował problem z bezpieczeństwem związany z kodem ucieczki, w wyniku którego tytuł był drukowany w wierszu polecenia , więc można było skutecznie utworzyć plik, który po catedycji wydrukowałby (nie jestem pewien, czy można tam wstawić nowy wiersz) dowolne polecenia. Ojej!


8

Chociaż użycie catmoże nie spowodować wykonania kodu, kody ucieczki zostaną przetworzone, dzięki czemu można łatwo wprowadzić w błąd, że skrypt jest nieszkodliwy, gdy w rzeczywistości jest złośliwy.

Oto przykładowe polecenie, które możesz uruchomić, aby utworzyć „złośliwy” skrypt powłoki:

echo -e '#!/bin/sh\necho "...doing something bad here..."\nexit\n\033[A\033[Aecho "Hello dear reader, I am just a harmless script, safe to run me!"' > demo.sh
chmod a+x demo.sh

Podczas przeglądania pliku wydaje się on wystarczająco nieszkodliwy:

$ cat demo.sh
#!/bin/sh
echo "Hello dear reader, I am just a harmless script, safe to run me!"

Ale czy powinieneś to uruchomić ...

$ ./demo.sh 
...doing something bad here...

Skrypt działa, włączając surowe kody ucieczki, aby przesunąć kursor w górę o kilka wierszy, więc reszta skryptu jest zapisywana nad złośliwym kodem, ukrywając go.

Prawie jakikolwiek inny program ujawni skrypt taki, jaki jest. Tylko programy, które nie przetwarzają zawartość pliku (jak cat, morei less -r) będzie produkować wyjście mylące.

Zauważ, że taili headrównież produkują ten sam mylący wynik. Użycie „mniej + F” jest zatem bezpieczniejsze niż „tail -f”.


Jest to dość problematyczne ... Można zobaczyć, co się rzeczywiście dzieje, uruchamiając echo $(cat demo.sh), cat demo.sh | grep . --color=yes(Uwaga: --color=yesto, co pokazano „złośliwy” kod tutaj) lub wbudowany cat -v demo.sh.
Charlie,

Prawda czy fałsz, to jest odpowiedź na inne pytanie: jak wiarygodne jest catw Wyświetlanie pliku w treści .
Incnis Mrsi,

@IncnisMrsi: To naprawdę nie jest odpowiedź na inne pytanie. Ta odpowiedź ostrzega, że ​​kot pokaże kody ucieczki, i stanowi prosty przykład z tylko jednym rodzajem kodu ucieczki, ale istnieje wiele innych. W połączeniu z niektórymi terminalami mogą one mapować klucze, zastępować pliki i teoretycznie nawet wykonywać polecenia . Więc kiedy zdasz sobie sprawę z niebezpieczeństwa wyświetlania kodów ucieczki, zrozumiesz, że czasami może być niebezpieczne dla catdowolnego pliku, jak zadawane pytanie!
Malvineous

6

Zdecydowanie doświadczyłem xtermwstawiania w siebie dowolnych znaków, jakbym je wpisał. I czasami to najwyraźniej zawierało znak nowej linii, więc dostałem ngwerm:0riu: command not foundodpowiedź. Nie widzę powodu, dla którego ktoś nie mógłby stworzyć pliku, który wysyłałby określone, szkodliwe polecenia. Tak więc, przynajmniej niektóre terminale są podatne na ataki o dowolnym wpływie.


2

Cóż, emulator terminala po prostu drukuje wysyłane do niego znaki.

Wszystko poza drukowaniem znaku na bieżącej pozycji, np. Ustawianie nowej pozycji, zmiana koloru, zmiana tytułu itp., Odbywa się poprzez sekwencje specjalne.

Zestaw obsługiwanych sekwencji ucieczki zwykle składa się z dobrze zdefiniowanych standardów, takich jak ANSI , które nie określają sposobu uruchamiania innych procesów. Chociaż byłoby możliwe zaimplementowanie takiej sekwencji, nie jestem świadomy żadnego emulatora terminalowego celowo pozwalającego na takie rzeczy.

Teoretycznie błąd taki jak przepełnienie bufora może zostać wykorzystany do uruchomienia dowolnej funkcji. Ale byłoby to możliwe w prawie każdym innym pliku binarnym.


0

Zasadniczo zazwyczaj nie ma ryzyka, że ​​zostanie przechwycony dowolny plik. Moją zwykłą metodą analizy pliku jest wykonanie następujących czynności:

$ file <mystery file>
$ strings <mystery file> | less

Powyższe pozwala mi określić typ pliku za pomocą filepolecenia, a stringspolecenie pozwala mi zrzucić wszelkie możliwe do zidentyfikowania ciągi znaków z potencjalnych plików binarnych, których nie jestem pewien co do ich pochodzenia.

przykład

wyjście pliku
$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped
ciągi wyjściowe
$ strings /bin/ls|less
...
across
vertical
single-column
force
never
auto
if-tty
slash
%b %e  %Y
%b %e %H:%M
long-iso
main
posix-
sort_files
?pcdb-lswd
dev_ino_pop
Try `%s --help' for more information.
Usage: %s [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort.
Mandatory arguments to long options are mandatory for short options too.
  -a, --all                  do not ignore entries starting with .
  -A, --almost-all           do not list implied . and ..
...

3
uruchamianie ciągów w nieznanym pliku może mieć również problematyczne konsekwencje. lcamtuf.blogspot.fi/2014/10/…
Jan Wikholm

@IncnisMrsi - przeczytaj pierwsze zdanie !!!!
slm

OK, wycofuję moje poprzednie oświadczenie. Odpowiedź jest krótka, z mylącą terminologią, bezzasadna i ewidentnie niekompletna. Pamiętaj, że pod względem bezpieczeństwa „arbitralny” ≠ losowy, tak jak w twoim ulubionym systemie operacyjnym.
Incnis Mrsi,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.