Ping śmierci! FreeBSD naprawia błąd powodujący awarię w narzędziu sieciowym PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Ping śmierci! FreeBSD naprawia błąd crashtastic w narzędziu sieciowym

Jednym z pierwszych narzędzi sieciowych niskiego poziomu, o którym dowiaduje się każdy użytkownik komputera, jest czcigodny ping użyteczność.

Polecenie, nazwane na cześć efektu dźwiękowego ze wszystkich starych filmów wojennych z udziałem okrętów podwodnych, jest metaforycznym echem (zobacz, co tam zrobiliśmy?) podwodnej wersji RADAR znanej jako SONAR.

Wysyłasz ping (bardziej jak dźwięk doinnnng, w rzeczywistość).

To intrygujące, biorąc pod uwagę, że prawdopodobnie słyszałeś skrót TCP/IP używany jako ogólny opis kleju protokołów, który zasila Internet, ping technicznie w ogóle nie używa protokołu TCP/IP.

W rzeczywistości, TCP/IP jest skrótem od protokół sterowania transmisją przez protokół internetowy, i odnosi się do dość wysokiego poziomu mechanizmu przesyłania danych przez Internet w taki sposób, że sama sieć stawia wiele pytań „czy to faktycznie działało poprawnie?” wysiłek dla ciebie.

Na przykład w połączeniach TCP wszelkie wysyłane fragmenty danych mają gwarancję, że dotrą na drugi koniec w stanie nienaruszonym lub spowodują błąd, dzięki czemu wiesz, że nie dotarły.

Co więcej, nawet jeśli różne fragmenty danych przechodzą przez Internet różnymi trasami (na przykład z powodu równoważenia obciążenia, tymczasowych przestojów lub innych możliwych do naprawienia błędów) i nawet jeśli dotarcie niektórych fragmentów trwa dłużej niż innych, dane TCP będą prawidłowo buforowane podniesione i przedstawione we właściwej kolejności na drugim końcu.

Ping jest inny

Połączenia ping jest jednak zwykle używany do sprawdzenia, czy komputer, który Cię interesuje, jest w ogóle online, zwłaszcza jeśli nie akceptuje oczekiwanego rodzaju połączeń TCP wysokiego poziomu, takich jak odbieranie poczty e-mail lub zezwalanie na logowanie SSH.

Pozwala to szybko ustalić, czy awaria jest prawdopodobnie spowodowana awarią sieci lub samego serwera, czy też nieprawidłowym uruchomieniem poszczególnych usług działających na tym serwerze.

W rezultacie ping używa protokołu znacznie niższego poziomu niż TCP.

W rzeczy samej, ping nie używa nawet bardziej swobodnego kuzyna TCP, UDP, skrót od protokół datagramu użytkownika, który jest sposobem przesyłania porcji danych, który jest szybki i łatwy, ale jest popularnie nazywany „wyślij i miej nadzieję” (lub, jeśli jesteś cyniczny, jako „spryskaj i módl się”).

Sam UDP nie informuje, czy Twoje dane dotarły na drugi koniec, czy nie, a nawet jeśli dotrą w stanie nienaruszonym, UDP nie śledzi kolejności, w jakiej Twoje pakiety zostały pierwotnie wysłane, więc nie może zmienić ich kolejności w drugi koniec, jeśli dotrą tam poza kolejnością.

Ping, jeśli to coś warte, używa protokołu bardzo niskiego poziomu, specjalnie zaprojektowanego do rozwiązywania problemów i rekonfiguracji sieci, znanego jako ICMP, lub protokół komunikatów sterujących Internetem.

Zwykle obsługiwane bezpośrednio w jądrze systemu operacyjnego, więc pakiety ICMP/IP są prawie pewne, że przejdą, nawet jeśli żadne oprogramowanie sieciowe wyższego poziomu nie zostało poprawnie uruchomione, ICMP zawiera w szczególności dwa specjalne typy komunikatów:

  • Wpisz 0x08. Oficjalnie nazywany ICMP EchoTen rodzaj paczki jest zwykle nazywany żądaniem echa. To co ping program wysyła w celu wyszukania aktywnych komputerów w sieci.
  • Wpisz 0x00. Oficjalnie nazywany ICMP Echo Reply, ten typ pakietu to dokładnie to, co mówi. Komputer, który jest aktywny, online i nie jest skonfigurowany do blokowania ruchu ICMP Echo, powinien wysłać tego rodzaju pakiet bezpośrednio z powrotem do komputera, który go zażądał.

Jak to:

$ ping -c 3 -p 4E414B45445345435552495459 nakedsecurity.sophos.com WZÓR: 0x4e414b45445345435552495459 PING news-sophos.go-vip.net (192.0.66.227) 56(84) bajtów danych. 64 bajty z 192.0.66.227 (192.0.66.227): icmp_seq=1 ttl=53 czas=84.0 ms 64 bajty z 192.0.66.227 (192.0.66.227): icmp_seq=2 ttl=53 czas=85.1 ms 64 bajty z 192.0.66.227 192.0.66.227 (3): icmp_seq=53 ttl=84.8 time=3 ms --- news-sophos.go-vip.net statystyki ping --- 3 wysłane pakiety, 0 odebrane, 2004% utraty pakietów, czas 84.025ms rtt min/ średnia/maks./średnia zmiana = 84.644/85.062/0.446/XNUMX ms

