Lobsters

Tor VPN Beta: What we've learned building our own VPN for Android from scratch

Tor VPN 베타: 안드로이드용 VPN을 처음부터 만들며 배운 것

Tor Project가 안드로이드용 Tor VPN 베타 개발 과정에서 배운 점과 다음 과제를 정리했습니다. 앱마다 별도의 Tor 회로를 할당하고 검열 우회에 초점을 맞췄으며, 브리지 지원과 안정성, F-Droid 배포를 개선하고 있습니다.

에디터 노트

앱마다 Tor 회로를 분리하는 설계와 검열 우회에 맞춘 브리지 개선은 Tor VPN의 목적에 잘 맞습니다. 다만 이 글은 Tor 회로와 앱 간 추적 방지를 설명할 뿐, 안드로이드의 VPN 처리 과정에서 생길 수 있는 트래픽 누출은 다루지 않습니다. Lobsters 댓글은 DNS 조회와 연결 확인 요청이 VPN을 우회할 수 있다고 주장하고 adb 명령을 제시합니다. 다른 댓글은 GrapheneOS가 여러 문제를 수정했거나 대응했다고 반박하지만, 구체적으로 무엇이 해결됐는지를 두고 질문이 이어집니다. 이는 Tor 앱의 설계와 안드로이드 운영체제의 VPN 동작을 구분해야 하는 쟁점입니다. 댓글의 기술적 주장은 본문에서 검증하지 않으므로 Tor Project의 설명만으로 기기 전체의 누출 여부까지 판단할 근거는 없습니다.

AI 요약

Tor Project는 브라우저 밖의 앱에서도 Tor의 개인정보 보호 기능을 쓰고 싶다는 사용자 요구를 바탕으로 2021년 Tor VPN 구상을 시작했습니다. 안드로이드용 베타를 제한적으로 공개한 뒤 실제 주된 사용 목적이 검열 우회임을 확인했고, 이후 개발과 사용자 지원의 우선순위를 이에 맞췄습니다.

앱마다 분리되는 Tor 연결

일반 VPN처럼 기기 전체가 하나의 터널을 공유하는 방식과 달리, Tor VPN은 각 앱에 별도의 Tor 회로를 할당합니다. 앱 사이 활동이 서로 연결되기 어렵도록 설계한 것으로, Tor Browser의 교차 사이트 추적 방지 방식에서 영향을 받았습니다. 앱 목록을 검색해 특정 앱의 Tor 연결 여부를 빠르게 정하는 기능도 추가했습니다.

검열 우회에 맞춘 사용 흐름

개발팀은 처음에 사용자가 출구 노드 위치를 직접 고르는 기능을 검토했습니다. 하지만 사용성 테스트에서 검열을 피하려는 사용자가 브리지 대신 출구 위치를 고르는 혼란이 나타났습니다. Tor의 작동 방식과 사용자의 예상이 달랐기 때문입니다. 현재는 Tor 네트워크에 먼저 연결한 뒤 출구를 선택하도록 했습니다. 출구 선택 기능을 더 발전시키려 하지만, 위험이 큰 상황에서 사용자의 실수를 유발하지 않는 방식이어야 한다고 설명합니다.

초기 사용자는 이란과 투르크메니스탄 등 검열이 강한 지역에서 많이 나타났습니다. Tor Browser 안드로이드판의 사용자층이 주로 글로벌 노스에 치우친 것과 달리, Tor VPN은 네트워크 제한을 일상적으로 겪는 글로벌 사우스 사용자의 참여가 두드러졌다고 Tor Project는 전합니다. 이에 따라 1.4.0 베타에서 WebTunnel 브리지를 우선 지원했습니다. WebTunnel은 Tor 트래픽을 일반적인 암호화 웹 트래픽처럼 보이게 해 검열 장비가 연결을 찾아 차단하기 어렵게 합니다. 브리지 지원의 안정성을 높이는 버그 수정과 사용성 개선도 진행했습니다.

Arti와 배포 기반 정비

