怎樣看待NodeJS模塊node-serialize存在的反序列化漏洞?

新聞 :Node.js驚爆重大漏洞

看到這條新聞前,我一直覺得 Node 環境是比較安全的,很少有嚴重漏洞,大多是一些 xss 類漏洞,即使在文件上傳處,上傳 shell也不定能執行。

-----------------------------

其它模塊會出現類似漏洞嗎?

--------------------------2月16 13:00補充------------------

很多答主在說國內的媒體誇大了,漏洞原文就寫的《Node.js序列化漏洞導致遠程代碼執行》


作為 node-serialize 的作者,簡單說一下背景。其實寫這個庫並不是需求(研究或工作)驅動的,只不過是某個下午閑來無事覺得需要寫些代碼打發時間,偶然想到的。寫完也就放在了一遍,沒有再用過。之後的維護也只不過是有人提了 issue 之後做一些簡單的 bug fix。

直到四年後(嗯這個庫是 2013 年寫的)的今天,有幾位圈內大廠的朋友私聊我說我寫的某個庫爆出了安全漏洞,才看到題主貼的漏洞信息。

實際上這個庫在 GitHub 上一共只有 20 個 star,還有幾個是漏洞文章發布後引來的,而且下載量也是非常少。至於文章中說的「根據CNVD秘書處初步普查結果,受該漏洞影響的網站伺服器有可能超過70萬台」,我想真實情況如何,大家心裡都早已經有數了。

說回事情本身。如果要按照重要程度順序列舉每個開發者必須知道的安全準則,那麼「不要相信來自用戶的輸入」一定會排在第一個。對於這個「漏洞」本身,其實拋開 eval 不說,根源是在於對用戶輸入可能引發的安全問題的忽視。這也是數據篡改、SQL 注入等安全問題的根本因素。node-serialize 允許將一段字元串反序列化成可執行的代碼,其行為本身會將用戶的惡意輸入引來的安全問題放大。如果想要避免此類安全問題,需要解決的就是確保用戶輸入的安全。方法比如:

1. 通過安全傳輸方式(內網 加密)傳輸序列化字元串;

2. 使用如 RSA 等簽名演算法對字元串進行完整化校驗。

另外,要實現支持函數的可執行代碼反序列化,就不得不用到 eval/new Function 這樣平時編碼不推薦使用的方法,這些方法比較容易引入安全問題,此時了解這些安全問題的根源是非常重要的。我看到相關的群里有朋友已經在討論解決方案,比如對序列化後的字元串做校驗,另外 node-serialize 的 GitHub 的 repo 上已經有人提交了通過正則校驗 IIFE 的方法。但實際上,畢竟不是每個工程師都是安全專家,這些自造輪子式的安全解法往往難有成效。比如在瀏覽器上可以通過 []()+! 來執行任意 JavaScript 代碼,所以正則會難以起到過濾作用;又如即使不通過 IIFE 注入攻擊,如果能直接修改序列化後的字元串,攻擊者也自然可以對函數內部或者普通的字元、數字數據進行篡改或攻擊。

最後給公司打個招聘廣告,歡迎廣大 Node.js 愛好者加入石墨文檔研發部!這是我們的專欄:https://zhuanlan.zhihu.com/shimo。

如果有相關問題,也歡迎直接和我交流。我的 GitHub: https://github.com/luin。


1. 漏洞的危害程度是要看用戶量的

同樣是 XSS 漏洞,在新浪微博上和在自己的 Blog 上的影響是不同的;在知乎首頁或者是僅能自己看到的地方(self XSS)的影響也是不同的。這篇文章一概而論,「驚」、「重大」吸引目光,純粹的標題黨。

通過 Github 可知 node-serialize 僅有 20 個 star,用的人無非寥寥,相比較 PHP 內置的 serialize / unserialize 函數,Python 內置的 cPickle 模塊來說,根本沒有任何可比性。

2. 是不是一個漏洞,要看代碼怎麼寫的

PHP 提供了 system 函數,NodeJS 提供了 child_process 模塊,是不是就能起一個「Node.js 驚爆遠程命令執行漏洞」的題目了?

如果是代碼用了 node-serialize,同時 Cookie / GET 和 POST 參數使用了未經加密的或者可被容易控制和修改的序列化的數據,才能算是一個漏洞。這條鏈式反應上缺少哪一點都不足以構成漏洞。

---

3. 研究人員要搞大新聞?

PHP、Java、Python 的反序列化漏洞影響範圍大,研究人員盯上了 NodeJS 反序列化這個大(xiao)蛋糕,也想搞個大新聞,發個 paper,出個名露個臉,殊不知自己找到了個第三方模塊。這個 CVE 給的也太容易了吧?

4. 國內安全圈

現在安全圈現在無非就是捧臭腳、崇洋媚外以及炒冷飯。

洋大人發的 paper,「哇,英文 po,高端大氣,還是 NodeJS 的,翻譯一波」,再由國內一些安全媒體一炒,得,眼球博到了。

前幾日左耳朵耗子的 Mongodb 事件我都不想多說什麼,好久之前出現的問題,國內一些安全公司也發過微博提過醒,然而沒人關注,大 V 一轉發,配上「國內安全圈都不關注啊,那由我來」的文字。國外發現了國內大 V 的轉發,翻譯成英文發了文,國內安全媒體一看,「哇,英文 po,高端大氣,還是 Mongodb 的,翻譯一波」,又炒起來了。

