Niewielki, złośliwy pakiet może spowodować atak DDoS na serwerach z zainstalowaną biblioteką OpenSSL z powodu błędów alokacji pamięci. Dostępne są już wersje z poprawkami.
Twórcy OpenSSL zamknęli lukę w zabezpieczeniach bez przypisywania identyfikatora CVE i rozpowszechnili poprawkę we wszystkich wersjach, także starszych. Oprogramowanie OpenSSL odgrywa podstawową rolę w bezpiecznej komunikacji internetowej, więc odpowiednie organizacje muszą jak najszybciej zintegrować poprawioną wersję odpowiedniej biblioteki.
Serwery OpenSSL mogą zostać wyłączone przy użyciu niewielkiego złośliwego kodu — „ładunek” ma długość zaledwie 11 bajtów.
Badacze z Okta nazwali tę lukę HollowByte. Według nich, w trakcie nawiązywania połączenia TLS każda wiadomość ma 4-bajtowy nagłówek, który określa rozmiar przychodzącej wiadomości. Jednak podatne na ataki wersje OpenSSL przydzielają przestrzeń pamięci na zadeklarowaną długość wiadomości jeszcze przed odebraniem treści i sprawdzeniem jej rozmiaru.
Po nadejściu złośliwego nagłówka, komponent stanu uruchamia niesprawdzoną alokację pamięci. W rezultacie, gdy 11-bajtowy złośliwy ładunek dotrze do serwera, maszyna stanów TLS odczytuje 4-bajtowy nagłówek uzgadniania i uruchamia niesprawdzoną wstępną alokację pamięci na podstawie deklaracji długości 3-bajtowego nagłówka:
Read Header⟶grow_init_buf()⟶OPENSSL_clear_realloc()⟶malloc(attacker_size).
Ponieważ na tym etapie nie jest przeprowadzana żadna walidacja danych, funkcja malloc() przydziela do 131 KB pamięci wyłącznie na podstawie fałszywych danych. Wątek roboczy wchodzi wtedy w nieskończoną pętlę, czekając na dane, które nigdy nie dotrą.
Starsz sztuczka, nowe możliwości
Naukowcy zauważają, że wielokrotne otwieranie połączeń w celu szybkiego wyczerpania zasobów serwera to stara sztuczka. Jednak HollowByte stwarza dodatkowy problem ze względu na sposób, w jaki biblioteka GNU C (glibc) obsługuje pamięć.
Po zakończeniu złośliwego połączenia OpenSSL zwalnia przydzielony bufor. Jednak glibc nie zwraca od razu zasobów przydzielonych systemowi operacyjnemu, a biblioteka przechowuje je do potencjalnego ponownego wykorzystania.
Wysyłając wiele fal żądań połączenia z różnymi zadeklarowanymi długościami komunikatów, atakujący uniemożliwia realokację zwolnionych obszarów pamięci. Powoduje to znaczną fragmentację sterty, co powoduje, że maksymalny rozmiar pamięci rezydentnej stale rośnie i pozostaje zawyżony nawet po zakończeniu ataku. Jedynym sposobem na realokację pamięci jest zatrzymanie procesu OpenSSL.
„Aby ocenić zagrożenie, przetestowaliśmy niezabezpieczone i zabezpieczone instancje OpenSSL działające w środowisku NGINX w różnych warunkach obciążenia” – piszą badacze. „W standardowym środowisku z 1 GB pamięci RAM niezabezpieczony serwer uległ awarii z powodu błędu braku pamięci (OOM), gdy zużyto 547 megabajtów zamrożonej, pofragmentowanej pamięci. Podczas testów w środowiskach o wyższej wydajności (16 GB pamięci RAM) atak skutecznie zablokował 25% pamięci systemu, mieszcząc się w limicie połączeń, co oznacza, że standardowe środki zaradcze ograniczające liczbę połączeń przychodzących nie byłyby w stanie go zatrzymać”.
„Zasadniczo taki atak jest bardzo łatwy do przeprowadzenia, trudny do odparcia, a jego konsekwencje będą podobne do rozproszonego ataku typu DoS ” – piszą eksperci . „Szkody wynikające z przestoju, w zależności od obciążenia serwera, mogą być ogromne, dlatego aktualizacja bibliotek jest priorytetem, o ile jeszcze tego nie zrobiono”.
Konieczne aktualizacje
Biblioteka OpenSSL jest wbudowana w popularne pakiety, takie jak Nginx , Apache środowiska uruchomieniowe, Node.js, Python, Ruby i PHP, a także bazy danych MySQL i PostgreSQL. Jest ona preinstalowana w większości dystrybucji Linuksa i obsługuje szyfrowanie TLS oraz obsługę certyfikatów bezpieczeństwa.
Wersje 4.0.1, 3.6.3, 3.5.7, 3.4.6 i 3.0.21 zostały poprawione. Teraz bufor pamięci jest przydzielany nie na podstawie rozmiaru zadeklarowanego w nagłówku, ale na podstawie rzeczywistego rozmiaru przychodzącej wiadomości.
Spodobało Ci się? Podziel się ze znajomymi!

Pokaż / Dodaj komentarze do:
11 bajtów złośliwego kodu łamie protokół OpenSSL, na którym opiera się Internet