每個獨立開發者都有過這個時刻:你找到一個套件,剛好做了你需要的每一件事,免費、幾千顆星,而 npm install 就在一次鍵擊之外。那感覺像是你一整個禮拜會做的最快決定。
而那是整週最不該快的地方。
依賴套件不是一次購買——它是一段關係。你不是預先付費;你是「繼承」它。你繼承它的 bug、它的安全狀況、它的維護時程,以及——那個每個人都等到太遲才想到的部分——它的託管問題。當寫它的那位唯一維護者離開,或他的 GitHub 帳號被接管,它不會停止成為你的程式碼。它會變成「你再也無法維護的程式碼」。
以下是獨立開發者真正能執行的守則:五項檢查、三十分鐘,在你把產品託付給一個套件之前。
成本從來不是授權費,而是你繼承的那些後果
開源感覺免費,因為沒有帳單。但真正的成本以三種方式出現,其中只有一種是錢:
被拋棄。 一個套件陷入沉寂——十八個月沒有 commit,問題單越堆越多——於是你開始維護一份你沒寫過、也許並不熟的程式碼,而且沒有測試可以依靠。沒人會對一個被棄置的依賴「退款」;你只是吞下那些工時。
抗議與破壞。 有時維護者不是離開——是把東西燒掉。2022 年 1 月,faker.js 和 colors.js 的開發者——兩個被成千上萬專案依賴的套件——故意破壞它們,抗議企業免費利用他的無償工作。一夜之間,一個「就是能用」的套件開始回傳損壞的輸出,全世界的建置接連失敗。一個沒有備援的獨立開發者,眼睜睜看著產品壞掉,因為一個他從未見過的人醒來時很生氣。
被入侵。 這是那個不斷變大的部分。2024 年 3 月,XZ Utils 後門幾乎把一記供應鏈攻擊送進全球一半的 Linux 伺服器——一場持續數年、對維護者關係的耐心滲透。而 2026 年 8 月 4 日,攻擊者入侵了 keyv 及其 cacheable 系列套件維護者的帳號——其中一些每週下載數億次——並用它把竊取憑證的蠕蟲在幾個小時內推送到 444 個套件。一個帳號被入侵,於是「很多人用」變成了「被下毒」。
這些都不是反對開源的理由。它們是反對盲目開源的理由。套件不是風險。那段關係才是。
五項檢查(三十分鐘,在你安裝之前)
你不需要一支企業資安團隊。你只需要回答五個問題,用瀏覽器和終端機各半小時就夠了。
1. 公車因子——實際上到底有多少人在維護? 看 commit 歷史。是一個名字,還是一個分散的群體?只有單一維護者的套件,公車因子等於一——那個人被公車撞、被榨乾、或者被入侵,套件就結束了。這是訊號最強的一項檢查。一個活躍的名字=格外謹慎;多年來輪替的貢獻者群=健康。
2. 最後一次 commit 的節奏——這是活的、殭屍、還是死的? 活著的套件會夠頻繁地 commit,讓安全修補上得來。殭屍套件是最糟的一種:它仍然每週被下載數百萬次,卻沒有任何人真的在維護。這現象驚人地常見——OSSRA 報告近年來將「含有未維護(殭屍)元件的程式碼庫比例」定在 90% 以上。檢查最後一次 commit 日期。在一片靜默與未解決安全問題中熬過十八個月,這就是你的答案,與星星數無關。
3. 維護者身分——這是我能查證的人,還是只是一個代號?
健康的專案背後有可辨識的人(或組織),最好是啟用了雙重驗證——因為 MFA 正是擋在維護者與那種發生在 keyv 身上的帳號接管之間、最重要的東西。維護者是一個沒歷史、沒部落格、沒雇主的匿名代號,就是一個警訊。不一定惡意——但永遠無法稽核。
4. 依賴樹的大小——我到底繼承了多少?
那個「小」套件帶著它自己的依賴一起來,而那些依賴又有依賴。執行 npm ls 看看那棵樹。一個「極小工具」套件拉進 400 個傳遞依賴,代表你繼承了 400 段你沒有研究過的關係——任何一段都帶著同樣的被遺棄或被入侵風險。樹越小,能在一夜之間燒掉你產品的東西就越少。
5. 授權是否合用——我真的能照我想的方式用它嗎? 不是每個「開源」授權都寬鬆。Copyleft 授權(如 GPL)可能在你散佈時,對你的程式碼施加義務。獨立開發者常見的錯誤,就是假設「開源=我想怎樣都行」。讀一下授權——這只要兩分鐘,就能避免一場你無法撤回的法律麻煩。
拿到答案之後怎麼做
這份清單不是通過/不通過的關卡——它是一份評分表,告訴你該怎麼對待每個依賴:
- 五項全過(分散的維護者、活躍的 commit、可查證且開 MFA 的身分、小依賴樹、寬鬆授權)→ 放心用。這是真正的商品,外包出去。
- 在維護或公車因子上失敗、但對產品至關重要 → 這就是你 reuse-vs-rebuild 的託管張力。如果它對產品很核心、而你不能冒險,你要麼 fork 它、要麼重寫它——因為擁有那個脆弱的依賴,就等於擁有它的停機時間。
- 在身分或授權上失敗 → 走開。沒有任何功能值得你繼承一段無法稽核的關係、或一個法律義務。
重點不是偏執,而是:加入一個依賴的決定,是託管決定,不是成本決定——而獨立開發者沒有任何可以把託管委辦出去的對象。你就是 CISO、是最後一道防線的維護者、是凌晨三點被叫醒的人。三十分鐘的盡職調查,就是把「希望它能一直能用」變成「我很清楚我擁有什麼」的那一步。
值得記住的重新框架
「免費又熱門」是一句行銷詞,不是風險評估。那個感覺像你一週最快決定的套件,正是會悄悄變成你一年最慢負債的那一個。
跑完五項檢查,然後安裝——或者不裝——用那唯一真正能保護獨立開發者的東西:知道自己擁有什麼。
參考來源
- SafeDep. “npm Worm Poisons keyv, cacheable and 400+ Other Packages Across Twelve Organisations.” 2026-08-04. — 2,234 個被下毒的版本、444 個套件名稱,源於一個被入侵的維護者 GitHub 帳號。
- Socket Research. “Popular npm Packages in the keyv and Cacheable Namespaces Compromised in Active Supply Chain Attack.” 2026-08-04. — 維護者帳號被接管;
preinstall腳本在專案自身程式碼執行前,就執行了竊取憑證的程式。 - Aikido Security. “Keyv and friends compromised in npm supply chain attack.” 2026-08-04. — 444 個套件/1,381 個版本、超過 20 億次月安裝;
cacheable家族(flat-cache 每月約 5.65 億、file-entry-cache 每月約 5.57 億)全部被捲入。 - The Hacker News. “Keyv-Linked npm Worm Poisons Hundreds of Packages.” 2026-08-04. — SafeDep 後續統計:1,684 個被下毒版本/420 個名稱/九個組織;跨組織傳播每 2–7 分鐘一次。
- Synopsys 開源安全與風險分析(OSSRA)。 — 約 90% 以上受稽核的程式碼庫含有未維護(殭屍)的開源元件;引用其普遍性時,以方向性範圍呈現,而非精確數字。
- XZ Utils 後門(CVE-2024-3094),2024-03。 — 一場對維護者關係、持續數年的滲透,幾乎把供應鏈後門送進各 Linux 發行版。
faker.js/colors.js維護者(Marak Squires)破壞事件,2022-01。 — 維護者刻意破壞兩個套件以示抗議;成千上萬個依賴建置因此失敗。
