智譜ZCode被爆打包上傳Git全歷史

智譜旗下的AI編程工具ZCode,9月18日被開發者踢爆會在背景把整個工作目錄打包上傳,範圍包括完整的Git歷史、LFS大型檔案快取和本機設定。當天稍晚,ZCode發出道歉聲明,承認確有上傳情事,將原因歸咎於「程式庫索引」功能,並表示問題已修復。

開發者挖出了什麼

最早把細節攤開來的是技術部落客Ferstar。他在部落格裡拆解了ZCode的本機快照機制:登入後,一個隨程式啟動的背景行程會把整個工作目錄打包,用AES-256-CTR加密檔案內容,再用伺服端下發的RSA公鑰包裹金鑰,最後以表單直傳的方式送進阿里雲OSS。解密用的私鑰只存在雲端,使用者手上的.enc檔案自己打不開。

他給出的樣本很具體:未壓縮的工作目錄345MB,加密後313MB,清單裡有42411個檔案。占大宗的是.git目錄,合計86.6%,其中LFS快取196.1MB、Git物件102.2MB,原始碼與設定檔只有約46MB。觸發時機有兩個,一是每次送出提示詞之前,二是任務結束後更新Repo Wiki時,單一工作階段最多記錄到62次快照。

同一天,有開發者在智譜的公開意見回饋庫裡開了issue,標題連問三個「為什麼」:為什麼要靜默上傳全部Git歷史、為什麼加密成使用者自己都打不開、為什麼連關閉的開關都不給。issue裡提到快照在本機上傳失敗後不斷重試,記錄到564次。另一位開發者在自己的機器上重現,一個專案的快照有748MiB,.git佔比98.91%,版本號是ZCode 3.12.3。

開關失靈是這次爭議裡最刺人的一點。Ferstar的說法是,介面上「最佳化體驗」和「儲存庫快照索引」的開關,管的只是伺服端要不要拿資料訓練模型,本機打包和上傳照常進行。Git歷史裡可能還躺著早就刪除的金鑰、廢棄的舊設定、沒推送的分支紀錄和內網網域名稱,這些東西在目前的程式碼裡看不到,在.git裡卻一樣不少。

智譜怎麼說

ZCode的道歉聲明把上傳歸因於「程式庫索引」功能:Repo Wiki產生頁面時可能觸發儲存庫資料上傳,資料在雲端產生完Wiki後立即銷毀、不做保存。該功能上線初期預設開啟,部分使用者受到影響,現已修復。

補救措施有三項:近期開源ZCode程式碼庫,邀請第三方評估並公開審查進度;當天給全體使用者額外發放一次週配額重置。聲明裡沒交代、目前也無法查證的事還有幾件:受影響的使用者和儲存庫有多少、資料在OSS上實際停留多久、「銷毀」有沒有經過獨立稽核、修復之後的版本號是多少。開源時程表也只寫了「近期」。

智譜當天還發布了新模型GLM-5.3-FlashX,主打每秒200個token的輸出速度。有開發者在部落格裡把兩件事放在一起,調侃「全網都在問程式碼傳去哪了,智譜卻忙著發新模型」。

現在能做的事

ZCode的使用者裡有不少是拿公司專案試用,Git歷史對企業的敏感程度往往高過目前的程式碼。對還裝著舊版本的人來說,比較穩妥的做法有三步:先升級到修復後的版本;檢查本機~/.zcode/v2/checkpoints底下是否還留著待上傳的快照;再把歷史裡出現過的金鑰和權杖全部輪替一遍,別指望「已銷毀」能涵蓋已經傳出去的部分。

Ferstar提供了一個更硬的做法:在macOS上用chflags uchg、在Linux上用chattr +i把快照目錄鎖成不可寫,從檔案系統層擋掉快照的產生。代價是檢查點回溯和時間軸功能也會跟著失效。

這類編程Agent本來就得讀取儲存庫才能運作,本機索引本身不稀奇。分歧在於邊界:讀取到本機和傳到雲端是兩回事,傳目前的程式碼和傳整段歷史又是兩回事。智譜承諾的開源如果真的落地,外界至少能自己去檢視快照模組到底打包了哪些路徑、開關接到了哪裡。

參考來源:Ferstar技術部落格對快照機制與檔案組成的逆向分析、zai-org/feedback公開issue、鳳凰網科技、CocoLoop、Elliot's Harness Lab;ZCode道歉聲明核實歸因、修復狀態與補償措施。