過去一年來,@pewdiepie 逐漸成為私人自托管運算最引人注目的倡導者之一,看著這個過程,真的令人十分欣慰。
2025 年底,這一切還只是個有趣的實驗:一台搭載改裝 GPU 的家用設備,跑著開源模型、聊天機器人以「委員會」方式投票、閒置算力捐給蛋白質折疊研究;經過大約十二個月,它成熟為一個目標明確的計畫。
2026 年 5 月 31 日,它以 Odysseus 之名問世——一個免費、開源、自托管的 AI 工作空間,創作者直言這是對訂閱制的一次反擊:本地優先、隱私優先、無遙測、你的資料留在你自己的硬體上,而非流向少數大型企業。
以他這樣的影響力,能將本地推理推廣給主流、非技術的受眾,正是隱私領域多年來渴望的事,我全力支持。
而我同時也是那個在測試自己授權部署時,發現只需點一下就能控制其中一台伺服器的人。這兩件事並不矛盾。像這樣野心勃勃、快速推出、處於全新領域的軟體,正是有趣安全漏洞的溫床,而及早發現它們,才能讓專案在日後值得信賴。
所以,本著協助的精神,以下是完整的攻擊鏈——從基礎開始解釋——以及它對我們正在建造的這個時代所傳達的意義。
一扇沒有鎖的門,一個看似無害的埠口
Odysseus 可以將繁重任務委派給遠端 GPU 機器,透過 SSH(一台電腦在另一台上執行命令的標準方式)連接。
因此,它內部有幾個端點被允許接觸命令 shell——那個原始的命令行,只要你能碰到它,就能讓機器做幾乎任何事。
合理的是,幾乎每個端點都會先檢查呼叫者是否為管理員。
例外是一個安靜的小端點,它的任務是列出遠端伺服器上安裝了哪些 Python 套件,而這個例外就是一切崩壞的起點。
第一個問題是,這個端點從未接收到識別呼叫者所需的資訊,因此它根本不做管理員檢查,而且原則上無法做到。
擋在它前面的,只有應用程式的一條通用規則——你必須登入——這表示任何帳號(包括陌生人一分鐘前剛註冊的)都可以碰觸到一個 shell 相關的門,而這個門的所有兄弟端點都小心翼翼地守衛著。

結構性根本原因:一個無法識別呼叫者的處理程序,就無法強制誰能存取,如下所示。

光這樣或許還能撐住,但這個端點在執行實際工作時還有第二個問題,這也是整起攻擊的核心。
為了找出遠端機器安裝了哪些套件,程式會將一條指令寫成一行純文字,然後將這行文字交給系統中一個叫做 shell 的部分,shell 的任務就是讀取並執行這行指令。
把 shell 想像成一個完全按字面遵循書面指令的助手,而幾個標點符號具有特殊意義。
這裡重要的是分號,shell 會把它解讀為「那條指令結束了,現在執行下一件事」,所以一行含有分號的文字,會被當作連續的幾條命令來執行。


正因如此,謹慎的程式會把任何人輸入的內容用引號包起來,再交給 shell——這是告訴 shell 將那些字元視為普通文字、沒有執行命令的權力。
開發者正確地處理了伺服器名稱和要發送的指令,所以那些輸入是安全的。
但埠號卻被直接丟進那行文字,沒有加上引號,基於一個看似合理的假設:埠號永遠只是數字,數字不會造成任何傷害。(虛擬環境路徑也以同樣未加引號的方式拼接,原因相同。)
這個假設的漏洞在於:埠號不一定要是數字。它是以純文字形式從網址中直接取出,而發出請求的人可以決定它寫什麼。
所以,攻擊者不寫 22,而是寫 22; id; hostname #。
shell 讀取第一部分,嘗試連接並無害地失敗,然後遇到第一個分號,便乖乖執行攻擊者自己的兩條命令,而結尾的 # 則告訴 shell 忽略後面本應接續的殘留文字。

一個分號就把「列出遠端盒子上的套件」變成了「在這盒子上執行我的命令」。
要觸發它,只需要一個已登入的會話和一個精心構造的網址:

請求返回 HTTP 200 以及正常的套件 JSON——同時注入的命令在伺服器端執行。
我偷偷插入的命令是無害的探測,當它們的輸出回傳,顯示出伺服器自身的服務帳號名稱時,就確認了我的指令確實在機器上執行。

把這兩個缺陷放在一起,本地端的情況可以用一句話概括——任何已登入的使用者都可以在伺服器上執行自己選擇的命令。
而風險規模的加劇,恰恰來自讓 Odysseus 令人興奮的那個特點。
如果一個擁有上億訂閱者的創作者,成功將大量非技術受眾引導至自托管,結果就是數千個相似的實例、以相似方式配置、以相似方式暴露——這就是單一文化,而單一文化正是電腦蠕蟲的最愛。
@ashnichrist 說得很好。
把它變成只需一鍵
一個「任何已登入使用者」都能觸發的漏洞,聽起來仍然像需要一個惡意內部人員;而下一步就是要消除這個條件,因為它讓受害者的瀏覽器自己執行攻擊。
這個技術稱為跨站請求偽造,它利用的是瀏覽器一個低調的習慣。
一旦你登入一個網站,你的瀏覽器就會儲存一個小令牌,然後自動將其附加到發往該網站的請求中——僅根據請求的目的地,完全不看是哪個頁面發起的。

