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.
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).
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.
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:
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.