如何在氣隙網路中執行標註
對一款標註工具而言,'離線'必須意味著什麼;為什麼樣式表裡的一條 @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 會拒絕拉取。在一個隔離網路上建好資料集之後才發現許可限制,是一種代價高昂的知情方式。