有些重大事件,導火線都小得荒謬。
2026 年 3 月 31 日,Anthropic 讓全球開發者社群炸鍋的,不是什麼精心設計的攻擊,而是一個工程師忘記更新 .npmignore。
結果: 512,000 行 TypeScript 原始碼,透過 npm 公開在全世界面前。
這篇文章會完整拆解事件的技術原因、外洩內容的影響範圍、claw-code 的崛起與爭議、同日爆發的 axios 供應鏈攻擊,以及你在自己的 VPS 上可以做哪些事來保護自己。
事情是怎麼發生的?
要理解這次洩漏,你需要先知道 Claude Code 的 build pipeline 長什麼樣子。
Claude Code 是一個 CLI 工具,用 TypeScript 寫的,最終透過 npm 發布給使用者。它的建置工具是 Bun runtime——不是 webpack,不是 esbuild,而是 Bun 內建的 bundler。Bun 在這裡扮演的角色是把幾千個 TypeScript 模組打包成一個單一的 cli.js,讓使用者只需要 npx @anthropic-ai/claude-code 就能跑起來。
問題出在 Bun bundler 的一個已知行為(oven-sh/bun#28001):當你在生產模式(--minify)下執行 build 時,Bun 會自動產生一份 source map 檔案——cli.js.map。這不是 bug,是 Bun 的設計決策,方便開發者在生產環境中做 debug。但這也意味著,每一次 build 都會生出一份包含完整原始碼的 .map 檔。
Source map 的本質就是一份「翻譯對照表」:左邊是壓縮混淆後的程式碼,右邊是原始的、人類可讀的 TypeScript。有了這份檔案,任何人都能用 Chrome DevTools 或 source-map-cli 還原出完整的原始碼樹——包括檔案名稱、目錄結構、每一行程式碼。
正常的處理方式,是把 *.map 加進 .npmignore,讓 npm publish 時排除這份檔案。或者,更保險的做法是在 package.json 裡用 files 欄位明確列出「只有這些檔案才能被打包進 npm tarball」。
兩個都沒做。
v2.1.88 就這樣帶著一份 59.8 MB 的 cli.js.map 上架到 npm registry。正常的 npm 套件大多在幾百 KB 到幾 MB 之間——59.8 MB 的檔案大小本身就是一個明顯的紅旗,但 Anthropic 的 CI/CD pipeline 顯然沒有設定 tarball 大小的檢查閾值。
更值得注意的是,這份 source map 裡除了原始碼本身,還嵌入了指向 Anthropic 內部 Cloudflare R2 bucket 的 URL。R2 是 Cloudflare 的物件儲存服務,Anthropic 用它來存放建置產物(build artifacts)。這些 URL 原本應該是私有的,但因為 bucket 的存取權限設定不夠嚴格,任何拿到 URL 的人都能直接 curl 下載完整的 TypeScript 程式碼樹——甚至包括 source map 本身沒有涵蓋到的測試檔案和設定檔。
更諷刺的是:事後有人翻了 npm 的發布紀錄,確認這是 Anthropic 13 個月內第二次犯同樣的錯。2025 年初的某個版本也曾短暫包含 source map,只是當時 Claude Code 還不夠紅,沒有人注意到。這代表 Anthropic 的發布流程在超過一年的時間裡,從未加入防止 source map 外洩的自動化檢查。沒有 CI gate 驗證 tarball 內容,沒有 pre-publish hook 掃描 .map 檔,什麼都沒有。
用一句話總結:這不是「一次不幸的失誤」,而是一個系統性的流程缺陷。
事件時間軸
| 時間(UTC) | 事件 |
|---|---|
| 03-31 00:21 | axios 惡意版本 1.14.1 上架(後述) |
| 03-31 約 04:23 | Chaofan Shou(@Fried_rice)在 X 上貼出截圖,揭露洩漏 |
| 03-31 數小時內 | 全球開發者開始備份、鏡像、分析 |
| 03-31 03:29 | axios 惡意版本下架 |
| 03-31 下午 | Anthropic 確認:「發布流程的人為疏失,非駭客入侵」 |
| 03-31 數小時後 | Sigrid Jin 開始用 Python 重寫 harness 層 |
| 04-01 凌晨 | claw-code repo 破 5 萬星 |
| 04-01 下午 | claw-code 破 10 萬星(GitHub 史上最快) |
| 04-01 | Anthropic 對 8,100 個 repo 發出 DMCA |
| 4 月初 | Rust 重寫版 ultraworkers/claw-code 達 17.9 萬星 |
誰最先發現的?
第一個公開揭露的人,是 Solayer Labs 工程師 Chaofan Shou(@Fried_rice)。他在 X 上貼出截圖的時候,大部分人還在睡覺:
轉發數在幾小時內破萬。全球的 Slack 頻道和 Discord 伺服器開始炸鍋,工程師們紛紛開始下載備份。有人在 Hacker News 上發帖,幾分鐘內就衝到首頁第一名。Reddit 的 r/programming 和 r/MachineLearning 同時爆文。整個事件從「一個人的推文」到「全球科技新聞頭條」,不到 6 小時。
外洩了什麼?
這不是一般的原始碼外洩。Claude Code 是 Anthropic 的旗艦開發者工具,裡面的程式碼直接反映了 Anthropic 在 AI agent 架構上最前沿的工程實作。以下逐項拆解外洩的內容,以及每個類別為什麼重要。
1,906 個 TypeScript 檔案,512,000+ 行程式碼
這是 Claude Code 的完整原始碼樹。不是片段,不是「部分模組」,而是從 CLI 入口點到最底層工具函式的所有東西。這個數量級的原始碼外洩,在商業 AI 工具的歷史上前所未見。作為參考,VS Code 的核心大約 50 萬行——Claude Code 的程式碼量已經到了同一個等級。
44 個隱藏功能旗標(Feature Flags)
在正式版本中,這些 flag 被 compile 為 false,外部使用者完全看不到。但原始碼裡記載了每個 flag 背後的完整實作邏輯。這代表 Anthropic 未來 6-12 個月的產品路線圖,幾乎被攤在陽光下。競爭對手(OpenAI、Google、Cursor)現在確切知道 Anthropic 正在做什麼、做到什麼程度、預計什麼時候發布。在 AI 軍備競賽的節奏下,這種情報價值無法估量。
完整的 Agent Harness 架構
這是 Claude Code 的「大腦」:19 個沙箱工具(檔案讀寫、終端機操作、瀏覽器控制等)、三層記憶系統(短期 context、工作記憶、長期向量資料庫)、以及一個 46,000 行的查詢引擎,負責決定什麼時候該用哪個工具、如何組合多個工具來完成複雜任務。這套架構的設計哲學和工程細節,是 Anthropic 在 AI agent 領域的核心競爭力。現在,任何人都能研究、模仿、甚至直接改良這套架構。
未發布功能的完整實作
KAIROS(背景 daemon,能在使用者不主動操作時持續處理任務)、BUDDY(AI 電子寵物,有情緒狀態和成長系統)、ULTRAPLAN(多步驟專案規劃引擎)——這些功能都有完整的程式碼,不是概念驗證,而是接近 production-ready 的實作。其中 KAIROS 的 autoDream 機制尤其引人關注:它讓 Claude Code 在閒置時自動進行「記憶整合」,類似人類的睡眠記憶鞏固。這類功能的公開,讓整個業界對「AI agent 下一步能做什麼」有了具體的參考框架。
內部模型代號
Tengu(Claude Code 專案名)、Capybara、Fennec、Numbat——這些代號對應的是 Anthropic 內部正在開發的模型版本,包括 Opus 4.7 和 Sonnet 4.8。模型代號本身不算機密,但它們出現在程式碼中的 context(哪個功能需要哪個模型、效能基準是多少、什麼情況下 fallback 到哪個版本)提供了大量競爭情報。
競爭防禦機制
反蒸餾注入(anti-distillation injection)和原生客戶端認證(CCH hash)是 Anthropic 用來防止其他公司「抄作業」的技術手段。反蒸餾注入會在 Claude 的回應中嵌入特定的 pattern,如果有人用 Claude 的輸出去訓練自己的模型,這些 pattern 會在訓練後的模型中留下痕跡,讓 Anthropic 能夠偵測到。CCH hash 則是用來驗證請求確實來自官方客戶端,防止第三方工具繞過計費系統。這兩個機制的完整實作都被公開了,等於告訴攻擊者要怎麼繞過。
Anthropic 官方說法:「客戶資料與憑證沒有外洩。」從技術層面來說是對的——洩漏的是程式碼,不是用戶資料。但功能路線圖、競爭策略、防禦機制的完整細節,全都成了公開情報。對一間正在準備 IPO、估值超過 600 億美元的公司來說,這些「非用戶資料」的價值可能比用戶資料更高。
claw-code:GitHub 史上增長最快的 repo
洩漏事件的另一個主角是韓國工程師 Sigrid Jin。
他採用的是軟體業行之有年的**「Clean Room」逆向工程方法**。這個方法的核心概念是:一組人負責分析原始系統的「功能規格」(做什麼、怎麼做),把結論寫成設計文件;另一組完全不同的人,只看設計文件,從零開始寫程式碼實作同樣的功能。因為第二組人從未接觸過原始碼,所以最終產出的程式碼在法律上不構成「複製」。這個方法最早在 1980 年代 IBM PC 相容機的開發中被廣泛使用,後來成為合法逆向工程的標準做法。
Sigrid Jin 的做法是:他閱讀洩漏的設計文件和架構描述(不是直接抄程式碼),然後用 Python 從頭重寫了 Claude Code 的 harness 層,命名為 claw-code(「爪」對「Claude」的諧音梗)。
數字:
- 2 小時:破 5 萬星
- 24 小時:破 10 萬星(GitHub 史上最快,打破 OpenClaw 保持的紀錄)
- 此後:ultraworkers/claw-code 團隊用 Rust 從頭重寫整個專案
- 截至 2026 年 4 月初:17.9 萬星
這個 repo 不隸屬於、也未獲得 Anthropic 官方背書。
Rust 重寫的技術優勢
ultraworkers 團隊選擇 Rust 不是為了趕潮流。他們的 Rust 版本有幾個明確的技術優勢:
- 零外部依賴(zero-dependency):不依賴任何 npm 套件或 Python 生態系的函式庫,大幅降低供應鏈攻擊的風險——這在 axios 攻擊的背景下特別有說服力
- 高效能:Rust 的編譯期記憶體安全和零成本抽象,讓 claw-code 的啟動時間和記憶體使用量都顯著低於 Python 版本
- 直接使用
ANTHROPIC_API_KEY:不需要 Claude Pro 訂閱帳號,任何有 API key 的人都能用。這對在自己 VPS 上跑 AI 工具的開發者來說特別有吸引力——你不需要被綁在 Anthropic 的付費方案裡 - 單一二進位檔部署:
cargo build --release產出一個 binary,scp到 VPS 上就能跑,不需要安裝 Node.js 或 Python runtime
DMCA 風暴
Anthropic 隨後對 GitHub 上的鏡像和 fork 大量發出 DMCA 下架通知。初期的範圍是驚人的 8,100 個 repo——問題是,其中很多根本跟洩漏無關。有些 repo 只是在 README 裡提到了 Claude Code,有些是完全獨立開發的工具但名稱裡有「claude」,還有些是早在洩漏之前就存在的開源專案。
社群的反彈非常激烈。開發者們認為 Anthropic 是在用 DMCA 當武器進行「地毯式轟炸」,而不是精準打擊真正侵權的 repo。這種做法不但沒有達到止血的效果,反而催生了 Streisand 效應——更多人因為好奇而去尋找和備份洩漏的內容。
Anthropic 最終收縮了 DMCA 的範圍,只針對直接包含原始 source map 檔案或明確複製貼上原始碼的 repo。但 claw-code 本身因為採用了 Clean Room 方法,且程式碼是用 Python/Rust 重寫而非 TypeScript,所以一直沒有被成功下架——儘管 Anthropic 曾嘗試。這場 DMCA 風暴成了一個教科書等級的案例:在開源社群裡,過度激進的法律行動往往適得其反。
claw-code 對 AI 工具生態的長期影響
claw-code 的存在改變了整個 AI coding agent 的競爭格局。在洩漏之前,Claude Code 的架構是黑箱;現在,任何人都能基於 claw-code 的開源實作來打造自己的 AI agent 工具。這對 Anthropic 是雙刃劍——一方面失去了架構上的競爭壁壘,另一方面卻也證明了他們的架構設計確實是業界領先的,間接強化了品牌認知。
同日爆發的供應鏈攻擊:axios 裡藏了 RAT
就在洩漏事件佔據所有版面的同一天,有一個更直接的威脅幾乎被忽略:
UTC 2026-03-31 00:21 至 03:29,npm registry 上有人上架了含有**遠端存取木馬(RAT)**的惡意 axios 版本:
axios@1.14.1axios@0.30.4
攻擊者怎麼做的?
時間點不是巧合。攻擊者很可能是看到 Claude Code 洩漏的新聞,判斷全球 JavaScript 開發者的注意力都被轉移了,選擇在這個「掩護」下發動攻擊。這是一種典型的「趁亂打劫」策略——當所有人都在看 A 事件的時候,在 B 方向下手。
惡意版本在 axios 的 postinstall script 中植入了一個額外的依賴:plain-crypto-js。這個名稱刻意偽裝成一個加密工具函式庫,看起來無害。但實際上,plain-crypto-js 的程式碼會在安裝時做以下事情:
- 蒐集環境資訊:作業系統版本、Node.js 版本、目前使用者名稱、hostname
- 掃描敏感檔案:讀取
~/.ssh/、~/.aws/credentials、~/.npmrc(裡面存有 npm publish token)、各種.env檔案 - 建立反向連線:透過 WebSocket 連線到攻擊者控制的 C2(Command & Control)伺服器,建立一個持久的反向 shell
- 註冊開機啟動:在 Linux 上寫入 systemd service,在 macOS 上寫入 LaunchAgent,確保重開機後 RAT 還能存活
這不是單純的「竊取 token」等級的攻擊——這是一個完整的 RAT,攻擊者拿到的是你機器的完整控制權。
哪些版本受影響?
只有這兩個特定版本有問題:
axios@1.14.1(冒充最新版的下一個版本號)axios@0.30.4(針對還在用 0.x 分支的舊專案)
如果你的 package-lock.json 或 yarn.lock 鎖定在 axios@1.7.x 以下的版本,而且你在那 3 小時 8 分鐘的窗口內沒有執行 npm install(沒有 lockfile)或 npm update,你就是安全的。
怎麼確認你的環境安全?
立刻執行這些指令自我檢查:
# 檢查 lockfile 裡有沒有惡意依賴
cat package-lock.json | grep plain-crypto-js
# 檢查 node_modules 裡有沒有被安裝
ls node_modules/plain-crypto-js 2>/dev/null && echo "!! 發現惡意套件 !!"
# 檢查有沒有可疑的 systemd service 或 LaunchAgent
# Linux:
ls /etc/systemd/system/ | grep -i crypto
# macOS:
ls ~/Library/LaunchAgents/ | grep -i crypto
如果任何一項檢查發現異常,你需要做以下事情:
- 立刻斷開該機器的網路連線(阻止 RAT 回傳資料)
- 重設所有 API key 和 token(AWS、GCP、npm、GitHub、Anthropic⋯⋯全部)
- 重灌作業系統(RAT 可能已經取得 root,你無法確定系統的完整性)
- 通知團隊成員(如果這台機器有存取共用資源的權限)
這兩件事同日發生並非 Anthropic 的問題,但時間點的重疊讓整個社群陷入混亂——很多工程師在處理洩漏新聞的同時,沒有注意到這個更直接、更危險的威脅。axios 在 npm 上的週下載量超過 6,000 萬次,受影響的窗口只有 3 小時,但在全球化的開發環境裡,3 小時足夠讓數千台 CI/CD runner 和開發機器中招。
三種解讀:意外、噱頭,還是洩漏?
理論一:純粹人為失誤(最可能)
Bun 的已知 bug 沒有被主動修復,.npmignore 沒有更新,CI pipeline 沒有 tarball 大小檢查——這是 13 個月內第二次犯同樣的錯。事後 Anthropic 工程主管 Boris Cherny 在 Hacker News 的留言中稱之為「plain developer error(單純的工程師失誤)」,語氣甚至帶著一點無奈。最無聊的解釋,往往是對的。而且從 Anthropic 的角度來看,故意洩漏自家最核心的技術資產,包括反蒸餾機制和競爭防禦策略,在商業邏輯上完全說不通。
理論二:PR 噱頭(有人這樣猜,但不太站得住腳)
持這個觀點的人指出幾個巧合:BUDDY 電子寵物功能原本計畫在 4 月 1 日對外預告,時間點剛好是愚人節前夕;洩漏事件在一夜之間讓社群對 Anthropic 的觀感從負面(之前對第三方工具發 cease-and-desist 信件、被批評不夠開放)翻轉成充滿期待(「原來他們在做這麼酷的東西!」)。
但這個理論有幾個致命的漏洞。首先,沒有任何一間準備 IPO 的公司會故意洩漏自己的反蒸餾機制——這等於主動拆掉自己的護城河。其次,DMCA 的法律行動涉及真實的法律成本和聲譽風險,不是行銷部門會選擇的手段。第三,R2 bucket 的 URL 外洩讓 Anthropic 的雲端基礎架構暴露在潛在的攻擊風險之下,這不是任何正常的「PR 策略」會接受的副作用。
理論三:競爭情報意外曝光(最嚴重的結果)
不管是不是意外,結果是一樣的。以下是已經造成的具體損害:
- 模型路線圖曝光:Capybara、Opus 4.7、Sonnet 4.8 的代號和對應的功能需求,現在是 Google DeepMind 和 OpenAI 的情報。他們知道 Anthropic 在哪些方向加碼、哪些功能接近完成,可以據此調整自己的開發優先序
- 反蒸餾機制失效:具體實作方式公開後,競爭對手可以針對性地在訓練 pipeline 中濾掉 Anthropic 的 watermark pattern,讓這套偵測機制形同虛設
- 信任赤字:Undercover Mode(讓 AI 假裝是人類的功能)的存在被揭露後,開源社群和 AI 安全研究者對 Anthropic「負責任的 AI」品牌形象產生質疑。雖然 Anthropic 事後解釋這是內部研究用途,但傷害已經造成
- IPO 風險:對一間估值超過 600 億美元、正在籌備公開上市的公司來說,「我們連 .npmignore 都管不好」不是投資人想聽到的故事
給在 VPS 上開發 AI 工具的你
這次事件有幾個操作層面的教訓值得記下來。如果你在自己的 VPS 上跑 AI 工具、部署 Node.js 服務、或是維護任何 npm 套件,以下每一點都跟你直接相關:
1. .npmignore 和 files 欄位要主動管理
如果你有在發布 npm 套件,*.map、src/、*.ts(非 declaration file)、.env.*、test/ 這些都應該明確排除。別預設「build 工具會處理」。更好的做法是在 package.json 裡用 files 欄位做白名單(只列出允許發布的檔案),而不是用 .npmignore 做黑名單。白名單比黑名單安全,因為你不需要預想所有可能外洩的檔案類型。
2. CI/CD pipeline 加入 tarball 檢查
在 npm publish 之前,先跑 npm pack --dry-run 看看 tarball 裡到底有什麼。可以加一個簡單的 CI step:如果 tarball 大小超過預期閾值(例如 10 MB),就擋下來要求人工 review。Anthropic 那份 59.8 MB 的 tarball 如果有這個檢查,根本不可能上架。
3. 依賴版本要鎖定
axios 攻擊只持續了 3 小時 8 分鐘,但這 3 小時裡跑了 npm install 就中招了。package-lock.json 或 yarn.lock 要提交進 repo,CI/CD 要用 npm ci 而不是 npm install。npm ci 會嚴格按照 lockfile 安裝,不會自動解析更新的版本。
4. 定期跑 npm audit,而且要自動化
不是偶爾想到才跑一次,而是把它寫進 CI pipeline。在 VPS 上部署前跑一次 npm audit --production(只檢查 production dependencies),如果有 high 或 critical 等級的漏洞就擋下部署。搭配 npm audit signatures 可以驗證套件的 registry 簽章,確保套件沒有在傳輸過程中被竄改。
5. API Key 用 secret manager 管理,不要存在檔案裡
不管是 Anthropic API Key 還是任何雲端服務憑證,都不應該以明文存在 .env 檔案裡然後提交進 repo。.env 加進 .gitignore 是基本功,但更好的做法是用 secret manager(HashiCorp Vault、AWS Secrets Manager、或甚至簡單的 doppler)來注入環境變數。在 VPS 上可以用 systemd 的 EnvironmentFile 搭配權限控管(chmod 600),確保只有服務本身能讀取。
6. 監控你的 VPS 上的異常連線
axios RAT 的行為模式是建立反向 WebSocket 連線。在 VPS 上可以用 ss -tnp 或 netstat -tnp 定期檢查有沒有不預期的對外連線。更進階的做法是設定 iptables 或 nftables 的 outbound 規則,只允許你的服務需要的對外連線(例如只開放對 API endpoint 的 HTTPS)。這樣即使 RAT 被安裝了,它也無法建立 C2 連線。
7. 隔離你的開發環境和生產環境
如果你在 VPS 上同時做開發和部署(很多獨立開發者和小團隊都這樣),至少用 Docker container 或不同的 Linux user 做隔離。開發環境的 npm install 中招了,不應該影響到生產服務。更理想的做法是開發在本機或獨立的 dev VPS 上進行,生產環境只透過 CI/CD 部署經過驗證的 artifact。
這次洩漏的技術深度,值得用系列文章完整說清楚:
- → 44 個隱藏功能完整清單:從 KAIROS Daemon 到 26 個隱藏指令
- → KAIROS Daemon 與 autoDream:AI 的背景服務與深夜記憶整合
- → Undercover Mode 與反蒸餾:AI 冒充人類與汙染訓練資料的爭議
- → BUDDY 電子寵物:工程師也需要溫暖
在自己的 VPS 上跑 AI 工具,掌握完整的環境控制權,不怕供應鏈攻擊。查看侃瑞科技 VPS 方案 →
