TrustManager X.509 không an toàn
Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Danh mục OWASP: MASVS-CODE: Chất lượng mã
Tổng quan
Lớp X509TrustManager
chịu trách nhiệm xác minh tính xác thực của máy chủ từ xa bằng cách xác thực chứng chỉ của máy chủ.
Quá trình triển khai X509TrustManager
không an toàn trong ứng dụng Android là quá trình không xác minh đúng tính xác thực của máy chủ đang giao tiếp với ứng dụng. Điều này có thể cho phép kẻ tấn công mạo danh máy chủ hợp pháp và lừa ứng dụng gửi dữ liệu nhạy cảm cho kẻ tấn công.
Lỗ hổng bảo mật này tồn tại vì khi sử dụng lớp X509TrustManager
, Java và Android sẽ cho phép ghi đè đầy đủ quy trình xác minh máy chủ. Lớp X509TrustManager
có 2 hàm ưa thích: checkServerTrusted()
và getAcceptedIssuers()
. Các lệnh gọi hàm này có thể được định cấu hình để tin cậy mọi chứng chỉ X.509. Logic xác thực tuỳ chỉnh có thể bị lỗi hoặc không đầy đủ và cho phép các kết nối không mong muốn. Trong tất cả các trường hợp này, mục đích của lớp đã bị bỏ qua và kết nối mạng được thiết lập dựa trên đầu ra X509TrustManager
là không an toàn.
Mức độ tác động
Quá trình triển khai X509TrustManager
không an toàn có thể dẫn đến các lỗ hổng bảo mật. Các lỗ hổng này có thể dùng để thực hiện những cuộc tấn công MiTM (xen giữa) đối với lưu lượng truy cập mạng từ ứng dụng bị hại. Tác động của việc khai thác mã không an toàn này là dữ liệu mạng ứng dụng của người dùng có thể bị kẻ tấn công mạng xâm phạm (từ xa hoặc cục bộ) nếu mã này được kích hoạt. Tác động này phụ thuộc vào nội dung của lưu lượng truy cập mạng vô tình bị lộ (thông tin nhận dạng cá nhân, thông tin cá nhân, giá trị phiên hoạt động nhạy cảm, thông tin đăng nhập dịch vụ, v.v.).
Giải pháp giảm thiểu
Hãy sử dụng chức năng NetworkSecurityConfig.xml để đảm bảo rằng tất cả các kết nối ở giai đoạn chính thức, kiểm thử, gỡ lỗi và phát triển đều được xử lý đúng cách thay vì sử dụng hoặc triển khai mã xác thực chứng chỉ TLS/SSL tuỳ chỉnh. Nếu cần sử dụng chứng chỉ tự ký để kiểm thử và gỡ lỗi bản dựng, hãy cân nhắc dùng NetworkSecurityConfig thay vì triển khai X509TrustManager
tuỳ chỉnh.
Tài nguyên
Nội dung và mã mẫu trên trang này phải tuân thủ các giấy phép như mô tả trong phần Giấy phép nội dung. Java và OpenJDK là nhãn hiệu hoặc nhãn hiệu đã đăng ký của Oracle và/hoặc đơn vị liên kết của Oracle.
Cập nhật lần gần đây nhất: 2023-12-13 UTC.
[[["Dễ hiểu","easyToUnderstand","thumb-up"],["Giúp tôi giải quyết được vấn đề","solvedMyProblem","thumb-up"],["Khác","otherUp","thumb-up"]],[["Thiếu thông tin tôi cần","missingTheInformationINeed","thumb-down"],["Quá phức tạp/quá nhiều bước","tooComplicatedTooManySteps","thumb-down"],["Đã lỗi thời","outOfDate","thumb-down"],["Vấn đề về bản dịch","translationIssue","thumb-down"],["Vấn đề về mẫu/mã","samplesCodeIssue","thumb-down"],["Khác","otherDown","thumb-down"]],["Cập nhật lần gần đây nhất: 2023-12-13 UTC."],[],[],null,["# Unsafe X509TrustManager\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 `X509TrustManager` class is responsible for verifying the authenticity of a\nremote server. It does this by validating the server's certificate.\n\nAn insecure `X509TrustManager` implementation in an Android application is an\nimplementation that does not properly verify the authenticity 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\nThe vulnerability exists because using the [`X509TrustManager`](/reference/javax/net/ssl/X509TrustManager#checkServerTrusted(java.security.cert.X509Certificate%5B%5D,%20java.lang.String)) class,\nJava/Android allows the complete overriding of server verification. The\n`X509TrustManager` class has two functions of interest:\n[`checkServerTrusted()`](/reference/javax/net/ssl/X509TrustManager#checkServerTrusted(java.security.cert.X509Certificate%5B%5D,%20java.lang.String)) and [`getAcceptedIssuers()`](/reference/javax/net/ssl/X509TrustManager#getAcceptedIssuers()). These function\ncalls can be configured to trust all X.509 certificates. Finally, custom\nvalidation logic may be buggy or incomplete and permit unexpected connections.\nIn all these cases, the purpose of the class has been negated and the network\nconnection established based on the `X509TrustManager` output is not secure.\n\nImpact\n------\n\nUnsafe X509TrustManager 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) functionality 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. If\nusing a self-signed certificate is needed for test and debug builds, consider\nusing NetworkSecurityConfig instead of implementing a custom `X509TrustManager`.\n\nResources\n---------\n\n- [Play Warning docs](https://support.google.com/faqs/answer/6346016)\n- [Documentation to assist configuring the Network security configuration xml file.](/training/articles/security-config)\n- [Developer documentation for the TrustManager class.](/reference/javax/net/ssl/TrustManager)\n- [This check looks for X.509TrustManager implementations whose checkServerTrusted or checkClientTrusted methods do nothing (thus trusting any certificate chain).](https://googlesamples.github.io/android-custom-lint-rules/checks/TrustAllX509TrustManager.md.html)\n- [This check looks for custom X.509TrustManager implementations.](https://googlesamples.github.io/android-custom-lint-rules/checks/CustomX509TrustManager.md.html)\n- \u003chttps://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-main:lint/libs/lint-checks/src/main/java/com/android/tools/lint/checks/X509TrustManagerDetector.java\u003e"]]