然而真安全研究員一臉懵逼。

PS:此外漏洞影響範圍統計居然是統計了使用 NodeJS 的伺服器數量,能不能走點心。


首先這是一個第三方模塊,任何人都可以創建這麼一個模塊發布到 npm 上,npm 上的東西也是參差不齊,有一些模塊不完善,甚至沒人維護了,這再正常不過。

拿一個冷門的第三方模塊,說 Node.js 「爆重大漏洞」,造一個聳人聽聞的大新聞,扯了吧?

其次在服務端反序列化一個用戶輸入的函數?我覺得這種做法挺智障的,沒想到有什麼場景有這個需求。

再者 node 提供 vm 模塊,在 vm 裡面運行不安全的代碼會更安全一些。


瀉藥。

這個庫是一個非常冷門的第三方類庫,它內部實現是用 eval 的,不出問題才怪。

https://www.npmjs.com/package/node-serialize

在 npm 和 cnpm 沒啥下載量的,在阿里內網的 tnpm 更是近幾個月下載量為 0。

有些媒體和公眾號真是危言聳聽,可憐的 express 躺槍。


這就叫安全研究的話我也能做,文章標題都想好了:

《驚爆!JavaScript eval 方法存在巨大漏洞!涉及所有桌面端移動端設備及NodeJS平台!》

《可怕!NodeJS child_process 模塊允許執行系統級命令存在驚天漏洞!涉及70萬台伺服器!》

升職加薪指日可待呀:)


公司巨T突然@我說node有漏洞,嚇得我馬上去檢查模塊,最後發現是個不知名的沒有使用場景么第三方依賴...


建議改成node標準庫eval函數存在執行惡意代碼漏洞,講道理比隨便找個用了eval的庫搞大新聞容易多了


想搞個大新聞?

NodeJS一個第三方的庫有問題 === 所有的跑NodeJS的伺服器都有漏洞?

由於實際部署中node.js運行環境較多為操作系統root許可權

順便侮辱了所有運維人員?

根據CNVD秘書處的普查結果,目前互聯網上直接標定使用node.js運行環境的伺服器約有6.8萬餘台

秘書處?你們書記是誰?

由於一個應用廣泛的名為Express的WEB應用開發框架是基於node.js運行環境的,根據CNVD秘書處初步普查結果,受該漏洞影響的網站伺服器有可能超過70萬台

Express:我也不知道我是怎麼中槍的

註:CNVD技術組成員單位杭州安恆信息技術有限公司及時報告了預警信息。

安恆信息―全球網路安全500強,雲安全、應用安全和大數據安全領導品牌,誰來扒皮下這個公司?

杭州安恆信息技術有限公司(DBAPPSecurity)是由國家千人計劃專家范淵先生於2007年創辦,是中國領先的信息安全產品和服務解決方案提供商,阿里巴巴使命級戰略合作夥伴。

哇,使命級戰略合作夥伴,好牛~~~


和其他生態一樣,通常寫包的人都不是安全方面的專家。舉個簡單例子,比如用戶認證和密碼加密的包,有幾個達到工業的安全標準的,絕大多數包可能連個salt機制都沒有,內部就是把明文hash一下就得了,只有極少數能把安全要素真正考慮進去,比如credentials。這是開源和快速傳播的代價,大部分developer也不懂安全,覺得加了密就等於安全,實際差得遠了。


有些安全媒體啊就喜歡抓眼球


這個....漏洞報告現在也玩標題黨啊?


自從趕走了烏雲...安全界的「妖魔鬼怪」又出來作祟了...


這是一個堪稱完美的「21天學會搞大新聞」教程,有天賦者現在就可以著手實踐起來了!

1 寫個有漏洞的庫

2 證明它有漏洞

3 全球x萬台機器收到影響!


這個事情真的是讓人匪夷所思啊。

首先我翻了下CVE:

的確是有這個,雖然微信那文章給的CVE號都是錯的。然後讓我們點開下面的Reference:

我天Vulnerable All,緊急程度9.8,而且這個報告者也不是個國人啊。

這就說明,這次這玩意不是微信標題黨,甚至可以都說是「遵照原文」翻譯了(滑稽

早上起來就看見ricter在微博玩這個梗,到現在才明白是怎麼回事。所以這是個大烏龍還是另有玄機,作為非安全研究人員我不敢說什麼。但是竟然給了一個CVE,總感覺還有什麼不可告人的秘密(

話說很奇怪地讓我想起了leftpad事件hhhh


老想搞個大新聞。


60年的太子少見

序列化模塊沒出過問題的語言同樣也很少見


又是阿三挖的洞啊………………


一個20多個start的模塊,媒體拿來炒作了嗎


整天沒事瞎嚷嚷,一個star20多,日下載200多的模塊。很重大嗎?


推薦閱讀:

用偽中文版 putty 登陸過伺服器後應該怎麼辦?
如何評價「最大的安全公司之一 Norse Corp 瀕臨倒閉」?
IE 0day是如何被發現的?
用工具的人能稱得上的黑客嗎?
保證網上購買的爐石戰網賬號不被盜?

TAG:前端開發 | 網路安全 | 伺服器端腳本 | Nodejs |