HostnameVerifier non sicuro
Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
Categoria OWASP: MASVS-CODE: Qualità del codice
Panoramica
L'implementazione di HostnameVerifier
è responsabile della verifica che il nome host nel certificato del server corrisponda al nome host del server a cui il client sta tentando di connettersi.
Un'implementazione non sicura di HostnameVerifier in un'applicazione Android è un'implementazione che non verifica correttamente il nome host del server con cui l'applicazione è in comunicazione. In questo modo, un malintenzionato può assumere l'identità di un server legittimo e indurre l'applicazione a inviare dati sensibili.
Questa vulnerabilità esiste perché la classe HostnameVerifier
ha chiamate di funzione che possono saltare la convalida del nome host del certificato X.509 e, al contrario, verificare solo l'hash del certificato. Un'idea sbagliata comune è che la funzione
SSLSession#isValid
esegui un'operazione correlata alla sicurezza, quando
in realtà il suo scopo è solo verificare se una sessione è valida e disponibile per essere ripresa o se è possibile partecipare. Nessuna di queste operazioni convalida la sicurezza di una sessione. La classe HostnameVerifier è stata sostituita da NetworkSecurityConfig.
Impatto
Implementazioni non sicure di HostnameVerifier possono portare a vulnerabilità che possono essere utilizzate per eseguire attacchi man-in-the-middle (MitM) sul traffico di rete dell'applicazione vittima. L'impatto dello sfruttamento di questo codice non sicuro è che i dati di rete dell'applicazione di un utente possono essere compromessi da malintenzionati della rete (da remoto o localmente) se questo codice viene attivato. L'impatto dipende dai contenuti del traffico di rete esposti inavvertitamente (PII, informazioni private, valori di sessione sensibili, credenziali di servizio e così via).
Mitigazioni
Utilizza NetworkSecurityConfig.xml per assicurarti che tutte le connessioni di produzione, test, debug e fase di sviluppo vengano gestite correttamente anziché utilizzare o implementare il codice di convalida dei certificati TLS/SSL personalizzati.
Risorse
I campioni di contenuti e codice in questa pagina sono soggetti alle licenze descritte nella Licenza per i contenuti. Java e OpenJDK sono marchi o marchi registrati di Oracle e/o delle sue società consociate.
Ultimo aggiornamento 2025-07-26 UTC.
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Mancano le informazioni di cui ho bisogno","missingTheInformationINeed","thumb-down"],["Troppo complicato/troppi passaggi","tooComplicatedTooManySteps","thumb-down"],["Obsoleti","outOfDate","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Problema relativo a esempi/codice","samplesCodeIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 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)"]]