前兩天比特幣暴跌的訊息讓投資者們無不捶胸頓足,但屋漏偏逢連夜雨,最近國外又有網友曝光,event-stream庫存在惡意程式碼,其主要目的就是竊取使用者數字錢包裡包括比特幣在內的數字貨幣。
事件被證實後,儘管npm官網已對其進行下架處理,但由於實際生產應用中,event-stream庫屬於一個跨平臺的應用,其影響會比較廣泛,所以360-CERT建議相關使用者,特別是網際網路相關的企業,應該針對自身IDC線上環境、辦公網環境進行安全評估。
此外,如果你是 vue 開發者,請務必檢查一下自己的專案;如果不是,也不能掉以輕心,因為很多流行模組比如 nodemon、npm-run-all、ps-tree 也都受到了影響。
回顧事件始末:
2018年11月21日,一位名為 FallingSnow的使用者在github Issuse上對知名JavaScript應用庫event-stream進行了質疑。原因是event-stream 包突然多出了一個名為 flatmap-stream 的依賴項,而這個依賴項卻包含有竊取使用者數字錢包的惡意程式碼。
從該Issuse中得知,大約三個月前,由於缺乏時間和興趣,event-stream原作者dominictarr將其開發交給另一位名為@Right9ctrl的程式設計師。但Right9ctrl卻在接管了此模組後,釋出了包含新依賴關係的Event-Stream 3.3.6 -Flatmap-Stream0.1.1。 其中,Flatmap-Stream v0.1.1 正是是包含惡意程式碼的npm package。
據分析,該package中的惡意程式碼主要會竊取使用者的錢包資訊和私鑰,並將其傳送到copayapi.host的8080埠上。
影響範圍
Event-Stream 3.3.6版本
event-stream是一個非常受歡迎的JavaScript庫,在npm.org儲存庫上每週下載量超過200萬。所以,這一惡意依賴在2.5個月內都未被發現,其所造成的惡意影響可想而知,9月1日至今已被下載2225w次。
npm 已經將惡意的Flatmap-Stream進行下架處理,已經無法從npm中再進行相關的安裝,以減小影響。
但已經安裝的Event-Stream請及時處理,很有可能已經在遭受影響。
此次事件的影響範圍大,危害等級高。建議廣大使用者及時根據修復建議進行修復和自查。
Copay官方作出確認5.0.2-5.1.0的Copay和Bitpay受影響。
在實際的程式碼分析中發現,受影響的第二個關鍵還在於npm專案的description欄位是否為A Secure Bitcoin Wallet。
而目前只在bitpay/copay專案發現滿足該條件。
修復建議
可以通過如下方式對自己所使用的event-stream進行檢測
$ npm ls event-stream flatmap-stream
...
flatmap-stream@0.1.1
...
可以對event-stream進行降級版本到3.3.4以緩解此事件帶來的影響
降級方式如下
npminstallevent-stream@3.3.4
再通過上述命令可以檢查是否降級成功
360CERT將在CERT官網隨後給出受影響package的相關統計,敬請期待。
程式碼分析
根據flatmap-stream/package.json匯出的main
"main": "index.min.js",
在這其中有一段index.js所沒有的額外程式碼
process["env"]["npm_package_description"];的獲取測試
這段程式碼的主要作用翻譯如下
解密的n[0]
解密的n[1]
其中
惡意程式碼主要作用 通過重新覆蓋bitcore-wallet-client/lib/credentials.js中getKeysFunc方法進行資訊的傳送
所使用的資訊如下:
傳送資訊所使用的公鑰
"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxoV1GvDc2FUsJnrAqR4C\nDXUs/peqJu00casTfH442yVFkMwV59egxxpTPQ1YJxnQEIhiGte6KrzDYCrdeBfj\nBOEFEze8aeGn9FOxUeXYWNeiASyS6Q77NSQVk1LW+/BiGud7b77Fwfq372fUuEIk\n2P/pUHRoXkBymLWF1nf0L7RIE7ZLhoEBi2dEIP05qGf6BJLHPNbPZkG4grTDv762\nPDBMwQsCKQcpKDXw/6c8gl5e2XM7wXhVhI2ppfoj36oCqpQrkuFIOL2SAaIewDZz\nLlapGCf2c2QdrQiRkY8LiUYKdsV2XsfHPb327Pv3Q246yULww00uOMl/cJ/x76To\n2wIDAQAB\n-----END PUBLIC KEY-----";
傳送資訊的地址(寫死的域名和ip)
域名 copayapi.host IP 111.90.151.134
時間線
2018-11-21 @FallingSnow在專案Issue中提出問題
2018-11-27 360CERT釋出預警報告
2018-11-27 360CERT釋出分析報告
參考連結
1. 黑客植入後門在流行的JavaScript庫進行比特幣資金竊取
https://www.zdnet.com/article/hacker-backdoors-popular-javascript-library-to-steal-bitcoin-funds/#ftag=RSSbaffb68
2. Malicious code found in npm package event-stream downloaded 8 million times in the past 2.5 months | Snyk
https://snyk.io/blog/malicious-code-found-in-npm-package-event-stream
3. I don't know what to say. · Issue #116 · dominictarr/event-stream
https://github.com/dominictarr/event-stream/issues/116
4. add flat map · dominictarr/event-stream@e316336
https://github.com/dominictarr/event-stream/commit/e3163361fed01384c986b9b4c18feb1fc42b8285
5. npm-stat: event-stream
https://npm-stat.com/charts.html?package=event-stream&from=2018-09-01&to=2018-11-27