緣起
這兩天,一個被廣泛應(yīng)用的javascript第三方庫“event-steram”爆出被人植入惡意代碼,能夠竊取到用戶的錢包信息,造成財產(chǎn)(虛擬貨幣)受損。
爆出的鏈接在這里;360安全團(tuán)隊對于此次漏洞的分析做出了分析。(源碼分析那部分其實沒說太明白,至少我是沒看懂。。)
總的來說,這個漏洞主要針對的是國外一款熱錢包應(yīng)用,對其他項目不會有太大影響。但一想到自己的項目里有這么個“病毒”存在,心里總感覺別扭,所以還是盡早清除為妙。
檢測本地代碼是否有此漏洞
第一步,全局搜索flatmap-stream,找到哪些項目中使用到了
sudo find / -name flatmap-stream
如果你本地沒有項目用到這個庫,那么恭喜你沒有被感染;如果你搜索結(jié)果里顯示有項目用到了,就需要進(jìn)行下面的第二步了。
第二步,進(jìn)入該項目目錄下,列出event-stream和flatmap-stream的版本號
remix-ide$ npm ls event-stream flatmap-stream
remix-ide@0.7.5 /Users/Franklin/Documents/blockchain/code/ethereum/remix-ide
└─┬ npm-run-all@4.1.3
└─┬ ps-tree@1.1.0
└─┬ event-stream@3.3.6
└── flatmap-stream@0.1.1
如果event-stream的版本號是3.3.6,并且flatmap-stream的版本號是0.1.1,那就說明是已經(jīng)被感染了。
修復(fù)方法
這個漏洞在爆出來之后,大多數(shù)依賴event-stream的庫的作者,都做了緊急修復(fù),因此可以重裝一下看看是否已經(jīng)被修復(fù)了:先手動刪除node_modules目錄(如果有package-lock.json,也需要刪除),用npm install重新安裝;再用npm ls查看一下版本號是否已經(jīng)變了。如果沒變,說明庫的作者未做修復(fù),此時只能自己手動修改了:打開對應(yīng)庫的package.json文件,把event-stream的版本號顯式指定為一個早先沒有漏洞的,比如3.3.4。
// 以ps-tree為例,原代碼:
"dependencies": {
"event-stream": "~3.3.0"
},
// 修改成:
"dependencies": {
"event-stream": "3.3.4"
},
注意,package-lock.json文件內(nèi)的版本號也需要同步修改一下。
最后執(zhí)行npm install。
多說兩句
這個漏洞的一個重要的危害是:你并不知道你使用的第三方庫里是不是引用了有漏洞的版本。所以會造成麻煩:每引入新的庫都要重復(fù)上面的檢測和修復(fù)的方法。
我一直覺得js的npm包管理方式太過開放太過簡單粗暴,之前就出過left-pad
的作者怒刪在npm上的庫,造成眾多依賴的項目無法工作,知乎鏈接。
這次又出了這么嚴(yán)重的漏洞。npm作者確實是應(yīng)該考慮一下升級安全方面的機制了。