Szczerze polecam lekturę tego wpisu: Capture ALL the Flags. szczególnie chodzi mi tutaj o ostatni poziom. Jest to piękny przypadek wykorzystania side-channel w celu uzyskania pewnych informacji. W tym wypadku szukaną informacją było hasło.
Piękny side-channel
O co chodzi? Wyobraźmy sobie, że jest pewien moduł, który sprawdza poprawność hasła, ale nie sprawdza całego hasła, lecz dzieli je na pewne bloki (np. złożone z 3 znaków) i nawiązuje połączenie z kolejną usługą, która dany fragment hasła weryfikuje. Sprawdzenie kolejnego fragmentu hasła ma miejsce wyłącznie wówczas, gdy poprzedni fragment hasła jest prawidłowy. Rezultatem sprawdzenia hasła jest pewien call back od modułu weryfikującego hasło pod wskazany adres.
Pierwszym pomysłem będzie prawdopodobnie timing attack. Skoro weryfikacja hasła jest przerywana przy pierwszym niepoprawnym bloku, logiczne wydaje się, że czas weryfikacji hasła będzie się zmieniał i będzie zależny od tego, czy pewna początkowa część hasła jest prawidłowa, czy też nie. W tym przypadku jednak zastosowano (załóżmy, że skuteczne) zabezpieczenie, które miało zagwarantować, że czas weryfikacji hasła jest zawsze stały. Czy jest inny wyznacznik, który można w tym przypadku wykorzystać?
Odpowiedź na to pytanie brzmi - tak. Jest to możliwe dzięki temu jak systemy operacyjne, przynajmniej część z nich, wybierają numer portu źródłowego przy połączeniu TCP. Numer portu jest często wybierany sekwencyjnie, dzięki czemu obserwując numer portu, z którego nawiązywane jest połączenie, można wnioskować o ilości połączeń TCP nawiązanych w "międzyczasie".
I to jest właśnie klucz w tym zadaniu. Choć czas potrzebny na sprawdzenie hasła jest (wydaje się być) taki sam, niezależnie od tego, w którym miejscu hasło jest "złe", to jednak ilość połączeń jest różna. Obserwując zmianę numeru portu źródłowego, z którego nawiązywane jest połączenie w chwili wywoływania wskazanego w żądaniu adresu można wnioskować o tym, czy pierwszy/drugi/kolejny blok hasła jest, czy też nie jest prawidłowy.
Oczywiście to, czy mamy problem, czy też nie zależy od systemu operacyjnego, na którym całe rozwiązanie działa i sposobu, w jaki wybiera on numer kolejnego portu. Na przykład na OpenBSD (i nie tylko) by to nie zadziałało.
P.S. Jeśli komuś by się wydawało, że już gdzieś kiedyś coś podobnego widział, to przypomnę choćby o tym: TCP Idle Scan . Szczegóły oczywiście inne, ale ogólna koncepcja zbliżona.
Dawno nie pisałes w tematyce społeczno-obyczajowej ...