Android VPN와 앱 권한: 그 경고가 의미하는 것
Android의 VPN 동의 창은 패킷 상의 위치를 줄 뿐, 이메일이나 사진, 연락처에 대한 접근 권한을 주지 않습니다. 그 경계가 실제로 어디에 있는지 설명합니다.
Android의 두 대화상자는 늘 혼동됩니다. VPN 동의를 구하는 창과 앱이 사용자의 데이터를 위해 요청하는 권한 요청입니다. 전자가 넘겨주는 것은 네트워크상의 위치, 곧 패킷을 읽고 다시 쓸 수 있는 지점입니다. 후자가 넘겨주는 것은 Android가 앱마다 지켜 주는 저장된 콘텐츠입니다. 이 둘을 같은 것으로 취급하면 터널이 볼 수 있는 범위를 과장하거나, 집요한 앱이 다음에 무엇을 요구할지 크게 과소평가하게 됩니다.
동의 창이 실제로 넘겨주는 것
VpnService 를 구현하고 BIND_VPN_SERVICE 를 선언한 앱은 기기의 VPN이 되겠다고 시스템에 요청합니다. 승인되면 프레임워크가 tun 인터페이스를 만들고 그에 대한 파일 디스크립터를 앱에 넘깁니다. 이후 앱이 하는 모든 일은 그 디스크립터를 거칩니다. IP 패킷을 밖으로 읽어 내고, 어떻게 처리할지 결정하고, 패킷을 다시 안으로 씁니다.
그 인터페이스의 범위는 명시적입니다. 어떤 목적지가 잡히는지는 라우트가 정하고, 어떤 앱이 그것에 데이터를 넣는지는 addAllowedApplication 나 addDisallowedApplication 가 정합니다. 앱 두 개를 나열한 앱별 VPN은 기기의 나머지를 보지 못합니다.
이것은 패킷 수준의 부여이지 데이터 수준의 부여가 아닙니다. 서비스는 앱이 네트워크 스택에 넘기는 바이트를, 목적지로 주소가 지정된 채로 봅니다. 보내는 앱의 개인 저장소나 데이터베이스 파일, 복호화된 메모리에는 손을 대지 못합니다. 앱이 자기 샌드박스에 저장한 파일은 예전과 똑같이 읽기 어려운 상태로 남습니다.
패킷의 시야가 멈추는 곳
TLS는 터널 안에서도 제 역할을 합니다. 핸드셰이크가 앱과 서버 사이에서 일어나고, 앱과 VPN 사이에서 일어나는 것이 아니기 때문입니다. VPN은 세션 키 없이는 복호화할 수 없는 암호문을 전달합니다. 그래서 터널만으로는 HTTPS 페이지나 보호된 메일 세션의 내용이 드러나지 않습니다.
암호문 주변의 메타데이터는 다른 이야기이고, 바로 여기서 대부분의 자신만만한 주장이 무너집니다. 목적지 IP, 포트, 패킷 크기, 타이밍이 모두 보이며, TLS ClientHello 안의 서버 이름도 보입니다. 이 이름은 보통 TLS 1.3에서도 평문으로 전송됩니다. Encrypted Client Hello가 이를 바꾸지만 보편적이지는 않습니다. 평범한 DNS도 질의가 암호화되지 않은 채 나가면 이름을 똑같이 쉽게 흘립니다.
오래되었거나 잘못 설정된 프로토콜은 더 많은 것을 넘깁니다. 평문 HTTP, TLS 없는 IMAP, 그리고 여러 게임 및 IoT 프로토콜은 tun 디스크립터를 가진 무엇에게든 자신의 페이로드를 드러냅니다.
절대 함께 오지 않는 권한
VPN을 승인한다고 연락처, SMS, 사진, 미디어 저장소가 승인되는 것은 아닙니다. 그것들은 별개의 런타임 권한이며, 각각 고유의 대화상자와 앱 설정 페이지의 고유한 철회 경로를 지닙니다. 통화 기록을 원하는 VPN 클라이언트는 다른 어떤 앱처럼 그것을 요청해야 하며, 사용자는 터널을 유지한 채 거절할 수 있습니다.
주의할 것은 인증서 설치입니다. VPN 설정의 일부처럼 보이지만 그렇지 않습니다. 사용자 CA를 자격 증명 저장소에 설치하면 Android가 어떤 인증서를 받아들일지가 바뀌고, Android 7.0부터 API 24 이상을 대상으로 하는 앱은 네트워크 보안 설정에서 사용자 신뢰 앵커를 선택하지 않는 한 사용자가 추가한 CA를 무시합니다. CA를 고집하는 클라이언트는 정당한 기업 내 가로채기를 하고 있을 수도 있고, VPN 대화상자가 한 번도 언급하지 않은 무언가를 요구하고 있을 수도 있습니다.
접근성 접근은 훨씬 더 바깥에 있습니다. 접근성이 켜진 서비스는 다른 앱의 화면 내용을 읽을 수 있으며, 이는 어떤 패킷 수준의 위치로도 얻을 수 없습니다.
로컬 필터인가 원격 게이트웨이인가
같은 API가 서로 다른 신뢰 수준을 받을 자격이 있는 두 제품을 아우릅니다. 기기 안의 방화벽이나 광고 차단기는 tun 디스크립터를 받아 트래픽에 로컬로 응답하며, 자기가 운영하는 서버로는 결코 보내지 않습니다. 진짜 터널은 그 패킷을 다른 곳의 게이트웨이로 전달하고, 그 운영자는 반대편에서 같은 메타데이터를 보며 무엇이 돌아올지도 결정합니다.
둘을 구별하는 실용적인 방법은 VPN을 켠 상태와 끈 상태에서 공인 주소를 확인하고, 알림이 원격 엔드포인트를 지목하는지 보는 것입니다. 주소가 전혀 바뀌지 않는다면 트래픽은 아마 기기 안에서 되돌고 있을 것입니다.
두 경우 모두 여전히 패킷 위치입니다. 차이는 출구에 또 누가 서 있느냐입니다.
무엇을 승인했는지 점검하세요
설정을 열고, 이어서 네트워크 및 인터넷, 그다음 VPN을 열어 상태 표시줄의 아이콘이 아니라 항목을 읽으세요. 상시 VPN과 VPN 없이 연결 차단은 인터페이스를 살려 두고 유출을 끊는 기기 설정입니다. 무엇도 넓히지 않습니다. 같은 화면에서 프로필을 잊고 부여를 철회할 수 있습니다.
그다음 나머지 권한을 살펴보세요. 앱 정보는 클라이언트가 가진 런타임 부여를 보여 주고, 보안 설정은 같은 시점에 사용자 인증서가 설치되었는지를 보여 줍니다. 둘 중 어느 것이든 따로 제거할 수 있습니다.
답할 가치가 있는 질문은 좁습니다. 어떤 패킷이 이 서비스로 들어오고, 어디로 가며, 구현이 무엇을 보관하는가. 대화상자의 나머지는 소음입니다. VpnService 참조 문서가 인터페이스가 노출하는 것들의 권위 있는 목록입니다.