返回
2026/10/27
因應 Tailworm:在不影響正式環境的前提下強化我們的 Tailscale 網路
我們如何對照 Tailworm 的發現檢查自己的 Tailscale 網路,移除 Tailscale SSH 暴露面,同時讓所有正式環境作業持續運作。
摘要
2026 年 10 月 25 日,一位資安研究人員發布了「Tailworm」:針對 Tailscale 與 headscale 的 11 項發現,且未經協調揭露(coordinated disclosure)。截至撰文時,Tailscale 尚未發布修正。當天晚上,我們便對照每一項發現檢查了自己的 Tailscale 網路。我們移除了唯一一項與我們相關的暴露面,收緊了存取權限,期間所有正式環境作業都持續運作。
本文說明我們檢查了什麼、變更了什麼、如何避免服務中斷,以及我們學到了什麼。本文並非對該報告的獨立驗證。
Tailworm 報告內容簡述
這 11 項發現大致可分為以下幾類:
- Tailscale SSH(最嚴重)。經授權的 SSH 工作階段可以提權為目標機器上的 root。在研究人員的實驗環境中,攻擊隨後在機器之間擴散。
- App connectors。未驗證目的地(destination)。
- 記憶體耗盡,發生在控制伺服器與用戶端。
- Serve 與 Funnel 的邊界情況。
每一項發現都需要攻擊者事先已有立足點,沒有任何一項是可直接從網際網路發動的遠端攻擊。部分資安從業人員認為報告的說法誇大了風險,但主要的暴露面 Tailscale SSH 確實存在,而且很容易移除。
步驟 1:先檢查,再變更
我們從唯讀檢查開始,並在變更任何東西之前記錄結果:
- 使用中的 Tailscale 用戶端版本
- 實際啟用了哪些功能
- 60 天的 SSH 工作階段記錄,查看誰從哪裡連線,以及是否有人使用連接埠或通訊端轉送
- 裝置清單,包括數個月未上線的裝置
檢查結果:
- 我們的部分環境啟用了 Tailscale SSH,因此發現 F1–F3 與 F5 與我們相關。
- 其他發現所依賴的功能我們並未使用,因此大多數不適用。
- SSH 記錄中沒有預期外的來源,也沒有轉送請求。
步驟 2:在不中斷服務的情況下移除暴露面
最直接的做法是關閉 Tailscale SSH,改用標準的 OpenSSH 金鑰驗證。但事前檢查發現了一個陷阱。
Tailscale SSH 是以 tailnet 身分進行驗證,而不是 SSH 金鑰。我們的自動化指令碼在命令列中指定了一把 SSH 金鑰,但該金鑰受密語保護,根本不可能在無人值守的情況下運作。這些作業之所以能執行,只是因為 Tailscale SSH 從不檢查金鑰。如果我們直接關閉 Tailscale SSH,所有自動化作業都會停擺。
因此,我們依照以下順序進行切換:
- 建立自動化專用金鑰,僅允許來自單一來源機器,並停用轉送。
- 在切換前測試新路徑。我們開啟一個僅能從 tailnet 內部連線的暫時 OpenSSH 連接埠,並在與作業執行環境相同的條件下(無 SSH 代理程式、無終端機),以指令碼呼叫 SSH 的每一種方式進行連線。
- 執行反向測試。確認新金鑰在允許的來源之外會被拒絕,轉送請求也會被拒絕。
- 先設定好自動復原。在關閉 Tailscale SSH 之前,我們排定了一個計時器,時間一到會自動重新啟用它。這條復原路徑不依賴 SSH 是否正常。
- 切換後,以新連線逐一檢查所有自動化作業。每個作業都實際完成了一次執行。我們不把已開啟的工作階段當作證明。
- 移除暫時性設定——額外的連接埠、防火牆規則和復原計時器——並再次驗證。
步驟 3:收緊其餘部分
- 清空 Tailscale SSH 原則。預設原則允許使用者從自己的任何裝置對自己的其他裝置開啟 SSH 工作階段(包括以 root 身分),只需每週在瀏覽器中重新核准一次。我們清空了該原則,因此即使不小心重新啟用 Tailscale SSH,也不會再授予存取權。
- 關閉來自網際網路的 SSH。關閉之前,我們確認了頻外(out-of-band)主控台登入可用,以免把自己鎖在外面。之後我們從外部網路驗證 SSH 已不再回應。
- 要求裝置核准。新裝置必須經管理員核准才能加入。
- 檢查註冊金鑰。沒有需要撤銷的金鑰。
- 確認管理員帳戶已啟用 MFA。任何接管管理員登入的人都能撤銷網路層級的控制措施。
- 開始觀察裝置之間的實際流量,讓下一步——縮小哪些裝置可以存取哪些服務——是根據證據而非猜測。
Tailnet Lock 與裝置核准都能防止惡意裝置加入,但兩者無法同時使用,請審慎地擇一。
步驟 4:不只修正伺服器,也要修正作業手冊
我們舊的復原程序要求在啟用 Tailscale SSH 的情況下重新連接伺服器。若在這次變更後照做,就會在不知不覺中讓這項有風險的功能重新回來。我們重寫了程序:
- 先診斷。是網路連線中斷,還是 SSH 本身(金鑰、設定、防火牆)出了問題?兩者的修正方式不同。
- 重新連線時不變更設定。不加任何額外參數,重新連線前先儲存節點設定,連線後再比對。
- 緊急存取只在計時器控制下開放。先取得核准,開放前排定自動關閉,限制來源,並同時檢查 IPv4 與 IPv6。
- 即使在緊急情況下也不重新啟用 Tailscale SSH。它所需的存取原則變更無法自動復原。
我們學到的事
- 移除安全功能之前,先弄清楚它實際驗證的是什麼。我們指令碼中指定的金鑰從未被使用過。
- 測試你要轉移過去的那條路徑本身,在作業實際執行的相同環境中,於切換之前完成。
- 設定一個不依賴變更對象的復原機制。用計時器,而不是「我們再 SSH 進去修就好」。
- 關門之前,先確認復原用的存取途徑。我們在關閉來自網際網路的 SSH 之前,先確認了主控台存取。
- 在同一次變更中更新作業手冊。過時的復原步驟可能在幾個月後撤銷一項安全修正。
- 閱讀預設原則。「允許自己的裝置互相存取,包括 root」正是我們一開始的預設設定。
- 將「變更成功」與「弱點已解決」區分開來。我們已不再受 Tailscale SSH 相關發現影響,但在上游修正發布之前,Tailworm 整體仍未解決。修正發布後我們會更新用戶端。
- 先量測,再收緊。先掌握觀察到的流量與實際相依性清單,再訂定更嚴格的存取規則,強化措施才不會影響業務。
下一步
我們正依據觀察到的流量,將裝置之間的網路存取縮小到每項服務所需的最小範圍。Tailscale 的修正一旦發布,我們會立即安裝。
參考資料:Tailworm 報告(tailworm.com)以及 Tailscale 關於 Tailnet Lock 的文件。
Global
Japan
Korea
China
Vietnam
Thailand
Indonesia
Portugal
Spain
France
Germany
Egypt
Russia