为什么我要打造一款自动守护 Mac 网络边界的应用
个人开发者 Tetsuharu Fujiki(Lafine Systems Design)亲自调查公共 Wi-Fi 与开发服务器暴露风险的记录。
起点是在快餐店 Wi-Fi 上的一个偶然疑问
有一天,在使用公共 Wi-Fi 工作时,突然好奇“在这个 Wi-Fi 下,邻座的人眼中我的 Mac 是什么样子?”,于是开始调查。
“只要公共 Wi-Fi 启用了客户端隔离(AP 隔离),就无法与其他设备通信,因而是安全的”——我长期以来都是这么认为的。但深入调查后发现,这个前提比想象中脆弱得多。客户端隔离本来就不是在所有 Wi-Fi 上都会启用,即使启用了,也可能被 SANS Institute 报告的一种名为“AirSnitch”的技术绕过。而自己的 Mac 通过 Bonjour(mDNS)以明文形式广播各种信息这件事,也是亲自执行 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 中最常被报告的使用场景之一:被动审计开放端口以报告风险,同时在未注册的网络下通过内核数据包过滤器阻止来自外部局域网的访问。
Lafine Systems Design / 个人开发者
RoamSwitch 的防火墙控制(pf/socketfilterfw)、ARP 欺骗检测、通过特权助手(XPC)实现的安全权限分离等技术基础,源自在外资 IT 企业、大型电子制造商集团担任系统工程师的经验,以及独立后为政府机关、大学、研究机构提供自有 ASP 服务过程中积累的操作系统与网络基础技术、运维自动化、故障处理、安全管理方面的知识。关注领域包括 Linux 底层、网络防御、机器学习、高速数据基础设施、系统设计等。目前作为个人开发者,一边投入 AI/机器学习领域,一边开发并提供用于自动化 Mac 网络安全的应用「RoamSwitch」。调查所得内容以技术文章的形式发布在 Zenn 上。
以可验证的形式公开
关于经营者名称、所在地、付款方式等法定信息,请参阅基于《特定商业交易法》的标示。