Claude Code 原始碼外洩
今天早上看到 Claude Code 原始碼因為 source maps 外洩的消息,我第一個反應是:「咦?難道以前沒有人試著還原過?」
Claude Code 的程式碼雖然沒有開源,但其實就是個 13MB 的 cli.js 檔案,俗話說的好,client 端的東西沒有秘密,而且還是最容易還原的 JavaScript,那以 Claude Code 這麼有名的東西來說,不可能沒人研究過吧,怎麼就變驚天的重磅消息了,好像知道了許多以前不可能看見的東西。
經過了一整天的思考,這想法其實半對半錯,聽我娓娓道來。
先來講講 source maps 是什麼,前端的程式碼需要用 bundler 打包在一起,打包完之後會做 minify 跟 uglify 等操作,去掉所有多的空白、換行,然後把變數名稱都變成 a,b,c 那種可讀性低的格式,最後的產物才會傳上去。
但既然程式碼可讀性都變這麼差了,要 debug 的時候怎麼辦呢?這時候就需要把這些 minify 過的程式碼還原成原本的樣子,靠的就是這個 source maps 的檔案,裡面記錄著原始的程式碼以及對應關係,靠這個檔案就能對應出原本的 a2 其實是 API_URL 這個變數。
所以若是 source maps 裡面記錄著檔案路徑以及內容,這個檔案洩漏就等於是原始碼洩漏了,這就是此次 Claude Code 發生的事故。一般常見的做法是 build 完一樣產生 source maps,但是不上傳到外面,只上傳到 Sentry, Datadog 等專門做錯誤處理的地方,在那邊還原,就能確保原始碼不外洩,又能方便 debug。
這邊再提一個概念,有些人會把 minify 跟「混淆(Obfuscate)」混在一起,這兩個概念不一樣。混淆指的是特地把程式碼再轉換一層,你光看是絕對看不懂的,惡意軟體就常幹這種事。而 minify 更像是把程式碼的體積縮小,你認真看還是能大概看出它在幹嘛,我看過很多遍了。
所以,Claude Code 大部分的功能,你根本不需要 source maps,你直接拿 AI 丟給他 cli.js(或先稍微處理過),他就可以回答你了,該有的邏輯都在那邊。
那到底有哪些東西會在打包的時候被去掉,讓這些資訊徹底消失呢?最顯而易見的就是變數名稱、函式名稱、檔案路徑等等,以及最重要的:註解。
程式碼裡面的註解在打包後會完全被去掉,而 source maps 裡面則被保留。以及另一個我朋友提醒我才想到的:dead code。
Dead code 指的是永遠不會被執行的程式碼,例如說 if(false) { … },這段永遠不成立。那為什麼有人會寫出這種程式碼呢?通常原始形式其實是這樣:if (Flag.Internal) { … },然後在 build 的時候把 Flag.Internal 換成 true 或 false,藉由 feature flags 的方式在 build time 開關,藉此 build 出不同的版本。
如果 Flag.Internal 是 false,那最後的產物就會直接把程式碼去掉。但是呢,由於 source maps 保存的是原始檔案的整個內容,因此這些 dead code 還會在。
總而言之,這次外洩的 source maps 跟原先打包後的版本比起來,多了以前絕不可能看到的註解與打包時被移除的 dead code,也還原了變數名稱與檔案路徑。
換句話說,很多人寫的什麼「Claude Code 的隱藏功能」也不是真的隱藏,只是大家懶得去看打包後的版本而已。
之所以我敢寫得這麼肯定,是因為我去試過了。外洩的版本是 2.1.88,我抓的是 2.1.87,我先讓 AI 幫我研究 Bun 的 bundler 邏輯,然後寫一個 reverse 版本,先把 cli.js 還原成 50 個小檔案,然後讓 AI 再根據這些檔案幫我還原成合理的形式。
接著我讓 AI 整理幾篇網路文章提到的隱藏功能,讓他去找找在不在程式碼裡面。
關於那些註解、內部代號或是特殊 flag 才能開啟的功能,確實不存在。例如說什麼內部代號 Capybara、Fennec、Numbat 等等,還有 Undercover Mode 跟反蒸餾防禦,這些都找不到。
但是今天上線的 BUDDY 電子寵物系統、KAIROS、ULTRAPLAN 或是記憶管理、壓縮邏輯等等,這些都是有的,本來就存在了。
所以呢,如果有人有心想研究的話,Claude Code 的這些運作邏輯一直在那,事實上也有人逆向過了,這些都不是新鮮事,只是大家懶得去做而已。那些 prompt 啦,記憶系統啦,agent 協作啦,bash 的檢查啦,憤怒語言偵測器啦,不需要 source maps 外流你就看得到。
真正全新的東西是那些註解裡面寫的經驗、內部代號以及 build time 被砍掉的隱藏功能,這些確實是只有透過 source maps 能看到的。
寫了這麼多,我只是好奇心使然,想去探索到底有哪些東西是新的、真的外洩的,哪些東西又只是「你想研究一直都在,只是現在不用自己還原」,也順便測一下 AI 的能力(還原 bundle 過的程式碼)。無論如何,原始碼外洩對於想研究的人絕對是利多,不用自己去試著還原或是猜測,有原始碼什麼都好辦。
或許在某個平行時空,有個好奇的人辛辛苦苦逆向了 Claude Code 把架構還原,準備跟大家分享成果,結果一覺醒來發現原始碼外流了,每個人用 AI 產的文都跟自己苦心研究的成果類似,只能躲回被子裡哭。
評論