Coraz trudniej ufać szyfrom. Dziura w GnuTLS

Od czasu do czasu na jaw wychodzą błędy tak oczywiste, że aż trudno uwierzyć w to, że są obecne np. od dekady i nikt nie zauważył. Nie jest to zjawisko nowe. Trzy lata temu okazało się, że możliwe jest zalogowanie do HP Integrated Lights-Out gdy poda się wystarczająco długie hasło. Sześć lat temu odkryto ShellShock, obecny w powłoce Bash przez 25 lat. W zeszłym tygodniu wyszła na jaw pewna słabość w GnuTLS, jednej z otwartych implementacji SSL. Słabość raczej poważna.

Coraz trudniej ufać szyfrom. Dziura w GnuTLS  (fot. Pixabay)
Coraz trudniej ufać szyfrom. Dziura w GnuTLS (fot. Pixabay)
Kamil J. Dudek

08.06.2020 | aktual.: 09.06.2020 09:44

Nawiązywanie bezpiecznego połączenia TLS opiera się na klasycznej wymianie kluczy metodą Diffie'ego - Hellmana. Początkowy etap negocjacji (uścisku dłoni, handshake), zapewniający uzgodnienie wspólnego szyfru, jest operacyjnie najdroższy i stanowi większy narzut obliczeniowy, niż samo późniejsze szyfrowanie. Dlatego istnieje mechanizm domniemania aktualności szyfru bez konieczności ustanawiania połączenia na nowo w przypadku zerwania lub migracji stanu (szybkie przełączenie na inny serwer podczas pracy). Mechanizm ten to bilety sesji (session tickets).

Whitfield Diffie (via Wikimedia Commons)
Whitfield Diffie (via Wikimedia Commons)

Gdy się klient spieszy...

Aby przyspieszyć wznowienie potencjalnie zerwanego połączenia, w ramach wynegocjowanej sesji serwer dostarczy dwa klucze: klucz sesji (wygasający po zamknięciu połączenia i podlegający renegocjacji) oraz jego zaszyfrowaną postać. Zaszyfrowany klucz sesji jest przygotowywany z użyciem "sekretu szyfrującego bilety sesji". Działa to tak: tylko serwer umie cokolwiek szyfrować takim sekretem i używa takiego szyfru tylko wtedy, gdy już wynegocjował zaszyfrowane połączenie.

Gdy nastąpi konieczność ponownego logowania i klucz sesji powinien był wygasnąć, bo jest już nieodróżnialny od fałszywego, klient może pokazać* "patrz, mam taki klucz sesji – kiedyś była aktualna, bo mam też jej zaszyfrowaną postać, a tylko ty potrafisz szyfrować rzeczy w taki sposób!"*. Dzięki temu, zamiast negocjować nowy klucz sesji, da się "wstecznie" uwiarygodnić poprzedni i wznowić połączenie.

Bilety sesji (fot. CloudFlare)
Bilety sesji (fot. CloudFlare)

Pan jest zerem!

W takim modelu, przejęcie kluczy serwera umożliwi podszycie się pod niego (jak zawsze), ale dodatkowo przejęcie kluczy biletów pozwoli odszyfrować dawne sesje! Przejęty serwer można wyłączyć/rozstrzelać, ale rozszyfrowanych połączeń już się nie "odzobaczy" i zdjęcie z nich tajemnicy oznacza dekonspirację. Nie da się z powrotem zostać szpiegiem, nie da się rozchodzić złamania nogi i nie da się przywrócić bezpieczeństwa rozkodowanej sesji.

Dlatego klucze biletów trzeba unieważniać, chronić, uzależniać od czasu i rotować. Jak od kilku lat radził sobie z tym GnuTLS? Do czasu pierwszej rotacji, para kluczy dla biletów sesji to same zera, co w praktyce oznacza tanie w przeprowadzeniu ominięcie uwierzytelniania. Powstała już malutka poprawka:

No i naprawione.
No i naprawione.

Dziura otrzymała swój numer podatności (CVE-2020-13777), dystrybucje dostały już aktualizacje, a Tenable wydał plugin wykrywający nieaktualne pakiety. Jednak jak sugerują eksperci, bilety sesji to niebezpieczna koncepcja. Być może warto rozważyć rezygnację z nich podczas projektowania nadmiarowości/bezstanowości swojego rozwiązania.

Programy

Zobacz więcej
Wybrane dla Ciebie
Komentarze (73)