2023/03/18

[npm] 解決 npm glob-parent 版本過舊的安全性問題

問題

最近在一個舊的專案採用 webpack 4.x 的版本,最近要修改檔案,要在能正常執行下,想要一併更新一下開發套件版本。

原本環境:

  • typescript 3.9.5
  • ts-loader 7.0.5
  • webpack 4.43.0
  • webpack-cli 4.9.1

執行 npm audit fix 之後,已修正不少套件相依版本,但仍有安全性相依版本的問題,即便依照指令再做一次 fix 的動作仍無法更新修正。

glob-parent  <5.1.2
Severity: high
glob-parent before 5.1.2 vulnerable to Regular Expression Denial of Service in enclosure regex - https://github.com/advisories/GHSA-ww39-953v-wcq6
fix available via `npm audit fix`
node_modules/watchpack-chokidar2/node_modules/glob-parent
  chokidar  1.0.0-rc1 - 2.1.8
  Depends on vulnerable versions of glob-parent
  node_modules/watchpack-chokidar2/node_modules/chokidar
    watchpack-chokidar2  *
    Depends on vulnerable versions of chokidar
    node_modules/watchpack-chokidar2
      watchpack  1.7.2 - 1.7.5
      Depends on vulnerable versions of watchpack-chokidar2
      node_modules/watchpack
        webpack  4.44.0 - 4.46.0
        Depends on vulnerable versions of watchpack
        node_modules/webpack

由於 GitHub 的機器人找出這個安全性問題,而且風險值很高,雖然不更新時,可正確產出結果,但是總是有個風險在。

當然直接升級 webpack v5.x 後,此安全問題可以解決,但是在跑專案時會出錯,以暫時不升版的狀況下,該如何更新版本而不出錯才是當前要解決的問題。

解決方法

在 package.json 加上以下 overrides 的覆蓋版本設定,再做 npm update 即可

{
  ...

  "overrides": {
    "chokidar": "3.5.3",
    "glob-parent": "6.0.2"
  }
}

上述版本是有跳大的版號,所以需要注意是否有 break change,再執行專案看看是否能正常運行。

還好,沒有任何錯誤訊息,安全性更新完成!

最後更新完成的版本環境:

  • typescript 5.0.2
  • ts-loader 8.4.0
  • webpack 4.46.0
  • webpack-cli 4.10.0

p.s. 若使用 webpack v4.x 版本, ts-loader 的版本可升到 8.x (webpack v5.x 搭 ts-loader 9.x 版本)

參考連結