안전하지 않은 X.509 TrustManager
컬렉션을 사용해 정리하기
내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
OWASP 카테고리: MASVS-CODE: 코드 품질
개요
X509TrustManager
클래스는 원격 서버의 신뢰성을 확인합니다. 이를 위해 서버의 인증서를 확인합니다.
애플리케이션이 통신하는 서버의 신뢰성을 제대로 확인하지 않는다면 Android 애플리케이션에서 X509TrustManager
가 안전하지 않게 구현된 것입니다. 이렇게 하면 공격자가 합법적인 서버를 가장하여 애플리케이션이 민감한 정보를 전송하도록 유도할 수 있습니다.
이 취약점은 X509TrustManager
클래스를 사용하면 Java 및 Android에서 서버 인증을 완전히 재정의할 수 있기 때문에 발생합니다. X509TrustManager
클래스에는 두 가지 관심 함수인 checkServerTrusted()
와 getAcceptedIssuers()
가 있습니다. 이러한 함수 호출은 모든 X.509 인증서를 신뢰하도록 구성할 수 있습니다. 맞춤 유효성 검사 로직은 버그가 있거나 불완전할 수 있으며 예기치 않은 연결을 허용할 수 있습니다. 이러한 모든 사례에서 클래스의 목적은 무효화되었고 X509TrustManager
출력을 기반으로 설정된 네트워크 연결은 안전하지 않습니다.
영향
X509TrustManager
가 안전하지 않게 구현되는 경우 취약점이 발생하여 피해를 받는 애플리케이션의 네트워크 트래픽에 MitM(중간자) 공격을 실행하는 데 사용될 수 있습니다. 이렇게 안전하지 않은 코드가 트리거되면 원격 또는 로컬에서 네트워크 공격자가 사용자의 애플리케이션 네트워크 데이터를 손상시키는 방식으로 악용될 수 있습니다. 의도치 않게 노출된 네트워크 트래픽의 콘텐츠(PII, 개인 정보, 민감한 세션 값, 서비스 사용자 인증 정보 등)가 무엇인지에 따라 발생할 피해가 좌우됩니다.
완화 조치
맞춤 TLS/SSL 인증서 유효성 검사 코드를 사용하거나 구현하는 대신 NetworkSecurityConfig.xml 기능을 사용하여 모든 프로덕션, 테스트, 디버깅, 개발 단계 연결이 올바르게 처리되도록 하는 것이 좋습니다. 테스트 및 디버그 빌드에 자체 서명 인증서를 사용해야 하는 경우 맞춤 X509TrustManager
를 구현하는 대신 NetworkSecurityConfig를 사용하는 것이 좋습니다.
리소스
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2023-12-15(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"]],["최종 업데이트: 2023-12-15(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"]]