GN⁺: 안드로이드에서 VPN 터널 밖으로 DNS 트래픽 유출 가능성
(mullvad.net)Android VPN 터널 밖으로 DNS 트래픽이 유출될 수 있음
다중 DNS 유출 가능성 확인
- 최근 Android에서 다중 DNS 유출 가능성을 알게 됨
- Android 자체 버그에서 기인하며, 특정 앱에만 영향을 미침
- 4월 22일 월요일, Reddit 사용자 보고를 통해 DNS 유출을 알게 됨
- 사용자가 "VPN 없이 연결 차단" 설정을 켠 상태에서 VPN을 비활성화하고 활성화할 때 DNS 쿼리가 유출되는 것을 발견함
- 내부 조사를 즉시 시작하여 문제를 확인할 수 있었음
- 조사 결과 Android에서 DNS 유출을 일으킬 수 있는 더 많은 시나리오를 발견함
발견 사항
Android OS에서 DNS 트래픽이 유출될 수 있는 시나리오 식별:
- DNS 서버가 구성되지 않은 상태에서 VPN이 활성화된 경우
- VPN 앱이 터널을 재구성하거나 강제 중지/충돌되는 동안 짧은 시간 동안 발생
유출은 C 함수 getaddrinfo
에 대한 직접 호출로 제한되는 것으로 보임:
- 위에 나열된 시나리오에서 도메인 이름을 확인하는 이 방법을 사용하는 앱은 유출을 일으킴
- DnsResolver와 같은 Android API만 사용하는 앱에서는 유출을 발견하지 못함
- Chrome 브라우저는
getaddrinfo
를 직접 사용할 수 있는 앱의 예임
_Always-on VPN_과 _Block connections without VPN_이 활성화되어 있는지 여부에 관계없이 위의 내용이 적용됨:
- 이는 예상되는 OS 동작이 아니므로 OS의 업스트림에서 수정되어야 함
여러 버전의 Android에서 이러한 유출이 발생하는 것을 확인할 수 있었음(최신 버전인 Android 14 포함)
개선 사항
현재 앱은 차단 상태에서 DNS 서버를 설정하지 않음:
- 앱이 복구할 수 없는 방식으로 터널을 설정하지 못하면 차단 상태로 전환됨
- 이 상태에서는 트래픽이 기기에서 나가는 것을 중지함
- 그러나 이 상태에서는 DNS 서버를 설정하지 않으므로 위에 설명된 DNS 유출이 발생할 수 있음
- 당분간 가짜 DNS 서버를 설정하여 OS 버그를 해결할 예정임
- 이 수정 사항이 포함된 릴리스를 곧 기대할 수 있음
터널 재연결 중 유출을 앱에서 완화하기는 더 어려움:
- 여전히 솔루션을 모색 중임
- 터널 재구성이 발생하는 횟수를 최소화할 수 있지만, 현재로서는 이 유출을 완전히 방지할 수 없다고 생각함
어떤 VPN 앱에서도 이러한 해결 방법이 필요하지 않아야 함을 분명히 해야 함:
- 도메인 이름을 확인하기 위해 앱이
getaddrinfo
를 사용하는 것도 잘못된 것이 아님 - 대신 사용하는 앱에 관계없이 모든 Android 사용자를 보호하기 위해 OS에서 이러한 문제를 해결해야 함
Google에 문제를 보고하고 개선 사항을 제안했으며 신속하게 해결되기를 바람
재현 단계
다음 단계는 위의 두 번째 시나리오를 재현하며, 여기서 VPN 사용자는 터널 구성을 변경함(예: 다른 서버로 전환하거나 DNS 서버 변경):
- WireGuard 앱을 사용하는데, 이는 Android VPN의 참조 구현이 되었기 때문임
- 유출은 아마도 다른 Android VPN 앱으로도 재현할 수 있음을 유의해야 함
-
getaddrinfo
를 사용하는 것으로 확인된 앱 중 하나이므로 유출을 트리거하기 위해 Chrome을 사용함
-
spam_get_requests.html 다운로드
-
WireGuard 앱과 Chrome 설치
-
wg1.conf, wg2.conf를 WireGuard로 가져오기
-
WireGuard 앱에서 wg1 터널을 활성화하고 VPN 권한 허용
-
Android VPN 설정에서 WireGuard에 대해 "Always-on VPN"과 "Block connections without VPN" 활성화
-
라우터에서
tcpdump
를 사용하여 데이터 캡처 시작$ tcpdump -i <INTERFACE> host <IP of android device>
-
WireGuard와 Chrome을 나란히 보이도록 화면 분할
-
Chrome으로
spam_get_requests.html
열고 "Start" 누르기 -
WireGuard 앱에서 wg1과 wg2 사이를 전환하다가 다음 단계에서 유출이 보일 때까지 반복
-
라우터에서 다음과 같은 DNS 트래픽 관찰:
11:50:27.816359 IP Pixel-Tablet.lan.53353 > OpenWrt.lan.53: 11200+ A? 307lf5rgn6-19282-11-50-27-519z.mullvad.test.lan. (65) 11:50:27.816359 IP Pixel-Tablet.lan.48267 > OpenWrt.lan.53: 44347+ A? 307lf5rgn6-19284-11-50-27-579z.mullvad.test.lan. (65) 11:50:27.816396 IP Pixel-Tablet.lan.16747 > OpenWrt.lan.53: 44584+ A? 307lf5rgn6-19289-11-50-27-729z.mullvad.test. (61) 11:50:27.816458 IP OpenWrt.lan.53 > Pixel-Tablet.lan.53353: 11200 NXDomain 0/0/0 (65) 11:50:27.816476 IP Pixel-Tablet.lan.45727 > OpenWrt.lan.53: 40503+ A? 307lf5rgn6-19290-11-50-27-759z.mullvad.test. (61) 11:50:27.816542 IP OpenWrt.lan.53 > Pixel-Tablet.lan.48267: 44347 NXDomain 0/0/0 (65) 11:50:27.816588 IP Pixel-Tablet.lan.43821 > OpenWrt.lan.53: 36295+ A? 307lf5rgn6-19291-11-50-27-789z.mullvad.test. (61) 11:50:27.816625 IP OpenWrt.lan.53 > Pixel-Tablet.lan.16747: 44584 NXDomain 0/0/0 (61)
"Block connections without VPN"이 활성화되어 있었기 때문에 암호화된 WireGuard 트래픽을 제외하고는 어떤 것도 기기에서 빠져나가서는 안 되지만, 여기서는 평문 DNS가 기기에서 나가는 것을 볼 수 있음
결론 및 권장 사항
DNS 유출은 사용자의 프라이버시에 심각한 영향을 미칠 수 있으며, 사용자의 대략적인 위치를 파악하거나 사용자가 사용하는 웹사이트와 서비스를 알아내는 데 사용될 수 있음
이러한 발견은 "Block connections without VPN"이 이름(또는 문서)에 부합하지 않으며 여러 결함이 있음을 다시 한 번 보여줌:
- 위에서 언급한 조건에서 앱이 여전히 DNS 트래픽을 유출할 수 있음
- 이전에 보고된 바와 같이 여전히 연결 확인 트래픽이 유출됨
위협 모델에 따라 민감한 작업에 Android를 아예 사용하지 않거나 유출을 방지하기 위해 다른 완화 조치를 취해야 할 수 있음:
- 앱에서 이러한 문제를 부분적으로 완화하는 것을 목표로 하므로 앱을 최신 상태로 유지해야 함
GN⁺의 의견
- 이 문제는 근본적으로 Android OS의 버그이므로, Google에서 빠른 시일 내에 수정해야 할 것임. VPN 기능을 제공하는 앱 개발자들이 모두 이 문제를 해결하려 노력하는 것은 바람직하지 않음
- "Block connections without VPN" 옵션이 문서대로 동작하지 않고 DNS 유출이 있다는 것은 사용자 입장에서 큰 문제임. VPN을 사용하는 주된 이유 중 하나가 프라이버시 보호인데 DNS 유출로 인해 사용자의 웹 사용 내역 등이 노출될 수 있기 때문
- VPN 터널링 기술 자체의 보안성은 여전히 높다고 볼 수 있으나, OS에서 의도치 않게 유출이 발생하는 것을 방지하기 위해서는 VPN 외에 추가적인 보안/프라이버시 솔루션을 함께 사용하는 것도 고려해 볼만 함
- 앱 개발자 입장에서는 OS 버그를 피해가기 위한 임시방편으로 앱에서 보완을 하고 있지만, 장기적으로는 근본적인 문제 해결을 위해 OS 개선이 필요해 보임
- VPN 기술이 고도화되고 대중화되면서 이런 유형의 보안 이슈들이 새롭게 부각되고 있음. 앞으로도 모바일 OS의 네트워크 및 VPN 기능에 대한 보안감사와 지속적인 개선이 필요할 것으로 보임
Hacker News 의견
- Mullvad의 정보가 풍부하고 문제에 대한 설명, 단기 해결책, 잠재적 해결책, 그리고 Android에서 수정되어야 할 사항들을 잘 설명했다는 평가
- Android의 "편집증 네트워킹"은 시스템 및 OEM 앱에 대한 예외가 있으며, 대부분의 버그 수정은 이 핵심 가정을 수정하지 않을 것이라는 rethinkdns 개발자의 의견
- Android는 두 TUN 장치 간에 "원활한 핸드오버"를 지원하지만, 구현하기가 까다롭다는 점
- Android는 내부 DNS 서버만 사용하려고 해도 필요에 따라 셀룰러 데이터로 전환하여 외부 DNS를 사용하는 문제가 오래전부터 있었음
- Apple의 경우 기본적으로 "프라이버시" VPN을 통해 모든 것을 프록시하려고 하므로 경쟁 제품 사용 시 더 나은 상황은 아닐 것으로 예상
- Android에서는 IPv6 DNS 서버를 직접 설정할 수 없으며, 와이파이에 변화가 있을 때마다 변경됨
- MikroTik 방화벽 장치를 사용하여 VPN 서버의 IP 주소로 향하지 않는 모든 트래픽을 차단하는 방법으로 트래픽 누출을 방지할 수 있음
- 루트 액세스가 없는 모든 시스템은 본질적으로 안전하지 않으며, Android와 iOS는 우스꽝스러움
- 가장 안전한 설정은 휴대전화의 모바일 데이터를 끄고 OpenWRT 핫스팟을 사용하여 업스트림에서 VPN을 수행하는 것
- DNS 누출은 사용자의 브라우징 위치와 심지어 실제 위치까지 노출시킬 수 있으므로 VPN의 목적을 무력화시킴
- iOS에서도 APNS 트래픽이 VPN 외부로 누출됨 (프로비저닝 프로파일로 설치된 OS 지원 VPN 제외)
- 이러한 "버그"가 의도적으로 잘 배치된 것인지 의문이 들며, 대형 기술 기업이 정보 기관과 협력한다는 점을 고려할 때 Android의 많은 버그가 "우연히" 존재한다고 믿기 어려움