Android 16, 'Always-On VPN' 설정 무력화하는 IP 유출 취약점 발견!

by DD
1개월 전
조회수 6

Android 16에서 'Always-On VPN' 및 'VPN 없는 연결 차단' 설정에도 불구하고 IP 주소 유출(IP Leak)이 가능한 취약점이 발견됨

system_server가 권한 우회를 통해 UDP 소켓을 생성하고, VPN을 거치지 않고 데이터를 전송하는 방식

QUIC 연결 종료(QUIC Connection Close) 기능을 악용하여 임의의 데이터를 전송하는 공격 가능성 제기

구글은 해당 취약점을 '수정 불가(Won't Fix)'로 분류했으나, 임시 해결책(Mitigation) 제시

system_server의 권한 우회(Permission Bypass) 취약점

취약점은 system_server(UID 1000)가 VPN 설정과 무관하게 UDP 소켓을 생성하고 데이터를 전송하는 데서 기인한다. 특히, system_server는 FIRST_APPLICATION_UID 미만의 UID를 가진 소켓에 대해 VPN 정책을 무시한다. 공격자는 이 취약점을 악용하여 데이터 격리 아키텍처(Data Isolation Architecture)를 우회하고, VPN 터널 밖으로 데이터를 전송할 수 있다. 이는 'Always-On VPN'의 근본적인 보안 약점을 드러낸다.

QUIC 연결 종료(QUIC Connection Close) 기능 악용

Android 16에 도입된 QUIC 연결 종료 기능은 소켓 종료 시 데이터를 전송하는 메커니즘을 제공한다. 이 기능은 ConnectivityManager의 `registerQuicConnectionClosePayload` 메서드를 통해 구현되며, 권한 검사 없이 임의의 데이터를 전송할 수 있다. 공격자는 이 기능을 활용하여 VPN을 우회하고, 사용자의 IP 주소를 포함한 데이터를 유출할 수 있다. 데이터 미저장 정책(Zero-Retention Policy)을 우회하는 심각한 문제점을 야기한다.

공격 흐름 분석: Wi-Fi 네트워크를 통한 IP 유출

공격은 Wi-Fi 네트워크를 활용하여 VPN을 우회한다. 공격 앱은 `getAllNetworks()`를 통해 Wi-Fi 네트워크 정보를 획득하고, `bind()` 시스템 콜을 사용하여 Wi-Fi IP 주소로 소켓을 바인딩한다. 이후 `registerQuicConnectionClosePayload`를 호출하여 데이터를 등록하고, 소켓 종료 시 system_server가 데이터를 전송하도록 한다. 이 과정에서 VPN은 무시되며, 공격자는 사용자의 실제 IP 주소를 탈취할 수 있다. 멀티모달 분석(Multimodal Analysis)을 통해 공격을 탐지하기 어렵다.

구글의 대응과 임시 해결책

구글은 해당 취약점을 '수정 불가'로 분류했으나, 임시 해결책을 제시했다. `device_config`를 사용하여 QUIC 연결 종료 기능을 비활성화하는 방법이다. 이 방법은 모든 앱에 대해 QUIC 연결 종료 기능을 비활성화하므로, QUIC을 사용하는 다른 앱에도 영향을 미칠 수 있다. 따라서, 개발자는 이 해결책을 적용하기 전에 트레이드오프(Trade-offs)를 신중하게 고려해야 한다.

개발자 관점의 보안 권고

개발자는 VPN 사용 시, Android 시스템의 취약점을 인지하고, 보안 설정을 맹신하지 않도록 주의해야 한다. 특히, 데이터 격리 아키텍처(Data Isolation Architecture)를 구현할 때, system_server와 같은 시스템 프로세스의 권한 문제를 고려해야 한다. 또한, QUIC과 같은 새로운 기술을 사용할 때, 보안 취약점을 파악하고, GDPR 규제 준수(GDPR Compliance)를 위한 안전한 데이터 처리 방식을 설계해야 한다.

Android VPN IP Leak Even If Always-On VPN Enabled