Wi-Fi 전환 후 SSID 방화벽 규칙이 필터링을 멈췄다
Android가 알 수 없는 네트워크 이름을 반환하면 SSID에 묶인 방화벽이 열린 채 실패한다. 식별과 적용을 분리하고 알 수 없는 상태에 자체 정책을 부여한다.
규칙은 단순했다. 사무실 Wi-Fi에 연결된 동안만 트래픽을 필터링한다. 몇 달 동안 유지되었는데, 어느 아침 휴대폰은 같은 SSID에 같은 자물쇠 아이콘을 띄운 채 필터링을 멈추고 있었다. 네트워크에는 아무 변화가 없었다. 바뀐 것은 앱이 네트워크 이름을 볼 수 있는지 여부였다. Android에서 «어느 Wi-Fi에 있는가»와 «이 트래픽을 차단할 것인가»는 별개의 작업이며, 둘을 혼동하는 방화벽은 이름을 읽을 수 없게 되는 바로 그 순간 열린 채 실패한다.
증상 — 식별이 사라지고 정책이 따라간다
SSID 규칙은 값을 읽고 분기를 고른다. 읽기가 쓸모 있는 값을 돌려주지 않으면 코드는 무언가를 해야 하고, 흔한 기본값은 «예상한 네트워크가 아니므로 필터링하지 않는다»이다. 이 기본값이 권한 문제를 트래픽 누출로 바꾼다. 자물쇠 아이콘은 VPN 서비스가 계속 돌고 있어 보이지만, 그저 다른 분기를 적용하고 있을 뿐이다.
네트워크가 아니라 사건의 순서를 보라. 권한 대화상자의 거부, SSID 접근을 다른 권한 뒤로 옮긴 시스템 업데이트, 위치 서비스 꺼짐, 업무 프로필 정책 변경은 모두 같은 액세스 포인트에 머문 채 같은 결과를 낼 수 있다.
이름이 알 수 없음으로 돌아오는 이유
WifiInfo.getSSID()는 현재 네트워크의 서비스 세트 식별자를 반환하며, Android는 위치에 민감한 필드의 접근이 권한에 달려 있다고 문서화한다. 접근이 없을 때 이 호출은 크게 실패하지 않고 UNKNOWN_SSID을 반환한다. 그래서 비어 있거나 알 수 없는 값은 기기가 Wi-Fi를 떠났다는 증거가 아니라 앱이 네트워크를 분류할 수 없다는 증거다.
두 가지 확인이 경우를 나눈다. 기기가 연결되어 있는지 확인하고 시스템이 무엇을 보고하는지 본 다음, 이 Android 버전에서 앱이 필요한 권한을 실제로 가지고 있는지 확인한다.
adb shell cmd wifi status
adb shell dumpsys package <your.app> | grep -i -E "ACCESS_FINE_LOCATION|NEARBY_WIFI_DEVICES"
상태 줄이 연결된 네트워크를 보여 주는데 앱이 알 수 없는 이름을 본다면, 그것은 권한이나 API 수준의 문제이지 Wi-Fi 문제가 아니다. 방화벽 규칙을 건드리기 전에 고쳐야 한다. 이후의 모든 규칙은 앱이 읽을 수 없는 값에 대해 평가되기 때문이다.
필터링이 실제로 도는 곳
로컬 Android 방화벽은 보통 트래픽을 원격 서버로 보내지 않고 VpnService 모델을 쓴다. 가상 인터페이스를 받아 자체 규칙을 적용하고 허용한 것을 전달한다. 플랫폼은 사용자 프로필당 하나의 활성 VPN 서비스만 허용하며, 두 번째는 첫 번째 위에 쌓이지 않고 그것을 대체한다. 따라서 별도의 방화벽 앱과 별도의 업무 VPN은 두 단계 사슬을 만들지 않는다. 둘 중 하나가 이긴다.
이것이 SSID 규칙에 중요한 이유는 적용 지점과 관찰 지점이 서로 다른 구성 요소이기 때문이다. VpnService는 기기에서 무엇이 나가는지 결정하고, Wi-Fi API는 라벨만 제공한다. 앱은 올바르게 적용하면서 잘못 분류할 수 있고, 그것이 바로 이 글의 고장이다.
알 수 없는 상태에 자체 정책을 준다
네트워크 식별을 세 가지 상태로 다루고, 규칙을 내보내기 전에 각각의 정책을 적어 둔다. 잊히는 것은 세 번째 상태이며, 공격자나 잘못된 설정이 당신을 그곳에 둔다.
| Observation | Policy to specify |
|---|---|
| Expected SSID is readable | The explicit filtering policy you designed |
| A different SSID is readable | The default policy for untrusted networks |
| Unknown, changing or unreadable | Fail closed until classification is reliable |
닫힌 실패란 알 수 없는 상태가 가장 편리한 정책이 아니라 가장 엄격한 합리적 정책을 물려받는다는 뜻이다. 그것 때문에 새 네트워크에서 휴대폰을 쓸 수 없다면, 올바른 해법은 의도적이고 눈에 보이는 예외이지 빈 값 검사에 숨은 조용한 신뢰 결정이 아니다.
낯익은 SSID는 라벨이며 네트워크 사업자의 증거가 아니다. 누구나 사무실 이름으로 액세스 포인트를 세울 수 있으므로, 이름 일치가 민감한 세션과 신뢰할 수 없는 구간 사이의 유일한 것이어서는 안 된다.
정상 상태가 아니라 전환을 시험한다
정상 상태 시험은 규칙을 세운 네트워크에서 통과한다. 고장은 전환에 산다. 권한 거부, Wi-Fi에서 셀룰러로, 한 SSID에서 다른 SSID로, VPN 서비스 재시작, 다른 VPN 앱이 인터페이스를 가져가는 경우다. 각각에 대해 기존 연결을 다시 검토하는지, 상태가 알 수 없는 동안 보호된 트래픽이 계속 차단되는지 결정한다.
결과를 세 문장으로 적는다. 관찰된 조건, 결정을 적용하는 구성 요소, 의도한 대체 동작이다. 셋 중 하나라도 빠지면 그 규칙은 아직 정책이 아니다. 사무실 네트워크에서 우연히 동작하는 추측일 뿐이다.