HostnameVerifier ที่ไม่ปลอดภัย
จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน
บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ
หมวดหมู่ OWASP: MASVS-CODE: คุณภาพโค้ด
ภาพรวม
การติดตั้งใช้งาน HostnameVerifier
มีหน้าที่รับผิดชอบในการตรวจสอบว่าชื่อโฮสต์ในใบรับรองของเซิร์ฟเวอร์ตรงกับชื่อโฮสต์ของเซิร์ฟเวอร์ที่ไคลเอ็นต์พยายามเชื่อมต่อ
การใช้งาน HostnameVerifier ที่ไม่ปลอดภัยในแอปพลิเคชัน Android คือการใช้งานที่ไม่ยืนยันชื่อโฮสต์ของเซิร์ฟเวอร์ที่แอปพลิเคชันสื่อสารด้วยอย่างถูกต้อง ซึ่งอาจทำให้ผู้โจมตีแอบอ้างเป็นเซิร์ฟเวอร์ที่ถูกต้องตามกฎหมายและหลอกแอปพลิเคชันให้ส่งข้อมูลที่ละเอียดอ่อนไปยังผู้โจมตีได้
ช่องโหว่นี้เกิดขึ้นเนื่องจากคลาส HostnameVerifier
มีการเรียกใช้ฟังก์ชันที่ข้ามการตรวจสอบชื่อโฮสต์ของใบรับรอง X.509 และยืนยันเฉพาะแฮชของใบรับรองเท่านั้น คําเข้าใจผิดที่พบบ่อยคือฟังก์ชัน SSLSession#isValid
ดําเนินการที่เกี่ยวข้องกับความปลอดภัย แต่ในความเป็นจริงแล้ว ฟังก์ชันนี้มีไว้เพื่อตรวจสอบว่าเซสชันถูกต้องและพร้อมใช้งานสําหรับการกลับมาทํางานต่อหรือเข้าร่วมหรือไม่ ซึ่งทั้ง 2 อย่างนี้ไม่ได้ตรวจสอบความปลอดภัยของเซสชัน คลาส HostnameVerifier เลิกใช้งานแล้ว NetworkSecurityConfig เข้ามาแทนที่
ผลกระทบ
การใช้งาน HostnameVerifier ที่ไม่ปลอดภัยอาจทำให้เกิดช่องโหว่ซึ่งอาจนำไปใช้ในการโจมตี MiTM (Man-In-The-Middle) กับการจราจรของข้อมูลในเครือข่ายจากแอปพลิเคชันที่เป็นเหยื่อ ผลกระทบของการใช้ประโยชน์จากโค้ดที่ไม่ปลอดภัยนี้คือ ข้อมูลเครือข่ายแอปพลิเคชันของผู้ใช้อาจถูกบุกรุกโดยผู้โจมตีเครือข่าย (จากระยะไกลหรือจากเครื่อง) หากมีการเรียกใช้โค้ดนี้ ผลกระทบจะขึ้นอยู่กับเนื้อหาของการรับส่งข้อมูลในเครือข่ายที่เปิดเผยโดยไม่ตั้งใจ (PII, ข้อมูลส่วนตัว, ค่าเซสชันที่ละเอียดอ่อน, ข้อมูลเข้าสู่ระบบของบริการ ฯลฯ)
การลดปัญหา
ใช้ NetworkSecurityConfig.xml เพื่อให้แน่ใจว่าระบบจัดการการเชื่อมต่อทั้งหมดในขั้นตอนการทํางาน การทดสอบ การแก้ไขข้อบกพร่อง และระยะการพัฒนาอย่างเหมาะสม แทนที่จะใช้หรือติดตั้งใช้งานโค้ดการตรวจสอบใบรับรอง TLS/SSL ที่กำหนดเอง
แหล่งข้อมูล
ตัวอย่างเนื้อหาและโค้ดในหน้าเว็บนี้ขึ้นอยู่กับใบอนุญาตที่อธิบายไว้ในใบอนุญาตการใช้เนื้อหา Java และ OpenJDK เป็นเครื่องหมายการค้าหรือเครื่องหมายการค้าจดทะเบียนของ Oracle และ/หรือบริษัทในเครือ
อัปเดตล่าสุด 2025-07-26 UTC
[[["เข้าใจง่าย","easyToUnderstand","thumb-up"],["แก้ปัญหาของฉันได้","solvedMyProblem","thumb-up"],["อื่นๆ","otherUp","thumb-up"]],[["ไม่มีข้อมูลที่ฉันต้องการ","missingTheInformationINeed","thumb-down"],["ซับซ้อนเกินไป/มีหลายขั้นตอนมากเกินไป","tooComplicatedTooManySteps","thumb-down"],["ล้าสมัย","outOfDate","thumb-down"],["ปัญหาเกี่ยวกับการแปล","translationIssue","thumb-down"],["ตัวอย่าง/ปัญหาเกี่ยวกับโค้ด","samplesCodeIssue","thumb-down"],["อื่นๆ","otherDown","thumb-down"]],["อัปเดตล่าสุด 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)"]]