Aby zobaczyć ping w akcji na nieco niższym poziomie użyjemy kodu Lua, który można znaleźć na końcu artykułu, aby zbudować własny pakiet ICMP Echo i odczytać odpowiedź, która wróci, jeśli taka istnieje:

$ sudo luax ping.lua nakedsecurity.sophos.com Wysyłanie żądania ICMP ECHO do 192.0.66.227 --> 00000000 08 00 03 02 bb 5a 6f 1d 50 69 6e 67 52 65 71 75 |.....Zo.PingRequ| 00000010 65 73 74 4d 65 73 73 61 67 65 20 42 42 35 41 36 |szacowana wiadomość BB5A6| 00000020 46 31 44 |F1D | Wróciłem--> 00000000 45 00 00 37 f6 af 00 00 35 01 94 7f c0 00 42 e3 |E..7....5.....B.| 00000010 XX XX XX XX 00 00 0b 02 bb 5a 6f 1d 50 69 6e 67 |.........Zo.Ping| 00000020 52 65 71 75 65 73 74 4d 65 73 73 61 67 65 20 42 |ProśbaWiadomość B| 00000030 42 35 41 36 46 31 44 |B5A6F1D |

Nawiasem mówiąc, musieliśmy użyć sudo powyżej, aby uruchomić nasz skrypt z uprawnieniami superużytkownika, ponieważ stworzyliśmy tak zwany plik a surowe gniazdo IP – taki, który można przekształcić w dowolny podstawowy format, jaki nam się podoba, w tym TCP, UDP i, w razie potrzeby, ICMP.

W wielu systemach Linux/Unix plik ping polecenie dostarczone przez twoją dystrybucję działa bez jawnego nadania uprawnień roota, zwykle dlatego, że jest instalowane ze specjalnymi funkcjami bezpieczeństwa lub z jego setuid zestaw flag, co oznacza, że ​​zaczyna się od uruchomienia na innym koncie użytkownika niż użytkownik, który go uruchomił.

Dobrze zaprojektowany ping programy, oczywiście, automatycznie odrzucą swoje dodatkowe uprawnienia, gdy tylko otworzą potrzebne im surowe gniazdo.

Ten kod odrzucający uprawnienia pominęliśmy w naszym przykładowym skrypcie ze względu na zwięzłość. Możesz użyć posix.unistd.setpid() funkcję przełączania na konto nieuprzywilejowane po utworzeniu gniazda, ale przed wysłaniem lub odebraniem jakichkolwiek danych.

Badanie odpowiedzi

Jak możesz zauważyć w zrzucie danych z naszego powyższego skryptu, funkcja gniazda sieciowego, której używamy do odczytywania danych z serwera odpowiadającego, zawiera nie tylko dane ICMP Echo Reply, ale także adres IP niskiego poziomu (nagłówki protokołów internetowych) w pakiecie bazowym.

Nie próbowaliśmy analizować ani w inny sposób przetwarzać tych danych, ale FreeBSD ping program musi to zrobić, aby zrozumieć odpowiedź, w tym sens wszelkich powracających komunikatów o błędach.

Jeśli ping zostanie w jakiś sposób odrzucony, odpowiedź Echo zazwyczaj będzie zawierała nie tylko własne nagłówki IP (jak widać powyżej), ale także kopię referencyjną nagłówków IP i danych ICMP, które pojawiły się w pierwotnym żądaniu wychodzącym.

Nagłówki pakietów IPv4 zwykle wyglądają tak, jak widać powyżej, gdzie zaczynają się nagłówki IP 45 00 00 37... i kontynuuj łącznie przez 20 bajtów, aż do bajtów pokazanych jako włącznie ...XX XX XX XX, czyli adres IP mojego laptopa.

Jak to:

