知識庫
AI工作流
12 min

用 Claude Code 檢查 GitHub 專案有沒有惡意程式:我埋了九個雷實測

從 GitHub 裝一個陌生套件,clone 之後、install 之前該做什麼?我做了一個埋九個雷的測試 repo 實測:grep 漏掉肉眼看不見的 Unicode 隱藏字元、secret 掃描器對假憑證回報 0、npm audit 對新投毒套件完全無感。附陌生 repo 的七步審查流程與工具清單,AI 創作者裝 Skill 和 MCP 前必看。

你在 GitHub 看到一個很想用的工具,git clone 下來,正要 npm install./install.sh。等一下 ── 那一秒鐘,你就把這個陌生人寫的程式碼,放進了你有 SSH 金鑰、有 .env、有瀏覽器 cookie 的這台電腦。

2025 年是開源供應鏈攻擊工業化的一年。光是這一年,新增的惡意開源套件就超過 45 萬個,九成九集中在 npm。有一種自我複製的蠕蟲,會在你安裝的瞬間掃你機器上的憑證,再自動把自己塞進你能發布的套件裡繼續傳播。

這篇不講理論。我親手做了一個埋了九個雷的測試 repo,然後當作第一次看到它,實際跑一次審查,看哪些抓得到、哪些會漏。全部有實測輸出。

我埋的九個雷,和它們怎麼被抓到

我做了一個假的 npm 套件,取名 cute-progress-bar,看起來人畜無害,但埋了九個真實攻擊手法的無害樣本(全部指向 example.com、載荷解開只是 echo、不讀不傳任何真實檔案,原理跟防毒界的測試檔一樣)。然後我用三種方法檢查它:

九個雷 × 檢查方法

純 grep 抓到 6 個,漏掉 3 個:Unicode 隱藏字元、硬編碼憑證、CI 語意風險。

安裝腳本、base64 混淆、讀 .ssh/.env、eval+Function、curl|sh ── 這五個 grep 抓得到。

加上專用工具和手動規則後,9 個裡有 8 個被抓到。剩下那 1 個(憑證)漏得很有意思,下面講。

grep 抓到六個,漏掉三個。這三個漏洞,就是這篇的重點。

教訓一:grep 只抓得到你想搜的字

那個 Unicode 雷,是我在一行正常程式碼裡塞了一個 U+202E(從右到左覆寫字元)。它在編輯器裡肉眼完全看不到,git diff 只會顯示一個奇怪的 U+202E,大多數人會直接滑過去。grep 也搜不到,因為你根本不知道要搜什麼。

要抓它,得專門偵測那些「屬於 Unicode 規範但不產生任何視覺輸出」的控制字元。2025 年真的有一款自我傳播的編輯器擴充蠕蟲,就是用這種隱形字元把惡意碼藏在擴充裡,受害擴充被下載了三萬多次都沒人發現。

grep 是個好起點,但它只照亮你已經知道要找的東西。

教訓二:「掃出 0 個」不等於乾淨

我裝了專業的 secret 掃描器去掃那些硬編碼的假 AWS 跟 GitHub token,結果它回報 0 個。

我一度以為工具壞了。追下去才發現:我當初挑的假憑證,剛好用了 AWS 官方文件裡的 AKIAIOSFODNN7EXAMPLE 這種範例值,而掃描器內建白名單專門排除它們(不然會對所有教學文件狂誤報)。我換成一般格式的假 token,它立刻抓到三個。

這件事的意義很重:掃描器有盲區、有白名單,「掃出 0 個」可能只是規則沒命中,不是真的乾淨。一個工具不夠,要交叉比對。

而且還有個更常見的誤會:npm auditpip-audit、Dependabot 這些,查的全是「已知漏洞資料庫」。一個剛被投毒、postinstall 正在偷你 token 的新套件,它們完全無感 ── 因為還沒人通報。要抓「惡意行為」得另外用會做行為分析的工具。

教訓三:掃描器負責圈可疑,人負責做判決

我自己寫的掃描規則,對一支完全乾淨的 install.sh 誤報了「有可疑」。它命中的是這行:

if command -v "$candidate" >/dev/null 2>&1; then

