Kategoria OWASP: MASVS-CODE: Code Quality
Omówienie
Implementacja HostnameVerifier
odpowiada za weryfikację, czy nazwa hosta w certyfikacie serwera jest zgodna z nazwą hosta serwera, z którym klient próbuje się połączyć.
Niebezpieczna implementacja interfejsu HostnameVerifier w aplikacji na Androida to implementacja, która nieprawidłowo sprawdza nazwę hosta serwera, z którym komunikuje się aplikacja. Może to umożliwić atakującemu podszywanie się pod legalny serwer i wyłukiwanie od aplikacji danych wrażliwych.
Ta luka istnieje, ponieważ klasa HostnameVerifier
zawiera wywołania funkcji, które mogą pominąć weryfikację nazwy hosta certyfikatu X.509 i zamiast tego zweryfikować tylko hasz certyfikatu. Powszechnym błędem jest przekonanie, że funkcja SSLSession#isValid
wykonuje operację związaną z bezpieczeństwem, podczas gdy jej celem jest tylko sprawdzenie, czy sesja jest prawidłowa i czy można ją wznowić lub do niej dołączyć. Żadna z tych czynności nie sprawdza bezpieczeństwa sesji. Klasa HostnameVerifier została zastąpiona klasą NetworkSecurityConfig.
Wpływ
Niebezpieczne implementacje interfejsu HostnameVerifier mogą prowadzić do luk, które mogą być wykorzystywane do przeprowadzania ataków typu MiTM (man-in-the-middle) na ruch sieciowy aplikacji ofiary. Wykorzystanie tego niebezpiecznego kodu może spowodować, że dane sieciowe aplikacji użytkownika mogą zostać przejęte przez hakerów sieciowych (zdalnie lub lokalnie), jeśli ten kod zostanie uruchomiony. Skutki zależą od treści przypadkowo odsłoniętego ruchu sieciowego (informacje umożliwiające identyfikację, informacje prywatne, poufne wartości sesji, poświadczenia usług itp.).
Środki zaradcze
Użyj pliku NetworkSecurityConfig.xml, aby zapewnić prawidłowe przetwarzanie wszystkich połączeń na etapie produkcji, testowania, debugowania i tworzenia, zamiast używać lub wdrażać niestandardowego kodu weryfikacji certyfikatu TLS/SSL.
Materiały
- Dokumentacja konfiguracji zabezpieczeń sieciowych
- Ten test sprawdza implementacje interfejsu HostnameVerifier, których metoda verify zawsze zwraca wartość true (co oznacza zaufanie do dowolnej nazwy hosta).
- Dokumentacja dla deweloperów dotycząca klasy HostnameVerifier
- Klasa AllowAllHostnameVerifierDetector na Androidzie