【短文】解決 Vue.js 專案中 @Vue/Cli 工具鏈夾帶 peacenotwar 惡意模組的問題(2022/03/15 之前)

Photo by Olga Subach on Unsplash

最近在練習改寫一些現成的 Vue.js 練習專案,並把其中一個結果丟到 Github 上。結果昨晚收到好心人警告,說我的相依套件內含有惡意軟體。這是怎麼回事?

從對方提供的訊息查了一下,發現原來是加州一位開發者 RIAEvangelist(本名 Brandon Nozaki Miller,在加州 Orca 這間公司擔任前端主任,同時還是個電動機車賽車手)寫了一個叫做 peacenotwar 的 NPM 模組,會在使用者的命令列顯示一段抗議俄國入侵烏克蘭的訊息,並在桌面寫入一個有相關訊息的檔案。

本來該模組幾乎沒什麼人下載,但 RIAEvangelist 接著將這模組夾帶到他開發的 node-ipc 模組中 — — 而此熱門通訊模組正好是眾多工具的相依套件,當中包括 Vue.js 的專案工具鏈套件 @Vue/Cli。更可怕的是,較新版 node-ipc 還會針對 IP 位於俄羅斯與白俄的使用者進行攻擊,將他們電腦中的檔案文字置換成愛心。

總之,網路安全公司 Snyk 將這弱點評為 9.8/10 的嚴重等級,且雖然相關套件很快做出修正,但已有大量使用者在這段短時間內下載了該模組。Vue 作者尤雨溪有提到這不影響終端使用者(畢竟這不會包含在編譯好的前端網站程式碼中),但使用該工具的人身在俄國或白俄,或者不巧用了俄國 VPN 的話可能就倒楣了。

Brandon Nozaki Miller 本人給這軟體發明一個詞「protestware」,並堅稱它無害。但不管你反不反戰,這種由開發者本人在開源工具鏈植入惡意軟體的作為確實引起了軒然大波,對於未來開源軟體的安全性和維護者的可信度不免也埋下了隱憂。

若你的專案是使用 Vue/Cli 產生,可以到 package-lock.json 查一下有沒有 peacenotwar 模組。解決方式也不難,就是更新 Vue/Cli 就好,因為 @Vue/Cli 5.0.3 版(發佈於 3/15)已經將 node-ipc 鎖在安全的 9.2.1 版,杜絕了意外升級到惡意版的可能性:

npm install -g @vue/cli@latest
npm install @vue/cli@latest
npm uninstall @vue/cli

第一行更新全域 Vue/Cli,第二行則是在專案本地端安裝新的 Vue/Cli,我們其實不需要它(所以接著解除安裝),但此舉會強迫專案本身的 Vue/Cli 相關套件更新,這樣應該就能去掉對 peacenotwar 模組的倚賴。

以我自己的專案為例,一開始 package-lock.json 裡面果然有 peacenotwar 存在。但如上更新過後,peacenotwar 便消失了,相關內容也變成如下:

"node_modules/@vue/cli-shared-utils": {
"version": "5.0.3",
"resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-5.0.3.tgz",
"integrity": "sha512-xAHxFDYVohHWXOLdmGvka3ffQcRgKdACempFQkGJX74Q7OBf0zPf5WH+vQXhlR17eA3LmWdY+Nv8OfsIGim6Fg==",
"dev": true,
"dependencies": {
"chalk": "^4.1.2",
"execa": "^1.0.0",
"joi": "^17.4.0",
"launch-editor": "^2.2.1",
"lru-cache": "^6.0.0",
"node-fetch": "^2.6.7",
"node-ipc": "9.2.1",
"open": "^8.0.2",
"ora": "^5.3.0",
"read-pkg": "^5.1.1",
"semver": "^7.3.4",
"strip-ansi": "^6.0.0"
}
},

網路上也有提到另一種方式,是在 package.json 限制 node-ipc 版本:

"overrides": {
"node-ipc@>9.2.1 <10": "9.2.1",
"node-ipc@>10.1.0": "10.1.0"
}

node-ipc 9.2.1 和 10.1.0 是被認為無害的版本。

最後為了保險一點,可把專案的 node_modules 資料夾整個砍掉,再重新安裝套件:

npm install

然後也許就是去本機搜尋一下全域 NPM 套件有沒有 peacenotwar 模組吧,同樣把它刪了。

Photo by Todd Trapani on Unsplash

--

--

--

My writing power is 100% generated by free coffee. (github.com/alankrantas, www.hackster.io/alankrantas)

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Alan Wang

Alan Wang

My writing power is 100% generated by free coffee. (github.com/alankrantas, www.hackster.io/alankrantas)

More from Medium

Apollo Composable with Vue Storybook Stories

Installing the Vue i18n CLI plugin for Vue 3 — in a mono repo

Monorepo vue 3 migration

Address Autocomplete and Verification with Lob’s Vue Component Library