NPM釣魚供應鏈攻擊
NPM 又有套件被攻擊啦,這次是直接鎖定特定開發者進行攻擊,利用釣魚的方式駭入他們的 NPM 帳號然後發版。
這次被駭的對象 Josh Junon 底下的套件加起來,一週有 20 億以上的下載次數,會有這麼多下載次數主要還是套件一層一層依賴的關係,例如說幫 terminal 輸出上色的 chalk 以及 ansi-styles,這兩個加起來一週就 6 億下載次數了,有許多套件都有用它們。
那這個釣魚是怎麼釣的呢?
攻擊者註冊了一個 npmjs[dot]help 的 domain,寄了一封「請更新 2FA」的信件給某些開發者,信中說系統偵測你已經 12 個月沒有更新 2FA,由於安全性的考量,若是 9/10 還沒更新的話,帳號將暫時被鎖住以確保安全,請儘速更新你的 2FA。
老實說看起來還真的滿有這麼一回事的,信件本身也做得十分逼真。總之呢,點進去連結以後大概就是要你登入然後更換 2FA,輸入完帳號密碼跟當前 2FA 的時候,駭客就把帳號盜走拿去發布新版惡意套件了。
而這個惡意套件與前幾天提過的 Nx 不同,Nx 的攻擊方式是在開發者主動安裝套件時去攻擊,而這次的攻擊是在 source code 裡面藏一些後門,在以網頁的形式被打開時作用。具體內容是針對加密貨幣,去 hook 各種函式,然後在 sign transaction 以前將地址改掉,錢就轉到駭客那邊去了。
由於這幾個套件很多人用,所以當你的網站安裝到新版套件時,就會自動被植入這個後門,這就是供應鏈攻擊的威力。
可能有些讀者會好奇,怎麼又是 NPM?
其中一個原因大概是這種套件疊床架屋的現象在 NPM 圈特別普遍,2016 年的 left-pad 事件應該不少人經歷過,一個功能超簡單,只是幫字串填充空格的套件,被一堆 library 使用,然後上層又有更多 library,因此這個套件被刪掉時,Babel 壞了,Webpack 也壞了,React 也跟著一起壞,一個接著一個通通壞掉。
其他語言內建的功能以及函式庫相較完整,許多功能不需要額外裝套件就可以用了,但是許多 JavaScript 的 library 靠一堆小套件層層疊起來,導致的結果就是只要攻陷底層那些小專案,就能影響許多上層的東西。
至於身為開發者的我們,要防禦這種攻擊的話,最有效的方式之一大概就是鎖版號了,在 package.json 裡面把版號鎖死,要更新的話手動更新,關掉自動更新功能。
不過就算你沒有自己鎖,只要 lock file 存在,安裝的時候就會照 lock file 裡的安裝,因此影響也不大。想要更嚴謹的話,可以用 npm ci 取代 npm install,當它檢查到你的 package-lock.json 跟 package.json 裡的版本不一致的時候會報錯,要你手動更新 lock file 才會生效,避免意外的升級。原理是類似的,就是不要自動更新就沒事。
還有些更大的公司可能會在內部自己架一個 registry,套件都只能從這裡裝,而內部會定期從外部同步套件回來,在同步前先檢查掃描、審核以及檢查等等,藉此來確保內部使用到的東西都是安全的。
最後呢,這次攻擊跟上次提的 Nx 攻擊,瞄準的目標之一都是加密貨幣,無論是竄改交易也好,偷取私鑰也好,有在用的人記得愛用冷錢包,並且在交易前確保內容是正確的(冷錢包上顯示的目的地要是正確的)。GossiTheDog 也有一篇相關整理可以參考。
評論