휴대폰 앱과 원격 서버는 서로 다른 사실에서 출발하며, 어느 쪽도 상대의 사실을 빌릴 수 없습니다. 앱은 자기가 쓰는 네트워크에 대해 운영체제에 물을 수 있지만, 서버는 연결 위로 도착한 것만 압니다. 자기 엔드포인트를 운영하면 두 번째는 다시 쓰이지만 첫 번째는 그대로입니다. 둘 중 어느 쪽이 질문에 답하는지는 질문 자체가 정합니다.

두 관측 지점, 두 종류의 증거

로컬 증거는 기기를 설명합니다. 트래픽을 나르는 인터페이스, 플랫폼이 보고하는 전송 방식, 호출한 앱이 조회할 수 있는 범위를 포함합니다. 원격 증거는 연결을 설명합니다. 출발지 주소, 프로토콜, 시각, 그리고 앱이 보내기로 정한 모든 것입니다. 어떤 관측 지점도 다른 쪽의 상위집합이 아닙니다.

둘을 섞으면 정밀하게 들리지만 검증할 수 없는 주장이 나옵니다. 표식은 기기 위의 네트워크 객체에 대해 증명할 뿐, 원격 서비스가 요청을 어떻게 분류하는지는 증명하지 않습니다.

탐지를 논하기 전에 질문이 어느 지점에 관한 것인지 적으십시오. 특정 앱이 터널이 활성인지 알 수 있는가 하는 질문과, 서비스가 요청이 어디서 왔는지 추론할 수 있는가 하는 질문은 다릅니다. 별개의 조사이며, 한쪽의 답은 다른 쪽에 대해 아무것도 말하지 않습니다.

로컬 플랫폼 인터페이스가 보고할 수 있는 것

Android는 특정 표식을 제공합니다. NetworkCapabilities 객체는 TRANSPORT_VPN 를 보고할 수 있고, hasTransport 는 그 전송 방식이 객체에 있는지 검사합니다. 앱은 연결성 서비스에서 객체를 받아 읽으며, 네트워크 상태 권한의 범위 안에서 이루어집니다.

결과는 로컬 플랫폼 정보이며, 제공자의 주소 범위를 조회하는 것이 아닙니다. 호출한 앱이 쓰는 네트워크를 설명합니다.

두 가지 한계가 중요합니다. 앱을 제외하는 분할 터널 규칙이 있으면 같은 휴대폰에서도 동료가 보는 것과 다른 답이 나올 수 있습니다. 앱이 다른 곳에 묶여 있을 수 있기 때문입니다. 표식은 운영체제가 VPN 인터페이스를 모델링하기 때문에 존재하며, 특정 앱이 그것을 수집해서가 아닙니다. 앱이 이 필드를 읽는지, 전달하는지, 무시하는지는 그 앱의 속성입니다. 그 앱의 매니페스트와 문서만이 이 질문에 대한 믿을 만한 출처입니다.

adb shell dumpsys connectivity | grep -i -m5 vpn

원격 서비스가 볼 수 있는 것

서버는 연결의 출발지 주소, 전송 방식, 시각을 보고, 주소를 등록 정보나 라우팅 데이터로 보강할 수 있습니다. 앱이 보내는 모든 것도 받을 수 있으며, 앱이 요청하고 사용자가 동의한 경우의 위치도 포함합니다. 이 경로들은 별개이고, 주소 조회와 비슷한 것은 하나뿐입니다.

호스팅 제공자에게 등록된 주소는 터널을 시사하고, 주거용 네트워크에 등록된 주소는 가정 연결을 시사합니다. 둘 다 통계적 단서이며 기기에 대한 사실이 아닙니다.

주거용 주소는 그 사람을 그 주소에 두지 않으며, 호스팅 주소는 운영자나 국가를 지목하지 않습니다. 추론을 확실성으로 다루는 서비스는 때때로 탐지하지 못한 채 틀릴 것입니다. 요구가 경험칙이 아니라 신뢰성이라면 주소 데이터로는 제공할 수 없고, 그렇게 밝히는 설계가 추측을 숨기는 설계보다 정직합니다.

증거무엇에 답하는가무엇을 보여줄 수 없는가
로컬 전송 표식이 네트워크 객체가 VPN인지누가 출구를 운영하는지, 기기가 어디 있는지
원격 출발지 주소어느 주소가 서비스에 도달했는지기기가 터널도 함께 지니는지
애플리케이션 페이로드앱이 무엇을 보내기로 했는지앱이 보내지 않은 모든 것

자가 호스팅 출구가 한쪽만 바꾸는 이유

자기 엔드포인트를 운영하면 원격 서비스가 보는 출발지 주소가 바뀌고, 그것이 그 서비스가 상용 제공자와 연결짓는 범위 밖으로 옮겨질 수 있습니다. 로컬 네트워크 모델에서는 아무것도 바뀌지 않습니다. 터널은 터널로 남고 운영체제는 여전히 그것을 보고하기 때문입니다.

증거의 한쪽은 움직이고 다른 쪽은 고정되어 있습니다. 그 사이의 틈이 기대가 깨지는 자리입니다.

브라우저는 자체 인터페이스와 제약을 지닌 세 번째 사례입니다. 웹 콘텐츠는 네이티브 기능 객체를 읽을 수 없고, 모바일 운영체제의 기능을 웹 페이지가 쓸 수 있다고 다루는 것은 범주 오류입니다. 질문이 웹사이트에 관한 것이라면 플랫폼 API를 그대로 옮기는 대신 웹사이트가 실제로 무엇을 얻을 수 있는지 살피십시오.

던진 질문으로 정하십시오

특정 앱이 터널 상태를 관측할 수 있는가 하는 질문이라면 플랫폼 인터페이스가 맞는 곳이며, 답은 그 앱의 코드와 권한에 있습니다. 서비스가 무엇을 추론할 수 있는가 하는 질문이라면 연결 메타데이터가 증거입니다. 법적이거나 계약상의 질문은 둘 다 해결하지 못합니다.

무엇이든 모으기 전에 질문을 한 문장으로 이름 붙이십시오. 그 문장이 어느 관측 지점이 중요한지를 정하고, 조사가 다른 논쟁으로 흘러가는 것을 막습니다.

보고할 때 각 관측에 출처를 표시하십시오. 표시 없는 주장은 검토할 수 없습니다. 로컬 표식과 주소 추론은 둘 다 유용하고 어느 쪽도 결정적이지 않으므로, 둘을 하나의 판단으로 합치는 것은 잘못입니다.

서비스가 승인된 연결을 거부하면 신호를 숨기려고 로컬 설정을 바꾸는 대신 그 서비스가 지원하는 재검토 경로를 이용하십시오. 관측 하나를 없애도 나머지가 사라졌다는 증명은 되지 않습니다.

관련 글