Niebezpieczny interfejs HostnameVerifier
Zadbaj o dobrą organizację dzięki kolekcji
Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.
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
Treść strony i umieszczone na niej fragmenty kodu podlegają licencjom opisanym w Licencji na treści. Java i OpenJDK są znakami towarowymi lub zastrzeżonymi znakami towarowymi należącymi do firmy Oracle lub jej podmiotów stowarzyszonych.
Ostatnia aktualizacja: 2025-07-26 UTC.
[[["Łatwo zrozumieć","easyToUnderstand","thumb-up"],["Rozwiązało to mój problem","solvedMyProblem","thumb-up"],["Inne","otherUp","thumb-up"]],[["Brak potrzebnych mi informacji","missingTheInformationINeed","thumb-down"],["Zbyt skomplikowane / zbyt wiele czynności do wykonania","tooComplicatedTooManySteps","thumb-down"],["Nieaktualne treści","outOfDate","thumb-down"],["Problem z tłumaczeniem","translationIssue","thumb-down"],["Problem z przykładami/kodem","samplesCodeIssue","thumb-down"],["Inne","otherDown","thumb-down"]],["Ostatnia aktualizacja: 2025-07-26 UTC."],[],[],null,["# Unsafe HostnameVerifier\n\n\u003cbr /\u003e\n\n**OWASP category:** [MASVS-CODE: Code Quality](https://mas.owasp.org/MASVS/10-MASVS-CODE)\n\nOverview\n--------\n\nThe [`HostnameVerifier`](/reference/javax/net/ssl/HostnameVerifier#verify(java.lang.String,%20javax.net.ssl.SSLSession)) implementation is responsible for verifying that the\nhostname in the server's certificate matches the hostname of the server that the\nclient is trying to connect to.\n\nAn unsafe HostnameVerifier implementation in an Android application is an\nimplementation that does not properly verify the hostname of the server with\nwhich the application is communicating. This can allow an attacker to\nimpersonate a legitimate server and trick the application into sending sensitive\ndata to the attacker.\n\nThis vulnerability exists because the `HostnameVerifier` class has function\ncalls that can skip X.509 certificate hostname validation and, instead, only\nverify the hash of the certificate. A common misconception is that the\n[`SSLSession#isValid`](/reference/javax/net/ssl/SSLSession#isValid()) function performs a security-related operation, when\nin reality its purpose is only to check if a session is valid and available for\nresuming or joining; neither of which validate the *security* of a session. The\nHostnameVerifier class has been superseded by [NetworkSecurityConfig](/training/articles/security-config).\n\nImpact\n------\n\nUnsafe HostnameVerifier implementations can lead to vulnerabilities which can be\nused to perform MiTM (Man-in-The-Middle) attacks on network traffic from the\nvictim application. The impact of exploiting this insecure code is that a user's\napplication network data can be compromised by network attackers (remotely or\nlocally) if this code is triggered. The impact is dependent on the content of\nthe network traffic being inadvertently exposed (PII, private information,\nsensitive session values, service credentials, etc).\n\nMitigations\n-----------\n\nUse the [NetworkSecurityConfig.xml](/training/articles/security-config) to ensure that all\nproduction, testing, debugging, and dev stage connections are properly handled\nrather than using or implementing custom TLS/SSL certificate validation code.\n\nResources\n---------\n\n- [Network Security Configuration Documentation](/training/articles/security-config)\n- [This check looks for implementations of HostnameVerifier whose verify method always returns true (thus trusting any hostname)](https://googlesamples.github.io/android-custom-lint-rules/checks/BadHostnameVerifier.md.html)\n- [Developer documentation for the HostnameVerifier class](/reference/javax/net/ssl/HostnameVerifier#verify(java.lang.String,%20javax.net.ssl.SSLSession))\n- [AllowAllHostnameVerifierDetector class in Android](https://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-main:lint/libs/lint-checks/src/main/java/com/android/tools/lint/checks/AllowAllHostnameVerifierDetector.java)"]]