Odysseus 將令牌設為 SameSite=Lax 政策,這是合理的預設值,可以阻止令牌在隱蔽的背景請求中跟著出去——但故意仍允許在頂層導航時發送,也就是說,一個普通的點擊會讓你的整個分頁跳轉到某處。
由於這個弱端點回應的是一個單純的連結,它不檢查請求從哪裡來,也不使用反偽造令牌,攻擊者只需託管一個頁面,上面放一個誘人的按鈕。
在示範中,我正是做了這樣一個頁面——一個歡樂、兒童友善,而且最重要的是,忠於原作設定的 CoComelon 致敬頁面——童謠風格的顏色、Comic Sans 字體、一個大大的「播放」按鈕。

這個按鈕並不是通往一首歌的連結。它的點擊處理程序會在一個小小的、用完即丟的彈出視窗中打開真正的目標,這樣惡意請求就會以頂層導航的方式發生——攜帶著 SameSite=Lax 的 session cookie——卻不會搶走注意力,然後一瞬間後自動關閉。它打開的網址就是那個套件端點,並把指令藏在「埠號」中:

在那一次點擊落地的同時,誘餌頁面則為鏡頭上演了一場秀:CoComelon 的藝術圖像像槍口閃光一樣在螢幕上閃爍,一個終端機自動打字,敘述著接管過程的每一步。(終端機文字是為了示範而設計的劇本;真正的執行是彈出視窗剛剛做出的無聲請求。)

為了讓影響更具體,那一次點擊做了三件事:它改寫了提供給使用者的介面,造成明顯的視覺破壞(一個全螢幕的「🍉 你的 Odysseus 已被 CoComelon 化 🍉」疊加層、西瓜圖示、重新命名的應用程式);它讀取了服務使用者能讀取的一切;而最持久的是——它直接在應用程式的 auth.json 中寫入了一個隱藏的管理員帳號。

重點是:重新啟動會清理掉明顯的亂象,但攻擊者的帳號仍然保留。
這裡有一個現場示範。
為什麼這是代理工具中最糟的一類漏洞
2026 年,單一實例被入侵之所以應該讓你擔心,是因為這些事情很少止於一個實例,而定義了這一年的一種蠕蟲證明了原因。
Shai-Hulud,這個最早於 2025 年 9 月出現、之後又更大規模回歸的自我傳播 npm 蠕蟲,執行著一個極其簡單的迴圈——一個惡意的安裝時腳本會在某個套件被安裝的瞬間執行,掃描機器上的機密(如 npm 和 GitHub 令牌、SSH 金鑰、雲端憑證),然後用這些偷來的憑證發布受害者的其他套件被植入後門的版本,這樣每個新的安裝都成為下一個發起點,攻擊者不需再費力。
值得借鏡的教訓是:蠕蟲最難的工作就是收集憑證並找到通往下一台機器的路。
一個代理型 AI 助手,會白白把
兩者
都送給蠕蟲,因為持有強大的機密並連接到其他機器,正是它的全部目的。
針對 Odysseus 的一次點擊所獲得的遠不止程式碼執行權。它取得了一個預先蒐集好的寶庫——儲存的 API 金鑰、資料庫、設定檔,以及該工具用來登入它所管理的遠端 GPU 伺服器的 SSH 存取權。這正是自我傳播攻擊所需的燃料,就放在一個地方,標籤朝外,而使用它的劇本已經在現實世界中存在。

這一切意味著什麼
最讓我震驚的是,真正拿下伺服器的漏洞其實很古老。命令注入和請求偽造都有教科書式的修復方法,一個 2005 年的開發者就能認出來,而它們卻出現在當今最前瞻的消費级 AI 軟體之中——這也是今年整個產業的模式:頭條新聞中的 AI 漏洞,到頭來都是陳舊的缺陷,躲在光鮮亮麗的新工具裡。
前沿科技完全保留了那些基本原則,然後在它們之上疊加了強大、快速、經常被過度信任的一層,並將那一層連接到你擁有的一切。

尚未接線的門鈴
還有一個細節值得學習,因為它與程式碼的關係最小。
當我最初要報告這個問題時,儲存庫中已經有一份安全政策——一份考慮周全的政策,包含了合理的部署指引。
但它的報告章節指引潛在的報告者「如果可用,請使用 GitHub 安全公告」,而最初這個私人通道根本沒有開啟。
一個陌生人能找到的關於這個專案最敏感的資訊,卻沒有私人管道可以送達。這個缺口後來已經補上——命令注入鏈現在被追蹤為一個重大公告,且修復已合併——但最初的空白就是一個徵兆。
幸運的是,我設法與其中一位維護者聊了一下,他開啟了公告功能——之後我也提交了其他一些修復。

不過,撇開這些……這反映了時代的徵兆。
專案現在可以在短短一次公告中,從家庭 GPU 設備上的嗜好,變成面向數億人的作品,而安全基礎設施——一個接收壞消息的私人信箱、公告工作流程、將模型輸出視為有害的習慣——落後於程式碼,程式碼又落後於受眾。
這個順序恰好與對手所需要的相反。
一個龐大、信任度高、且大多非技術的粉絲群,在同樣一週內安裝同樣的軟體,由他們已經信任的人推薦——這是最有吸引力的目標:龐大、統一、且預先準備好接受。
這正是蠕蟲想要的單一文化,而且歡迎墊已經鋪好。
因此,這個故事中令人鼓舞的一半,並不是程式碼完美無缺——它並不完美——而是這個專案在聽到敲門聲後,大約一天內就接好了門鈴並推出了修復。
對於移動如此快速、面對如此規模受眾的軟體,這種反射——打開私人通道、快速回應、公開修復——比一開始就保持零瑕疵記錄更有價值。歸根結底,這才是真正贏得自托管信任的方式。
現在……就這樣啦,各位!

https://x.com/Grummz/status/2061300454907371953
https://x.com/ashnichrist/status/2061481763516399737





