// 威脅簡報

pnpm 相依套件別名路徑穿越:間接相依套件可在安裝時把專案資料夾換成符號連結,--ignore-scripts 也擋不住

CVSS
8.8 HIGH
CISA KEV
未列入
弱點類型
CWE-23
主題
供應鏈

PlainCVE 團隊 · 發布 2026-09-24 · AI 輔助 · 媒體簡報 ↓

人工審稿 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)
  • 廠商 / 維護者pnpm 安全公告:升級到修補版本github.com
  • 本站判斷檢查專案路徑是否變成符號連結,是本站依漏洞原理提出的建議,官方沒有提供檢查方法
受影響版本10.34.0 以前的所有版本;11.0.0 以上、11.4.0 以前(依維護者 GHSA;CVE 結構化資料寫 <10.33.4,與其描述文字不一致)
查看依據:來源說法不一(4)
  • CVE 紀錄說法不一CVE 紀錄的說明文字:10.34.0 與 11.4.0 以前受影響Prior to 10.34.0 and 11.4.0, pnpm allows a transitive dependency alias from registry package metadata to contain path traversal segments.cveawg.mitre.org
  • CVE 紀錄說法不一同一份 CVE 紀錄的結構化欄位把 10.x 的上限寫成低於 10.33.4,與說明文字不一致"version":"< 10.33.4"cveawg.mitre.org
  • 漏洞資料庫GitLab 漏洞資料庫:10.34.0 以前,以及 11.0.0 起、11.4.0 以前All versions before 10.34.0, all versions starting from 11.0.0 before 11.4.0advisories.gitlab.com
  • 廠商 / 維護者pnpm 自己的安全公告:在 pnpm 11.2.1 重現This was reproduced with `pnpm@11.2.1`.github.com
修好的版本10.34.0 以上(10.x);11.4.0 以上(11.x)
查看依據(3)
  • 廠商 / 維護者pnpm 10.34.0 發布說明:拒絕含路徑穿越片段的別名Reject dependency aliases that contain path-traversal segmentsapi.github.com
  • 廠商 / 維護者pnpm 11.4.0 發布說明:同樣的修補Reject dependency aliases that contain path-traversal segmentsapi.github.com
  • CVE 紀錄CVE 紀錄:10.34.0 與 11.4.0 已修補This vulnerability is fixed in 10.34.0 and 11.4.0.cveawg.mitre.org
CVSS 向量
顯示完整向量CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
時間點
  • 首次公開 2026-05-28
CISA KEV未列入(未列入 KEV 不代表沒有被利用)
查看依據(2)
  • 本站判斷本站 2026-09-24 的 CISA KEV 快照沒有這個 CVE;未列入不代表沒有被利用
  • CERT / 政府CISA 在 CVE 紀錄中的評估:已有公開概念驗證(poc),這不代表已遭實際利用"Exploitation":"poc"cveawg.mitre.org

藍隊應對手冊

確認、修補 / 緩解、應變、強化。版本符合受影響條件不等於已被入侵;檢查沒有結果也不等於安全,每一項都有能證明與不能證明的範圍。標記的步驟對應下方攻擊流程裡可以擋下攻擊的那一步。

DETECT確認我受影響嗎?有沒有入侵跡象?
  1. 01確認 pnpm 版本

    10.x 需要 10.34.0 以上,11.x 需要 11.4.0 以上。開發機與 CI 都要查;CI 可能固定使用舊版。

    唯讀查詢
    pnpm --version
  2. 02檢查專案路徑是否變成符號連結(PlainCVE 建議)

    官方沒有提供偵測方法或入侵指標。依公告列出的受影響路徑,檢查它們是否變成指向 node_modules 的符號連結。正常專案裡這些路徑通常是一般資料夾。

    唯讀查詢
    find .git/hooks .husky .githooks scripts tools bin tests dist .github/actions -maxdepth 1 -type l 2>/dev/null
MITIGATE修補 / 緩解先修補;還不能修補時先擋住
  1. 01升級到 10.34.0 或 11.4.0 以上

    修補版會在讀取套件中繼資料時、以及建立符號連結時,都拒絕含路徑穿越的別名。官方沒有提供升級以外的暫時解法。

RESPOND應變發現入侵跡象時
  1. 01發現可疑符號連結:當作程式碼可能已被執行

    這是 PlainCVE 的推論,不是官方指引:從被換掉的路徑執行過的 hook 或腳本,應視為執行了不受信任的程式碼。移除符號連結、用已修補的 pnpm 重新安裝,並找出引入該別名的套件。

  2. 02檢查憑證與已發佈的版本(預防性)

    官方沒有輪替指引。若確認有不受信任的程式碼跑過,輪替該機器或 CI 能存取的憑證,並檢查期間發佈過的套件內容。這是預防性建議。