我的規則想抓「把輸出導去 /dev/null 藏證據」,結果撞到 >/dev/null 2>&1 ── 那是每支 shell 腳本都在用的「安靜執行」寫法,無害。同類的假警報還有:字串裡的 eval.env.example 裡的假值、註解裡的指令。

所以掃描器亮紅燈,意思是「這裡值得看一眼」,不是「有罪」。最終判斷一定要人來做。這也正是你可以把 Claude Code 用上的地方 ── 讓它把可疑點一條條圈出來、解釋每一條在做什麼,然後你來決定要不要信任。相關的護欄思路我在WP-CLI 那篇也寫過。

AI 創作者要多擔心一件事:Skill 與 MCP 的安全

如果你會裝 AI Skill、MCP server、或編輯器擴充,你的風險比一般人更高。因為套件只是「被安裝」,但這些東西是會被 AI 讀進 context 並自動執行的。

數字很嚇人:有人掃了近四千個 AI Agent Skill,三成六有安全缺陷、七十幾個確認帶惡意 payload。第一個被記錄的惡意 MCP server,前十五個版本都乾淨、累積信任,第十六版才偷加一行,把經手的信件副本轉走。還有一種手法更陰:把 prompt injection 藏在 README 或程式碼註解裡,誘導你的 AI 去執行惡意行為 ── 這不是能 patch 的 bug,是架構性問題。

甚至連 Claude Code 本身都出過一個(已修的)漏洞:惡意 repo 的 .claude/settings.json 會在你點「信任」對話框之前就自動執行,等於 clone 加開啟就中招。所以裝 Skill這件事,來源比方便更重要。

給 AI 創作者的一句話:任何來路不明的 repo、Skill 或 MCP server,先丟進沙盒跑。Anthropic 自己就開源了一個沙盒工具(@anthropic-ai/sandbox-runtime),用作業系統原生機制隔離,網路預設全擋。

我的想法 — 九黎月怎麼看這件事

我做這個實驗的時候,一直想到「請神」這件事。

民間信仰裡,請一尊來路不明的神像回家供,是大忌。老一輩會說,你不知道那裡面住的是什麼。它可能是神,也可能是借著神像的殼、等你上香餵養的東西。所以要看來歷、看開光、看是誰經手的 ── 不是不信,是「信任要有依據」。

裝一個 GitHub 上的陌生套件,是一模一樣的事。你把它請進這台有你所有金鑰的機器,postinstall 那一炷香一點下去,它就開始跑了。九成九的套件是好的,就像九成九的神像只是木頭。但那要命的百分之一,你分辨得出來嗎?

AI 在這件事上,是很好的乩身。它讀得比你快、記得住那些你會滑過去的隱形字元、能把一段混淆的程式碼還原給你看。但它不是判官 ── 它會把可疑處圈給你,最後那一下「信,還是不信」,得你自己落。

工具會過時,攻擊手法會翻新,但「請進門之前先看清楚」這個規矩,不會。

結論:檢查 GitHub 惡意程式的七步審查

1. 先讀不跑clone 後先看 package.json 的 scripts、install 腳本、CI,一行都別執行
2. 掃可疑模式install hook / eval / base64 / curl|sh / 讀 .ssh .env / 外連網域
3. 交叉比對別只信一個工具;查已知漏洞用一種,查惡意行為用另一種
4. 查供應鏈CI 有沒有鎖到完整 commit SHA、secret 有沒有流向外連
5. 查隱藏層Unicode 隱形字元、minified 檔、可疑二進位
6. 真要跑就隔離沙盒 / 容器 / --ignore-scripts / 延遲幾天再裝
7. 人做判決掃描器只圈可疑,紅燈逐一人工確認

做完這七步,你不會百分之百安全 ── 沒有人能保證這個。但你會從「閉著眼睛請神」,變成「至少看過來歷再決定」。這中間的差距,可能就是你那台機器裡所有金鑰的距離。

威脅數據來源:Sonatype、ReversingLabs、Snyk、Datadog、Koi Security 等 2025-2026 公開報告;檢查流程與工具指令為 2026-07-28 本機實測。所有數字經雙來源交叉查證,查不到第二來源的沒有寫進來。

標籤
#GitHub 惡意程式#供應鏈攻擊#AI Skill 安全#MCP 安全#Claude Code#開源安全#九黎月