왜 Mac의 네트워크 경계를 자동으로 지키는 앱을 만들었나
개인 개발자 Tetsuharu Fujiki (Lafine Systems Design)가 공공 Wi-Fi와 개발 서버의 노출 위험을 직접 조사한 기록.
시작은 패스트푸드점 Wi-Fi에 대한 사소한 궁금증이었다
어느 날 공공 Wi-Fi로 작업하다가 문득 "이 Wi-Fi에서 옆자리 사람에게 내 Mac이 어떻게 보일까?"라는 생각이 들어 조사를 시작했습니다.
“공공 Wi-Fi라도 클라이언트 격리(AP 격리)가 작동하면 다른 단말과 통신할 수 없으니 안전하다.” 오랫동안 그렇게 생각했지만, 조사해 보니 그 전제는 생각보다 허술했습니다. 클라이언트 격리는 모든 Wi-Fi에서 활성화되어 있는 것이 아닙니다. 활성화된 환경에서도 SANS Institute가 보고한 “AirSnitch”라는 기법으로 우회될 수 있습니다. Bonjour(mDNS)로 제 Mac이 평문으로 이런저런 정보를 알리고 있다는 것도 직접 dns-sd와 lsof를 실행해 보고서야 실감했습니다.
결론은 단순했습니다. 대책은 두 가지, 즉 “노출 면을 줄이는 것”과 “네트워크가 바뀔 때마다 사람이 직접 전환하지는 않는다”는 전제를 두는 것입니다. 카페에 도착할 때마다 설정을 다시 확인하는 사람은 거의 없습니다(저도 하지 않습니다). 그래서 신뢰할 수 있는 네트워크와 그 외의 네트워크를 자동으로 구분하고, 모르는 네트워크에서는 노출 면을 자동으로 좁히는 macOS 앱을 만들었습니다. 이것이 RoamSwitch의 시작입니다.
개발 서버도, 사실 같은 문제를 안고 있었다
공공 Wi-Fi를 조사하다가 개발 서버는 어떤지도 궁금해져서 파 보았습니다. “개발 서버는 localhost만 바라보니 외부에서는 안전하다”고 막연히 생각했는데, 실제로는 프레임워크마다 제각각이었고 직관에 반하는 기본값도 있었습니다.
next dev는 hostname을 지정하지 않으면 0.0.0.0에 바인드합니다. python -m http.server도 기본적으로 모든 인터페이스에 공개합니다. Vite는 기본값이 localhost이지만, 스마트폰 실기기로 확인하려고 --host를 붙여 본 적은 누구에게나 있을 것입니다. 그 부분을 노리는 CVE-2023-34092(경로 탐색, CVSS 7.5)도 있습니다. Docker의 -p에 이르러서는 호스트 측 방화벽 설정을 우회하여 0.0.0.0으로 공개되는 경우마저 있습니다.
이 또한 같은 결론이 되었습니다. 사람이 매번 기억해 내서 닫는 것보다, 신뢰할 수 없는 네트워크에 연결한 순간 외부로부터의 접근을 자동으로 막는 편이 현실적입니다. 실제로 RoamSwitch에서 가장 자주 보고되는 사용 방식 중 하나입니다. 열린 포트를 수동적으로 감사하여 위험을 보고하고, 등록되지 않은 네트워크에서는 커널의 패킷 필터로 외부 LAN으로부터의 접근을 차단합니다.
Lafine Systems Design / 개인 개발자
RoamSwitch의 방화벽 제어(pf/socketfilterfw), ARP 스푸핑 탐지, 권한 있는 헬퍼(XPC)는 실무 경험에 기반합니다. 외국계 IT 기업과 대형 전기 제조사 그룹에서 SE로 일했고, 독립 후에는 관공서, 대학, 연구기관을 대상으로 ASP 서비스를 제공해 왔습니다. 현재는 개인으로 “RoamSwitch”를 개발하며, 조사한 내용을 Zenn에 쓰고 있습니다.
검증 가능한 형태로 공개
- RoamSwitchKit (MIT 라이선스 오픈소스 SDK, GitHub)
- roamswitch-mcp (MCP 서버와 탐지 로직의 소스, GitHub, MIT)
- RoamSwitch 보안 설계 문서 (전체 장 공개)
- Zero Telemetry 외부 송신 통신 실측(1.4.7 시점. tcpdump + 프로세스 귀속, 재현 가능한 스크립트로 PASS. 현재 버전은 재측정 예정)
- 업데이트 이력 (GitHub·지속 배포)
- 기술적으로 조사한 내용은 Zenn에 기사로 공개
- 1인 개발로 보안 제품을 운영한 기록은 note에 (일본어)
- 영문 해설·에세이는 dev.to에
사업자명·소재지·결제 방법 등 법정 고지사항은 특정상거래법에 따른 표기를 참고해 주세요.