Tor VPN은 Rust로 작성한 차세대 Tor 구현체 Arti를 기반으로 합니다. Tor Project는 초기 릴리스 이후 충돌을 줄이고 다양한 네트워크 환경에서 더 안정적으로 동작하도록 손봤다고 밝혔습니다. 소스 코드와 배포 바이너리가 일치하는지 검증하도록 재현 가능한 빌드를 마련했고, Google Play를 거치지 않고 설치와 업데이트를 받을 수 있도록 F-Droid에도 앱을 올렸습니다.

Tor VPN은 속도에 최적화된 상용 VPN과 같은 방식으로 동작하지 않습니다. Arti에는 Tor의 C 구현에 있는 혼잡 제어 같은 성능 기능이 아직 들어오지 않았으며, 이를 모바일 환경에 적용하는 작업이 다음 과제입니다. Tor Project는 Arti와 Onionmasq를 중심으로 모듈형 모바일 Tor 기반을 만들고 있으며, 구성 요소를 여러 앱에서 재사용해 생태계의 파편화와 장기 유지보수 부담을 줄이려 한다고 설명합니다. Guardian Project와 LEAP Encryption Access Project의 지원도 개발 과정에서 언급했습니다.

Lobsters 반응

  • @noirscape — 안드로이드에서 VPN을 쓰는 사람에게 안드로이드 VPN 구현이 누출을 일으키거나 안전하지 않을 수 있다는 점을 경고할 필요가 있습니다. 위험한 환경에 놓인 사람과 억압적인 정권 아래 사는 사람을 돕는 것이 Tor의 목적이라면, 이런 문제는 일반 VPN보다 훨씬 큰 장애물입니다. 특히 VPN이 비활성 상태일 때 C의 getaddrinfo 함수가 킬 스위치 설정을 무시하고 VPN을 우회해 DNS 조회를 합니다. 해당 안드로이드 이슈 추적을 보면 Google은 이 버그를 고치지 않은 것 같습니다. 기기가 네트워크에 연결됐는지 확인하는 요청도 VPN을 우회하며, Google은 이를 보안 버그로 보지 않습니다. adb 명령으로만 고치거나 우회할 수 있습니다. 올해 초에는 system_server에 구성한 UDP 패킷을 처리하게 해 IP 주소를 누출할 수 있다는 사실도 발견됐습니다. Google은 이것도 보안 버그로 보지 않았고, 역시 adb 명령으로 완화할 수 있습니다. 이런 안드로이드 VPN 서비스 문제는 이상하리만큼 오래 반복됩니다. 제대로 익명성을 지키려는 사람에게 안드로이드에서 Tor를 쓰라고 권하지 않겠습니다.
    • @downrightnifty — 제가 알기로 GrapheneOS는 이런 문제를 막으려 하고 있습니다. 말씀하신 문제는 모두 수정됐거나 대응됐습니다. 연결 확인 우회 문제는 문제가 아니라고 판단했는데, 그 판단에 동의합니다. 걱정된다면 GrapheneOS에서 연결 확인을 끌 수도 있습니다. VPN 누출 문제가 여전히 남아 있다는 점은 인정합니다. 다만 악성 앱이 있어야 생기는 누출일 가능성이 높다고 봅니다. 무작위로 발생하는 누출보다는 덜 우려스럽습니다.
    • @strugee — GrapheneOS에서 이런 문제 가운데 몇 가지나 해결됐는지 궁금합니다.
    • @beto — adb로 이 문제들을 어떻게 완화하나요?
    • @noirscape — 두 블로그 게시물에 모두 나옵니다. 이 명령으로 연결 확인을 끌 수 있습니다: adb shell settings put global captive_portal_mode 0. 단, Wi-Fi 핫스팟에 연결할 때 인증 창이 표시되지 않습니다. 이 명령은 Tiny UDP Cannon을 완화해야 합니다: adb shell device_config put tethering close_quic_connection -1.

원문: Tor Project / 번역·요약: Trawling