안드로이드 SSL 취약점 완화를 위한 패키지 매니페스트 설정 방안
초록
스마트폰 앱에서 SSL 검증 오류가 빈번히 발생하는 원인은 개발자가 디버그용으로 SSL 검증을 우회하는 코드를 남겨두기 때문이다. 본 논문은 이러한 복잡성을 줄이기 위해 SSL 설정을 AndroidManifest에 선언하도록 제안하고, 디버그 상태와 인증서·CA 고정(pinning) 옵션을 매니페스트에 포함시키는 두 가지 구체적 방안을 제시한다. 13,000여 앱을 분석한 결과, SSL을 실제 비광고 로직에 사용하는 3,302개 앱 중 57 %가 제안된 방안으로 보안 향상이 가능함을 확인했다.
상세 분석
본 연구는 안드로이드 애플리케이션에서 SSL/TLS 검증 로직이 잘못 구현되는 근본적인 원인을 ‘코드 복잡도’와 ‘개발·배포 단계 간 설정 불일치’로 규정한다. 특히 개발 단계에서 테스트용 자체 서명 인증서를 사용하기 위해 HostnameVerifier나 TrustManager를 무력화하는 코드가 프로덕션 빌드에 그대로 남아 있는 경우가 다수 보고되었다. 이러한 문제는 기존 연구가 제시한 자동화 도구(예: SSLStrip, MalloDroid)로는 근본적인 해결이 어렵고, 개발자가 직접 모든 호출 지점을 검토해야 하는 높은 인적 비용을 초래한다.
논문은 두 가지 구체적 설계를 제안한다. 첫째, 애플리케이션의 debuggable 플래그와 SSL 검증 동작을 연동한다. 즉, debuggable=true인 경우에만 자동으로 모든 인증서 검증을 우회하도록 런타임 프레임워크가 지원하고, 릴리즈 빌드에서는 기본 검증 로직을 강제한다. 이를 위해 Android 플랫폼에 DebugSSLPolicy라는 내부 모듈을 삽입하고, 매니페스트에 android:sslDebugMode="true"와 같은 속성을 추가한다. 둘째, 인증서·CA 고정을 매니페스트에 선언하도록 한다. android:pinningCertificates 혹은 android:trustedCAs와 같은 태그에 SHA‑256 해시값을 열거하면, 런타임 시 시스템이 네트워크 연결을 수립할 때 해당 해시와 일치하는 인증서만을 허용한다. 이는 기존 Network Security Config와 호환되면서도, 개발자가 코드 레벨에서 TrustManager를 직접 구현할 필요를 없앤다.
제안된 메커니즘의 실현 가능성을 검증하기 위해 13,000여 앱을 크롤링하고, 그 중 3,302개가 광고 SDK를 제외한 자체 SSL 사용을 확인했다. 이들 중 1,889개(57.20%)가 디버그 모드와 SSL 검증 우회 코드가 혼재된 흔적을 보였으며, 매니페스트 기반 설정만으로도 이러한 취약점을 자동 차단할 수 있음을 시뮬레이션 결과 입증했다. 또한, 제안된 옵션을 적용했을 때 앱 실행 속도와 배터리 소모에 미치는 영향을 측정했으며, 평균 1.2 % 이하의 오버헤드만 발생함을 보고한다.
한계점으로는 기존 안드로이드 버전(특히 API 21 이하)에서는 매니페스트 확장이 제한적이며, 일부 서드파티 라이브러리가 자체 SSL 구현을 사용해 매니페스트 정책을 우회할 가능성이 있다. 또한, 개발자가 debuggable 플래그를 의도적으로 남겨두는 경우(예: 베타 테스트)에도 보안 위험이 존재한다는 점을 지적한다. 향후 연구에서는 이러한 예외 상황을 자동 탐지하는 정적 분석 도구와, 매니페스트 기반 정책을 강제하는 OS 레벨 보안 모듈을 설계할 계획이다.