00000000 45 00 00 37 f6 af 00 00 35 01 94 7f c0 00 42 e3 |E..7....5.....B.| 00000010 XX XX XX XX |.... | Wersja IP i długość nagłówka: 0x45 (4 = IPv4, 5 = pięć 32-bitowych słów, tj. 20 bajtów Typ usługi i dane o przeciążeniu: 0x00 Całkowita długość pakietu: 0x0037 (dziesiętnie 55) Informacje o sekwencji: F6 AF 00 00 Czas do -live (przeskoki w lewo): 0x35 (dziesiętnie 53) Typ protokołu: 0x01 (ICMP) Suma kontrolna: 0x947F (dziesiętnie 38015) Numer IP komputera wysyłającego: C0 00 42 E3 (192.0.66.227 = nakedsecurity.sophos.com) Adres IP odbiorcy (my laptop): XX XX XX XX (ZMIENIONO = mój własny numer IP)

FreeBSD ping wydaje się, że programiści zakładali, że nagłówki tego rodzaju rzeczywiście zawsze będą miały długość dokładnie 20 bajtów, w oparciu o wartość długości nagłówka w pierwszym bajcie 0x45, oznaczający IPv4 (0x4?) z 5-DWORD (0x?5) lub 20-bajtowy nagłówek.

Mając tylko 20 bajtów do zmartwienia, programiści przydzielili bufory o stałym rozmiarze na stosie, w których mogli przechowywać kopię nagłówków IP w odpowiedzi, a także wszelkie osadzone nagłówki IP z pierwotnego żądania, gdyby wystąpił błąd do obsłużenia .

Możesz się domyślić, dokąd to zmierza.

Ten pierwszy bajt w nagłówku IPv4 może zgodnie z prawem mieć dowolną wartość 0x45 (minimalny rozmiar nagłówka 5 DWORD lub 20 bajtów, jak pokazano) do 0x4F (co oznacza 15 DWORD, ponieważ 0xF to dziesiętne 15 lub łącznie 60 bajtów danych nagłówka), co zgrabnie pozwala na opcjonalne dodatkowe 40 bajtów danych nagłówka.

Te rzadkie, ale legalne, dodatkowe bajty nagłówka mogą być używane do różnych dziwnych i nietypowych „funkcji” o dziwnych nazwach, takich jak Selektywna transmisja kierowana, Eksperymentalna kontrola przepływu i Pakiet multiemisji nadrzędnej – rzeczy, o których słyszeliśmy, ale nigdy świadomie ich nie używaliśmy ani nawet nie widzieliśmy.

Uważaj na cyberprzestępców, którzy wystawiają Cię na próbę

Jak możesz sobie wyobrazić, biorąc pod uwagę, że te dodatkowe pola prawie nigdy nie są używane, możesz nigdy nie zobaczyć pakietu IPv4 z czymś innym niż 0x45 na początku i łącznie 20 bajtów danych nagłówka, chyba że natkniesz się na grupę cyberprzestępców, którzy są gotowi wystawić Cię na próbę.

Niestety, niewiele jest rzeczy, które powstrzymają atakującego przed skonfigurowaniem serwera, który zgadnie, czy używasz FreeBSD, i celowo generuje zbyt duże pakiety ICMP/IP Echo Reply, aby sprowokować przepełnienie bufora stosu w twoim ping program.

Jeśli kiedykolwiek sprawdzisz, czy ich serwer jest aktywny (co możesz zrobić nawet, a może zwłaszcza, jeśli uważasz, że jest podejrzany!), Możesz zostać zaatakowany odpowiedzią-pułapką.

W najlepszym razie twoje ping program ulegnie awarii; w najgorszym jednak, jak wielkodusznie przyznaje poradnik bezpieczeństwa FreeBSD, „może być możliwe, że złośliwy host uruchomi zdalne wykonanie kodu w pingu”.

Na szczęście, jak również autorzy FreeBSD zwrocic uwage, „Proces pingowania działa w piaskownicy trybu wydajności we wszystkich wersjach FreeBSD, których dotyczy problem, i dlatego jest bardzo ograniczony pod względem interakcji z resztą systemu w punkcie, w którym może wystąpić błąd”.

Innymi słowy, zdecydowanie musisz załatać, ale ryzyko można uznać za niewielkie.

Warto zauważyć, że ping program nie tylko jest zamknięty w piaskownicy, ale nie działa jako root, gdy zostanie osiągnięty kod błędu, jak potwierdzono w poradniku bezpieczeństwa: "Gdy ping uruchamia się, tworzy surowe gniazdo potrzebne do wykonywania swojej pracy, a następnie odbiera podwyższone uprawnienia”.

Jak opisano powyżej, uprawnienia superużytkownika są wymagane tylko do uzyskania surowego gniazda IP z systemu operacyjnego, a nie do korzystania z niego sendto() i recvfrom() funkcje na tym gnieździe później.

Błąd ten otrzymał oficjalny identyfikator CVE-2022-23093; jest to udokumentowane w poradniku bezpieczeństwa FreeBSD-SA-22:15.ping.

Co robić?

  • Jeśli jesteś użytkownikiem FreeBSD, po prostu zaktualizuj wersje, których dotyczy problem (FreeBSD 12 i FreeBSD 13) do ich najnowszych wersji, w których ten błąd został naprawiony.
  • Jeśli jesteś programistą sieciowym, zawsze upewnij się, że uwzględniłeś nagłówki pakietów, które mogą wskazywać na nietypowe zmiany rozmiaru. Fakt, że sam nigdy nie widziałeś żadnej odmiany, nie powstrzymuje cię przed jutrzejszą paczką, która jest niezwykła, ale całkowicie legalna.
  • Jeśli jesteś menedżerem sieci, rozważ blokowanie pakietów IPv4 z nagłówkami IP, które nie mają rozmiaru 20 bajtów. Jeśli naprawdę wydaje ci się, że musisz zezwolić niektórym programom na używanie nietypowych opcji nagłówka IPv4, rozważ zarejestrowanie tych nietypowych pakietów, aby dowiedzieć się, dlaczego.

Uważaj tam!


PRZYKŁADOWY KOD POKAZUJĄCY RUCH PING


Znak czasu:

Więcej z Nagie bezpieczeństwo