Node.js安全篇·一次沙箱逃逸的鬧劇

前面的話:本人項(xiàng)目實(shí)際遇上并解決的問題青团,可能寫得不夠完善,求大神給個(gè)裝X的機(jī)會(huì)芦昔,也希望能夠給未遇到過此問題的后來者一點(diǎn)提點(diǎn)!

正文:?jiǎn)栴}是在前一段時(shí)間調(diào)用一個(gè)第三方網(wǎng)站的接口(A接口)時(shí)遇上的娃肿。

A接口是一個(gè)jsonp調(diào)用的接口,當(dāng)前使用get請(qǐng)求時(shí)凭豪,會(huì)返回一個(gè)js函數(shù)調(diào)用晒杈,由于我使用的是Node.js的http原生庫(kù)進(jìn)行封裝的請(qǐng)求庫(kù),默認(rèn)是不會(huì)自動(dòng)處理jsonp的返回?cái)?shù)據(jù)末早,所以得自行進(jìn)行解析说庭。

如,以下是某次請(qǐng)求返回的消息體

  var body = `_jsInvoke({
      "errcode": 1000,
      "errmsg": "Invalid request trace id.",
      "data": [],
      "datetime": "2018-05-02 15:22:53"
  })`

于是姿搜,出于一般的思維,我們就使用了new Function進(jìn)行處理返回的消息體梭纹,代碼如下:

  var obj = (new Function(`function _jsInvoke(obj) {return obj} return ${body}`))();

Then? 代碼正常執(zhí)行致份,結(jié)果成功返回,沒有任何問題绍载,如些正常運(yùn)行了半個(gè)月滔蝉,直到這一天,我們突然發(fā)現(xiàn)在pm2 日志里面突然多次出現(xiàn)一些問題日志阳谍。

  [2018-05-10 12:56:23] [Laravel Req Error] 非法請(qǐng)求螃概,已拒絕連接!
  [2018-05-12 08:41:50] [Laravel Req Error] 訂單號(hào)出錯(cuò)!
  [2018-05-16 17:32:56] [Laravel Req Error] IP黑名單已滿!

問題來了時(shí),當(dāng)時(shí)最受關(guān)注的是茧痒,在一個(gè)pm2運(yùn)行的Node.js項(xiàng)目里面融蹂,怎么會(huì)有Laravel的日志?因?yàn)樵趐m2中的log日志区拳,是不會(huì)顯示出錯(cuò)棧跟蹤的意乓,所以,我們只能做一些日志跟蹤測(cè)試笆凌,(跟蹤過程省略......)

終于士葫,在5月22日早上,奇怪的pm2日志再次出現(xiàn)爪模,而這次我們就迅速定位到上面的用到的new Function處理方法中,而這些錯(cuò)誤的pm2日志洁段,正是從里面打印出來的共郭,

奇怪?
new Function里面沒有console.log芭ε薄憾赁?
除非散吵,console.log被調(diào)用了龙考,不可能打印出log啊?
對(duì),console.log被調(diào)用了矾睦,console.log被調(diào)用了晦款,console.log被調(diào)用了...

好恐怖的現(xiàn)象......現(xiàn)在想起來還有點(diǎn)后怕,幸虧沒造成什么損失!

以下枚冗,我們來分析一下缓溅,問題是怎樣產(chǎn)生的,這個(gè)現(xiàn)象會(huì)造成什么嚴(yán)重效果赁温。

我們都知道:

  1. jsonp請(qǐng)求返回的是一個(gè)javascript腳本字符串坛怪,并且響應(yīng)頭為Content-Type:text/javascript;
  2. new Function 方法的調(diào)用,可以把javascript腳本字符串翻譯為javascript語(yǔ)法進(jìn)行執(zhí)行股囊;
  3. node.js的變量使用或才函數(shù)調(diào)用袜匿,如果沒有嚴(yán)格規(guī)定作用域稚疹,則會(huì)一層層往上追溯到最頂層的對(duì)象global中;