HARDEN強化長期避免同類問題
  1. 01不要把 --ignore-scripts 當成萬靈丹

    它只阻止套件在安裝時執行腳本,不阻止套件管理器本身把檔案寫到不該寫的地方,也不阻止之後才被觸發的程式碼。

  2. 02在 CI 固定並定期更新 pnpm 版本

    同一批修補版也修了其他幾個 pnpm 安全問題;保持套件管理器本身是最新版本和更新相依套件一樣重要。

  3. 03審查 lockfile 中新增的間接相依套件

    惡意別名可以來自你沒有直接選的套件;在程式碼審查時留意 lockfile 裡突然出現的陌生套件或別名。

完整修復步驟與說明
  1. 先升級 pnpm 本身,再重新安裝相依套件。 用你原本安裝 pnpm 的方式,升到 10.34.0 以上(10.x)或 11.4.0 以上(11.x),再用 pnpm --version 確認。CI 若在設定中固定了 pnpm 版本,也要一起改。
  2. 順序很重要。 用舊版 pnpm 安裝過不明相依套件的專案,升級後先檢查上表那些路徑有沒有變成符號連結,確認乾淨後再 commit、建置或發佈,避免先觸發了被換掉的 hook 或腳本。
  3. 沒有官方暫時解法。 公告除了升級以外沒有提供其他緩解方式。
  4. 同一批修補版還修了幾個不同的 pnpm 安全問題(拒絕指向套件外的 patch 檔、拒絕非 SHA 的 git commit 欄位、將登錄庫憑證限定在對應登錄庫、tarball 完整性不符時直接失敗),這是升級的另一個理由。

攻擊流程

從左到右是攻擊發生的順序。藍色盾牌代表這一步可以被擋下,越早擋下越好。點圖示可看細節。

pnpm 相依套件別名路徑穿越:間接相依套件可在安裝時把專案資料夾換成符號連結,--ignore-scripts 也擋不住: 1. 攻擊者發佈帶有路徑穿越別名的惡意套件 → 2. 開發者或 CI 執行 pnpm install → 3. pnpm 把別名當成路徑,把專案裡的路徑換成符號連結 → 4. 之後的 git commit、測試、建置或 CI 使用了被換掉的路徑 → 5. 被竄改的建置結果可能被發佈出去CVE-2026-50016 · pnpm 相依套件別名路徑穿越:間接相依套件可在安裝時把專案資料夾換成符號連結,--ignore-scripts 也擋不住攻擊者你的系統外部攻擊者發佈帶有路徑穿越別名的惡意套件 — 套件在登錄庫的中繼資料裡宣告一個相依套件別名,別名中含有「..」(往上一層資料夾)。再讓一個看似正常的套件去依賴它。 1攻擊者發佈帶有路徑穿越別名的惡意套件開發者或 CI 執行 pnpm install — 惡意套件可以藏在間接相依套件裡。就算加了 --ignore-scripts 也一樣會進行下一步,因為這一步不需要執行任何腳本。 2開發者或 CI 執行pnpm installpnpm 把別名當成路徑,把專案裡的路徑換成符號連結 — 舊版沒有檢查最終路徑是否留在 node_modules 內,於是 .git/hooks、.husky、scripts/、.github/actions/、dist/ 等路徑可能被換成指向攻擊者套件資料夾的符號連結。這一步只改檔案,不執行程式。 3pnpm 把別名當成路徑,把專案裡的路徑換成符號連結之後的 git commit、測試、建置或 CI 使用了被換掉的路徑 — 攻擊者的內容要到這時才可能被執行,例如 git hook 在 commit 時觸發,或 pnpm test、pnpm run build、CI 步驟呼叫被換掉的腳本。 4之後的 git commit、測試、建置或 CI 使用了被換掉的路徑被竄改的建置結果可能被發佈出去 — 公告把 dist/ 與 pnpm publish 列為可能的觸發點;若發佈前的輸出被換掉,下游使用者可能收到被竄改的套件。這是依公告影響清單的推論。 5被竄改的建置結果可能被發佈出去攻擊路徑可在此擋下PlainCVE · plaincve.date/vulns/cve-2026-50016-pnpm-alias-path-traversal · CC BY 4.0
圖片可自由用於報導與教學,採 CC BY 4.0,圖上已附出處。
  1. 攻擊者

    攻擊者發佈帶有路徑穿越別名的惡意套件

    套件在登錄庫的中繼資料裡宣告一個相依套件別名,別名中含有「..」(往上一層資料夾)。再讓一個看似正常的套件去依賴它。

    防禦: 升級後的 pnpm 在讀取套件中繼資料時就會拒絕含路徑穿越的別名。

  2. 你的系統

    開發者或 CI 執行 pnpm install

    惡意套件可以藏在間接相依套件裡。就算加了 --ignore-scripts 也一樣會進行下一步,因為這一步不需要執行任何腳本。

    防禦: 升級到 10.34.0 / 11.4.0 以上;審查 lockfile 裡新出現的間接相依套件。

  3. 你的系統

    pnpm 把別名當成路徑,把專案裡的路徑換成符號連結

    舊版沒有檢查最終路徑是否留在 node_modules 內,於是 .git/hooks、.husky、scripts/、.github/actions/、dist/ 等路徑可能被換成指向攻擊者套件資料夾的符號連結。這一步只改檔案,不執行程式。

    防禦: 修補版在建立符號連結時也會再次拒絕穿越的路徑。可定期檢查這些路徑是否變成指向 node_modules 的符號連結。

  4. 你的系統

    之後的 git commit、測試、建置或 CI 使用了被換掉的路徑

    攻擊者的內容要到這時才可能被執行,例如 git hook 在 commit 時觸發,或 pnpm test、pnpm run build、CI 步驟呼叫被換掉的腳本。

    防禦: 不要只依賴 --ignore-scripts;在乾淨、已修補的環境中建置與執行 CI。

  5. 外部

    被竄改的建置結果可能被發佈出去

    公告把 dist/ 與 pnpm publish 列為可能的觸發點;若發佈前的輸出被換掉,下游使用者可能收到被竄改的套件。這是依公告影響清單的推論。

    防禦: 發佈前確認 dist/ 不是符號連結,並在已修補的 CI 中發佈。

