如何在气隙网络中运行标注
对一款标注工具而言,'离线'必须意味着什么;为什么样式表里的一条 @import 能骗过大多数气隙审计;以及如何把模型送进一台没有对外通路的机器。
一款声称"可离线工作"的标注工具,通常只是指标注页面能渲染出来。这与"该部署不发出任何对外请求"并不是一回事,而隐私问题恰恰藏在这个落差里。 如果你要部署到安全研究环境、临床场景或政府网络中,以下就是需要核查的内容。
审计渲染后的页面,而不是源码
唯一可靠的测试是实测。打开标注界面,把开发者工具的网络面板过滤为第三方请求,然后计数。
只读模板是不够的,而这并非假想中的区别。Potato 自己的 styles.css 曾以一条指向 Google Fonts 的 @import 开头,它躲过了此前三次气隙审计,因为每道防护检查的都是模板中的 <script src> 与 <link href>——而样式表内部的 @import 两者都不是。
除了破坏离线可用性之外,它还会在每次页面加载时,把每位标注者的 IP 地址与 User-Agent 发送给第三方——而人们自托管这个工具,恰恰是为了让数据不离开自己的基础设施。
检查每一个页面,而不只是主页面
登录、注册、密码重置与错误页面被审计得最少,却最要紧。登录页上的一个第三方 favicon,就是在用户输入凭据的页面上向另一家公司的服务器发起请求。
Potato 现已在本地提供全部 14 个模板。实测结果:62 个请求,零外部请求。
哪些内容必须是本地的
每一份样式表、脚本、字体与图标。就 Potato 而言,这包括 Fabric.js、jQuery、Bootstrap、Font Awesome、界面字体、three.js、OpenSeadragon、d3、Peaks.js 与 PDF.js。
其中两项是必需的而非装饰性的:没有 jQuery,跨度标注无法工作;没有 Fabric.js,图像画布永远不会初始化,绘图工具虽然渲染出来了,却什么也画不了。一个能渲染、却悄无声息地无法标注的气隙部署,是最糟的结果,因为它看起来一切正常。
校验随源码提供的文件
这些文件是提交进仓库的,因此一次未经验证的下载会分发给该发行版的每一位用户。请逐一对照其 CDN 公布的哈希做校验,不匹配即拒绝。
请让防护允许列表保持为空,并让防护在某一条目不再匹配任何内容时失败。否则一项临时豁免会悄悄变成永久性的。
模型是一次单独的传输
应用本身不需要网络,与模型已经就位,并不是一回事。
# 在一台联网机器上
potato download-models --list
potato download-models mobile_sam
potato download-models grounding_dino_tiny
# 然后把模型目录拷贝到气隙机器上因此准确的说法是**"一旦权重就位于本机即可气隙运行"**,而不是"无需任何准备即可气隙运行"。你配置的任何托管 AI 端点显然需要对外通路,在这类部署中应当关闭。
传输之前先查许可
趁你还有浏览器的时候就查。download-models --list 会标出非商业用途的模型,并且在缺少 --accept-licence 时,download-models 会拒绝拉取。在一个隔离网络上建好数据集之后才发现许可限制,是一种代价高昂的知情方式。