所以為什么之前剛接入接口是居灯,能正常執(zhí)行,是因?yàn)榻涌诜祷氐臄?shù)據(jù)正好是符合我們需要的規(guī)范内狗,所以return之后能夠把obj當(dāng)成js對(duì)象返回怪嫌。
但后來,返回的數(shù)據(jù)變成了如下:

var body = `console.log("這里是錯(cuò)誤信息!")`

則new Function里面的字符串就變成了如下:

  var obj = (new Function(`function _jsInvoke(obj) {return obj} return console.log("這里是錯(cuò)誤信息!")`))();

于時(shí)柳沙,console.log就被調(diào)用了!


深入一下:
如果請(qǐng)求響應(yīng)數(shù)據(jù)是這樣子:

var body = `(function() {
  while(true){}
})()`

那么當(dāng)前進(jìn)程就一直處于死循環(huán)中岩灭,直到資源耗盡,進(jìn)程崩潰偎行!如果對(duì)一個(gè)正在線上運(yùn)行的項(xiàng)目川背,這是致命的贰拿!


再深入一下:
如果請(qǐng)求響應(yīng)數(shù)據(jù)是這樣子:

var body = `this.constructor.constructor("return require('child_process')")()`

呵呵,這樣子處理的數(shù)據(jù)就可以逃逸出去熄云,嚴(yán)重的話膨更,服務(wù)器就GG了。

所以缴允,在任何第三請(qǐng)求以及回調(diào)中荚守,一定要經(jīng)過嚴(yán)格的數(shù)據(jù)處理,不然最后自己的服務(wù)器被奪走了练般,也沒發(fā)現(xiàn)問題!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末矗漾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子薄料,更是在濱河造成了極大的恐慌敞贡,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摄职,死亡現(xiàn)場(chǎng)離奇詭異誊役,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)谷市,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門蛔垢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人迫悠,你說我怎么就攤上這事鹏漆。” “怎么了创泄?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵艺玲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我验烧,道長(zhǎng)板驳,這世上最難降的妖魔是什么饰潜? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任嘱函,我火速辦了婚禮,結(jié)果婚禮上覆山,老公的妹妹穿的比我還像新娘感混。我一直安慰自己端幼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布弧满。 她就那樣靜靜地躺著婆跑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪庭呜。 梳的紋絲不亂的頭發(fā)上滑进,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天犀忱,我揣著相機(jī)與錄音,去河邊找鬼扶关。 笑死阴汇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的节槐。 我是一名探鬼主播搀庶,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼铜异!你這毒婦竟也來了哥倔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤揍庄,失蹤者是張志新(化名)和其女友劉穎咆蒿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚂子,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜡秽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缆镣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡试浙,死狀恐怖董瞻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情田巴,我是刑警寧澤钠糊,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站壹哺,受9級(jí)特大地震影響抄伍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜管宵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一截珍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧箩朴,春花似錦岗喉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至埠居,卻和暖如春查牌,著一層夾襖步出監(jiān)牢的瞬間事期,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工纸颜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兽泣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓懂衩,卻偏偏與公主長(zhǎng)得像撞叨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浊洞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 作者: Manuel Kiessling 翻譯: goddyzhao & GrayZhang & MondayC...
    紫月凌楓閱讀 2,347評(píng)論 5 26
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品法希,去做同樣的事情枷餐,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式。簡(jiǎn)單...
    舟漁行舟閱讀 7,724評(píng)論 2 17
  • github地址润匙,歡迎大家提交更新。 express() express()用來創(chuàng)建一個(gè)Express的程序唉匾。ex...
    Programmer客棧閱讀 2,503評(píng)論 0 1
  • Node.js是目前非吃谢洌火熱的技術(shù),但是它的誕生經(jīng)歷卻很奇特巍膘。 眾所周知厂财,在Netscape設(shè)計(jì)出JavaScri...
    w_zhuan閱讀 3,610評(píng)論 2 41
  • 還是喜歡在這樣寂靜的夜肪康,讓靈魂沉浸在音樂里荚恶,任思緒在無(wú)盡的暗夜里游走。 趁著倒水的間隙梅鹦,悄悄地給小子拉好被他踢到一...
    葛芳閱讀 372評(píng)論 0 1