影響範圍

版本線受影響修補版本
10.x 及更早10.34.0 以前10.34.0
11.x11.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.githooksscripts/tools/bin/tests/.github/actions/<名稱>、發佈前的 dist/,以及 node_modules/.bin。這類弱點稱為相對路徑穿越(CWE-23)。

要注意時間點:安裝這一步只是改檔案,不代表程式會在安裝時執行。 攻擊者的內容要等到之後有人或 CI 用到被換掉的路徑才可能執行,例如 git commit 觸發 git hook、pnpm testpnpm 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-25CVE-2026-50016 公開;NVD 收錄
2026-06-26GitHub 全域公告資料庫收錄並審核;CVE 紀錄更新
2026-06-29NVD 最後修改(已分析)

延伸閱讀

  • 受影響版本的資料不一致: 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

驗證紀錄只寫環境與結果,不公開重現步驟或可攻擊他人系統的程式。詳見 政策.

來源

  1. 安全公告Transitive dependency alias path traversal allows project path override via symlink replacement (GHSA-hwx4-2j3j-g496) · pnpm (GitHub), 2026-05-28 · 查閱 2026-09-24
  2. 安全公告GHSA-hwx4-2j3j-g496 repository advisory (API) · GitHub / pnpm, 2026-05-28 · 查閱 2026-09-24
  3. 安全公告GHSA-hwx4-2j3j-g496 global advisory (API) · GitHub, 2026-06-26 · 查閱 2026-09-24
  4. CVE / NVD / OSVCVE-2026-50016 · CVE Program, 2026-06-25 · 查閱 2026-09-24
  5. CVE / NVD / OSVCVE-2026-50016 record JSON · CVE Program (CNA GitHub_M, CISA ADP), 2026-06-25 · 查閱 2026-09-24
  6. CVE / NVD / OSVNVD - CVE-2026-50016 · NIST NVD, 2026-06-25 · 查閱 2026-09-24
  7. CVE / NVD / OSVNVD CVE API record for CVE-2026-50016 · NIST NVD, 2026-06-25 · 查閱 2026-09-24
  8. 修補 commit / 版本Release v10.34.0 · pnpm (GitHub), 2026-05-27 · 查閱 2026-09-24
  9. 修補 commit / 版本Release v11.4.0 · pnpm (GitHub), 2026-05-27 · 查閱 2026-09-24
  10. 修補 commit / 版本Release v10.33.4 · pnpm (GitHub) · 查閱 2026-09-24
  11. 廠商說明pnpm 11.4 · pnpm, 2026-05-27 · 查閱 2026-09-24
  12. 廠商說明pnpm 11.11-11.14 · pnpm, 2026-07-18 · 查閱 2026-09-24
  13. 廠商說明pnpm install · pnpm · 查閱 2026-09-24
  14. 安全公告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 關掉的是套件自己跑程式的權利,但這次動手寫檔案的是套件管理器本身。

圖片

下載分享圖(PNG) · 攻擊流程圖(可下載)

引用時請標示「PlainCVE」並附上本頁連結。 完整引用格式見下方「如何引用本頁」。有事實錯誤請回報.

如何引用本頁

本文採 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}
}