// 威脅簡報
pnpm 相依套件別名路徑穿越:間接相依套件可在安裝時把專案資料夾換成符號連結,--ignore-scripts 也擋不住
- CVSS
- 8.8 HIGH
- CISA KEV
- 未列入
- 弱點類型
- CWE-23
- 主題
- 供應鏈
人工審稿 2026-09-24指令測試:未提供漏洞重現:未進行驗證紀錄 ↓
pnpm 安裝時沒擋住別名裡的「..」,相依樹深處的惡意套件能把專案路徑換成指向自己的符號連結,--ignore-scripts 也無效。
| 誰會中 | 使用 pnpm 10.34.0 以前,或 11.0.0 至 11.4.0 以前版本執行 pnpm install 的開發者與 CI 環境。惡意套件可以是間接相依套件,不必是你自己選的。 |
|---|---|
| 後果 | 安裝時本身只會改動檔案:專案裡的 git hook、腳本資料夾、本地 GitHub Actions 或 dist/ 等路徑可能被換成攻擊者的內容。之後執行 git commit、測試、建置、CI 或發佈時,就可能執行或打包攻擊者的內容。 |
| 現在該做什麼 | 升級 pnpm 到 10.34.0 以上(10.x)或 11.4.0 以上(11.x)。官方沒有提供升級以外的暫時解法。查看依據(2)
|
| 受影響版本 | 10.34.0 以前的所有版本;11.0.0 以上、11.4.0 以前(依維護者 GHSA;CVE 結構化資料寫 <10.33.4,與其描述文字不一致)查看依據:來源說法不一(4)
|
| 修好的版本 | 10.34.0 以上(10.x);11.4.0 以上(11.x)查看依據(3)
|
| CVSS 向量 | 顯示完整向量CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| 時間點 |
|
| CISA KEV | 未列入(未列入 KEV 不代表沒有被利用)查看依據(2)
|
藍隊應對手冊
確認、修補 / 緩解、應變、強化。版本符合受影響條件不等於已被入侵;檢查沒有結果也不等於安全,每一項都有能證明與不能證明的範圍。標記的步驟對應下方攻擊流程裡可以擋下攻擊的那一步。
- 01確認 pnpm 版本
10.x 需要 10.34.0 以上,11.x 需要 11.4.0 以上。開發機與 CI 都要查;CI 可能固定使用舊版。
唯讀查詢pnpm --version - 02檢查專案路徑是否變成符號連結(PlainCVE 建議)
官方沒有提供偵測方法或入侵指標。依公告列出的受影響路徑,檢查它們是否變成指向 node_modules 的符號連結。正常專案裡這些路徑通常是一般資料夾。
唯讀查詢find .git/hooks .husky .githooks scripts tools bin tests dist .github/actions -maxdepth 1 -type l 2>/dev/null
- 01升級到 10.34.0 或 11.4.0 以上
修補版會在讀取套件中繼資料時、以及建立符號連結時,都拒絕含路徑穿越的別名。官方沒有提供升級以外的暫時解法。
- 01發現可疑符號連結:當作程式碼可能已被執行
這是 PlainCVE 的推論,不是官方指引:從被換掉的路徑執行過的 hook 或腳本,應視為執行了不受信任的程式碼。移除符號連結、用已修補的 pnpm 重新安裝,並找出引入該別名的套件。
- 02檢查憑證與已發佈的版本(預防性)
官方沒有輪替指引。若確認有不受信任的程式碼跑過,輪替該機器或 CI 能存取的憑證,並檢查期間發佈過的套件內容。這是預防性建議。
完整修復步驟與說明
- 先升級 pnpm 本身,再重新安裝相依套件。 用你原本安裝 pnpm 的方式,升到 10.34.0 以上(10.x)或 11.4.0 以上(11.x),再用
pnpm --version確認。CI 若在設定中固定了 pnpm 版本,也要一起改。 - 順序很重要。 用舊版 pnpm 安裝過不明相依套件的專案,升級後先檢查上表那些路徑有沒有變成符號連結,確認乾淨後再 commit、建置或發佈,避免先觸發了被換掉的 hook 或腳本。
- 沒有官方暫時解法。 公告除了升級以外沒有提供其他緩解方式。
- 同一批修補版還修了幾個不同的 pnpm 安全問題(拒絕指向套件外的 patch 檔、拒絕非 SHA 的 git commit 欄位、將登錄庫憑證限定在對應登錄庫、tarball 完整性不符時直接失敗),這是升級的另一個理由。
攻擊流程
從左到右是攻擊發生的順序。藍色盾牌代表這一步可以被擋下,越早擋下越好。點圖示可看細節。
- 攻擊者
攻擊者發佈帶有路徑穿越別名的惡意套件
套件在登錄庫的中繼資料裡宣告一個相依套件別名,別名中含有「..」(往上一層資料夾)。再讓一個看似正常的套件去依賴它。
防禦: 升級後的 pnpm 在讀取套件中繼資料時就會拒絕含路徑穿越的別名。
- 你的系統
開發者或 CI 執行 pnpm install
惡意套件可以藏在間接相依套件裡。就算加了 --ignore-scripts 也一樣會進行下一步,因為這一步不需要執行任何腳本。
防禦: 升級到 10.34.0 / 11.4.0 以上;審查 lockfile 裡新出現的間接相依套件。
- 你的系統
pnpm 把別名當成路徑,把專案裡的路徑換成符號連結
舊版沒有檢查最終路徑是否留在 node_modules 內,於是 .git/hooks、.husky、scripts/、.github/actions/、dist/ 等路徑可能被換成指向攻擊者套件資料夾的符號連結。這一步只改檔案,不執行程式。
防禦: 修補版在建立符號連結時也會再次拒絕穿越的路徑。可定期檢查這些路徑是否變成指向 node_modules 的符號連結。
- 你的系統
之後的 git commit、測試、建置或 CI 使用了被換掉的路徑
攻擊者的內容要到這時才可能被執行,例如 git hook 在 commit 時觸發,或 pnpm test、pnpm run build、CI 步驟呼叫被換掉的腳本。
防禦: 不要只依賴 --ignore-scripts;在乾淨、已修補的環境中建置與執行 CI。
- 外部
被竄改的建置結果可能被發佈出去
公告把 dist/ 與 pnpm publish 列為可能的觸發點;若發佈前的輸出被換掉,下游使用者可能收到被竄改的套件。這是依公告影響清單的推論。
防禦: 發佈前確認 dist/ 不是符號連結,並在已修補的 CI 中發佈。
影響範圍
| 版本線 | 受影響 | 修補版本 |
|---|---|---|
| 10.x 及更早 | 10.34.0 以前 | 10.34.0 |
| 11.x | 11.0.0 以上、11.4.0 以前 | 11.4.0 |
安裝當下就會受害,只要同時滿足:
| 條件 | 說明 |
|---|---|
| 使用上表受影響的 pnpm 版本 | 開發機與 CI(持續整合,自動建置與測試的系統)都算 |
執行 pnpm install 時,相依樹中有帶路徑穿越別名的惡意套件 | 可以是間接相依套件,也就是你安裝的套件自己又依賴的套件 |
這時專案裡的路徑已經被換成符號連結,專案檔案不再可信。如果被換掉的是一般檔案,維護者公告指出通常會造成阻斷服務(該檔案無法正常使用)。
之後的後果取決於有沒有東西用到被換掉的路徑:如果之後有 git hook、測試或建置腳本、CI 步驟或發佈讀取或執行這些路徑,問題就可能升級成執行惡意程式,或讓發佈出去的成品被汙染(例如被換掉的 dist/ 被打包發佈)。
有沒有加 --ignore-scripts 都一樣會受影響。至於從既有的 lockfile(記錄每個相依套件確切版本的檔案)以 --frozen-lockfile 安裝時是否也會觸發,來源沒有說明。
原理
pnpm 支援「別名」:專案可以用另一個名字安裝某個套件。問題是 pnpm 會直接採用套件在登錄庫中繼資料裡宣告的別名,即使別名含有 ..(往上一層資料夾)也照收,接著在安裝時把這個別名接在 node_modules 後面,當成建立符號連結(檔案系統的「捷徑」)的位置。它沒有拒絕 ..,也沒有確認最後的路徑還在 node_modules 裡面。
結果就是:相依樹深處的一個惡意套件,可以讓 pnpm install 把專案裡的某個路徑換成指向它自己資料夾的符號連結。公告列出的可能目標包括 .git/hooks、.husky、.githooks、scripts/、tools/、bin/、tests/、.github/actions/<名稱>、發佈前的 dist/,以及 node_modules/.bin。這類弱點稱為相對路徑穿越(CWE-23)。
要注意時間點:安裝這一步只是改檔案,不代表程式會在安裝時執行。 攻擊者的內容要等到之後有人或 CI 用到被換掉的路徑才可能執行,例如 git commit 觸發 git hook、pnpm test、pnpm run build、CI 步驟或 pnpm publish。
為什麼 --ignore-scripts 擋不住。 依 pnpm 文件,這個選項讓 pnpm 不執行專案與相依套件在 package.json 裡定義的腳本(例如 postinstall)。它管的是「套件要不要跑程式」,但這次是 pnpm 自己在正常的連結步驟中建立有害的符號連結,完全不需要腳本。--ignore-scripts 仍然值得使用,只是它不涵蓋「套件管理器把檔案寫到不該寫的地方」,也不涵蓋之後才透過 git hook、建置或 CI 觸發的程式碼。
有問題的思路(概念示意,不是 pnpm 原始程式碼):
展開程式碼範例(js)
// aliasName 來自套件的登錄庫中繼資料,不可信任
const target = path.join(nodeModulesDir, aliasName)
createSymlink(packageDir, target) // 沒檢查 target 是否還在 node_modules 內修好的思路:
展開程式碼範例(js)
if (hasTraversalSegment(aliasName)) throw new Error('invalid alias')
const target = path.resolve(nodeModulesDir, aliasName)
if (!isInside(nodeModulesDir, target)) throw new Error('invalid alias')
createSymlink(packageDir, target)依釋出說明,修補版在讀取套件中繼資料時、以及建立符號連結時,都會拒絕含路徑穿越的別名。
時間軸
| 日期 | 事件 |
|---|---|
| 未公開 | 研究者 aszx87410 回報 |
| 2026-05-27 | 釋出 pnpm 11.4.0 與 10.34.0 |
| 2026-05-28 | 維護者公告 GHSA-hwx4-2j3j-g496 公開 |
| 2026-06-03 | 公告更新 |
| 2026-06-25 | CVE-2026-50016 公開;NVD 收錄 |
| 2026-06-26 | GitHub 全域公告資料庫收錄並審核;CVE 紀錄更新 |
| 2026-06-29 | NVD 最後修改(已分析) |
延伸閱讀
- 受影響版本的資料不一致: CVE 紀錄的結構化資料(CNA 為 GitHub)與 NVD 頁面摘要寫
< 10.33.4,但同一筆 CVE 的描述文字、NVD 自己的 CPE 設定與維護者公告都是< 10.34.0。10.33.4 的釋出說明只有一項 git tarball 完整性修補,沒有這個別名修補;修補第一次出現在 10.34.0。本頁採用維護者公告,並認為 10.33.4 仍受影響。 - 評分: 唯一的分數是 GitHub(CNA)給的 CVSS 3.1 8.8,NVD 列為次要來源,沒有自行評分;沒有 CVSS 4.0 分數。CISA 的 SSVC 評估為「有公開概念驗證、不可自動化、技術影響為完全」。「有概念驗證」不等於已遭實際攻擊。
- 是否遭利用: 沒有任何來源回報實際利用。本站 2026-09-24 的 CISA KEV 快照中沒有這個 CVE;未列入 KEV 不代表沒有被利用。
- 修補 commit: 公告與釋出說明都沒有連結特定 commit 或 PR。
- 相關但不同的問題: pnpm 11.11–11.14(部落格日期 2026-07-18)另外加強防護,阻止特製的
pnpm-lock.yaml寫到虛擬儲存區以外;該文沒有提到本 CVE。 - 部分 GitHub 釋出頁面曾顯示年份為 2024,但 GitHub API 與 pnpm 部落格都是 2026-05-27。
- 相關弱點類型:CWE-23(相對路徑穿越)。
驗證紀錄 已人工審稿、核對來源;尚未在我們的環境重現
| 人工審稿 | 2026-09-24 |
|---|
驗證紀錄只寫環境與結果,不公開重現步驟或可攻擊他人系統的程式。詳見 政策.
來源
- 安全公告Transitive dependency alias path traversal allows project path override via symlink replacement (GHSA-hwx4-2j3j-g496) · pnpm (GitHub), 2026-05-28 · 查閱 2026-09-24
- 安全公告GHSA-hwx4-2j3j-g496 repository advisory (API) · GitHub / pnpm, 2026-05-28 · 查閱 2026-09-24
- 安全公告GHSA-hwx4-2j3j-g496 global advisory (API) · GitHub, 2026-06-26 · 查閱 2026-09-24
- CVE / NVD / OSVCVE-2026-50016 · CVE Program, 2026-06-25 · 查閱 2026-09-24
- CVE / NVD / OSVCVE-2026-50016 record JSON · CVE Program (CNA GitHub_M, CISA ADP), 2026-06-25 · 查閱 2026-09-24
- CVE / NVD / OSVNVD - CVE-2026-50016 · NIST NVD, 2026-06-25 · 查閱 2026-09-24
- CVE / NVD / OSVNVD CVE API record for CVE-2026-50016 · NIST NVD, 2026-06-25 · 查閱 2026-09-24
- 修補 commit / 版本Release v10.34.0 · pnpm (GitHub), 2026-05-27 · 查閱 2026-09-24
- 修補 commit / 版本Release v11.4.0 · pnpm (GitHub), 2026-05-27 · 查閱 2026-09-24
- 修補 commit / 版本Release v10.33.4 · pnpm (GitHub) · 查閱 2026-09-24
- 廠商說明pnpm 11.4 · pnpm, 2026-05-27 · 查閱 2026-09-24
- 廠商說明pnpm 11.11-11.14 · pnpm, 2026-07-18 · 查閱 2026-09-24
- 廠商說明pnpm install · pnpm · 查閱 2026-09-24
- 安全公告CVE-2026-50016: pnpm: Transitive dependency alias path traversal allows project path override via symlink replacement · GitLab Advisory Database · 查閱 2026-09-24
媒體簡報
一句話
pnpm 是廣泛使用的 JavaScript 套件管理工具。它在安裝套件時有一個路徑穿越漏洞:相依樹深處的惡意套件可以把專案裡的資料夾(例如 git hook 或建置輸出)換成指向自己的符號連結,而許多人用來防範惡意套件的 --ignore-scripts 選項擋不住這件事。修補版 10.34.0 與 11.4.0 已於 2026 年 5 月 27 日釋出。目前沒有來源指出它已遭實際利用。
關鍵數字
- 嚴重度
- CVSS 3.1 8.8(GitHub/CNA 評分;NVD 未自行評分) services.nvd.nist.gov
- 修補版本
- 10.34.0 與 11.4.0(2026-05-27 釋出) github.com
- 維護者公告
- GHSA-hwx4-2j3j-g496,2026-05-28 公開 api.github.com
- CVE 公開
- 2026-06-25 cveawg.mitre.org
- 弱點類型與回報者
- CWE-23 相對路徑穿越;由 aszx87410 回報 github.com
已確認
- 受影響的 pnpm 在安裝時會把間接相依套件的別名當成路徑,可能把專案路徑換成指向惡意套件的符號連結。
- 維護者公告、CVE 與 NVD 都指出使用 --ignore-scripts 仍會發生這個路徑替換。
- 修補版 10.34.0 與 11.4.0 會拒絕含路徑穿越的別名。
- CISA 的 SSVC 評估為:有公開概念驗證、不可自動化、技術影響為完全。
尚未確認 / 說法不一
- 10.x 受影響範圍:CVE 結構化資料寫 <10.33.4,但維護者公告、CVE 描述文字與 NVD 的 CPE 設定都是 <10.34.0;10.33.4 的釋出說明沒有這項修補,本頁採用 <10.34.0。
- 沒有來源回報實際遭利用。本站 2026-09-24 的 CISA KEV 快照中沒有這個 CVE;未列入 KEV 不代表沒有被利用。
- 用舊的 lockfile(--frozen-lockfile)安裝時是否也會觸發,來源沒有說明。
- 對應的修補 commit 或 PR 沒有公開連結。
可引用的一句話
--ignore-scripts 關掉的是套件自己跑程式的權利,但這次動手寫檔案的是套件管理器本身。
圖片
引用時請標示「PlainCVE」並附上本頁連結。 完整引用格式見下方「如何引用本頁」。有事實錯誤請回報.
pnpm 相依套件別名路徑穿越:間接相依套件可在安裝時把專案資料夾換成符號連結,--ignore-scripts 也擋不住 pnpm 是廣泛使用的 JavaScript 套件管理工具。它在安裝套件時有一個路徑穿越漏洞:相依樹深處的惡意套件可以把專案裡的資料夾(例如 git hook 或建置輸出)換成指向自己的符號連結,而許多人用來防範惡意套件的 --ignore-scripts 選項擋不住這件事。修補版 10.34.0 與 11.4.0 已於 2026 年 5 月 27 日釋出。目前沒有來源指出它已遭實際利用。 關鍵數字: - 嚴重度:CVSS 3.1 8.8(GitHub/CNA 評分;NVD 未自行評分)(https://services.nvd.nist.gov/rest/json/cves/2.0?cveId=CVE-2026-50016) - 修補版本:10.34.0 與 11.4.0(2026-05-27 釋出)(https://github.com/pnpm/pnpm/security/advisories/GHSA-hwx4-2j3j-g496) - 維護者公告:GHSA-hwx4-2j3j-g496,2026-05-28 公開(https://api.github.com/repos/pnpm/pnpm/security-advisories/GHSA-hwx4-2j3j-g496) - CVE 公開:2026-06-25(https://cveawg.mitre.org/api/cve/CVE-2026-50016) - 弱點類型與回報者:CWE-23 相對路徑穿越;由 aszx87410 回報(https://github.com/pnpm/pnpm/security/advisories/GHSA-hwx4-2j3j-g496) 已確認: - 受影響的 pnpm 在安裝時會把間接相依套件的別名當成路徑,可能把專案路徑換成指向惡意套件的符號連結。 - 維護者公告、CVE 與 NVD 都指出使用 --ignore-scripts 仍會發生這個路徑替換。 - 修補版 10.34.0 與 11.4.0 會拒絕含路徑穿越的別名。 - CISA 的 SSVC 評估為:有公開概念驗證、不可自動化、技術影響為完全。 尚未確認 / 說法不一: - 10.x 受影響範圍:CVE 結構化資料寫 <10.33.4,但維護者公告、CVE 描述文字與 NVD 的 CPE 設定都是 <10.34.0;10.33.4 的釋出說明沒有這項修補,本頁採用 <10.34.0。 - 沒有來源回報實際遭利用。本站 2026-09-24 的 CISA KEV 快照中沒有這個 CVE;未列入 KEV 不代表沒有被利用。 - 用舊的 lockfile(--frozen-lockfile)安裝時是否也會觸發,來源沒有說明。 - 對應的修補 commit 或 PR 沒有公開連結。 「--ignore-scripts 關掉的是套件自己跑程式的權利,但這次動手寫檔案的是套件管理器本身。」— PlainCVE https://plaincve.date/vulns/cve-2026-50016-pnpm-alias-path-traversal
如何引用本頁
本文採 CC BY 4.0,轉載請保留署名與連結。
PlainCVE 團隊(2026)。《pnpm 相依套件別名路徑穿越:間接相依套件可在安裝時把專案資料夾換成符號連結,--ignore-scripts 也擋不住》。PlainCVE。https://plaincve.date/vulns/cve-2026-50016-pnpm-alias-path-traversal(查閱日期:YYYY-MM-DD)BibTeX
@misc{cve202650016pnpmaliaspathtraversal2026,
title = {pnpm 相依套件別名路徑穿越:間接相依套件可在安裝時把專案資料夾換成符號連結,--ignore-scripts 也擋不住},
author = {PlainCVE 團隊},
year = {2026},
howpublished = {PlainCVE},
url = {https://plaincve.date/vulns/cve-2026-50016-pnpm-alias-path-traversal},
note = {更新於 2026-09-24}
}