亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

不安全的JS

xingpingz / 2954人閱讀

摘要:以實(shí)現(xiàn)沙箱加載外部代碼為例此處直接退出進(jìn)程,下面的代碼都不會(huì)執(zhí)行此段代碼中,通過外部的構(gòu)造器使得生成的函數(shù)能夠訪問到外部的上下文,拿到對(duì)象,直接把進(jìn)程退出了。

在某些特別的場(chǎng)景下,我們需要編譯執(zhí)行外部輸入的JS代碼。在瀏覽器端,我們可以借助new Functioneval等API。而在 node 端,我們可以借助vm模塊實(shí)現(xiàn)一個(gè)沙箱,運(yùn)行外部輸入的JS 代碼。但無論是瀏覽器端,還是node端,這些操作都有安全隱患。

外部輸入的JS代碼可以利用JS語言的特性,從而破壞主程序的環(huán)境。

目前,筆者了解到主要有兩種方式攻擊主程序

方式一:通過 new Function 、 eval 在創(chuàng)建時(shí),能獲取到全局變量的特性,對(duì)主程序的環(huán)境進(jìn)行破壞。

以 vm 實(shí)現(xiàn)沙箱加載外部代碼為例:

const vm = require("vm");
const script = new vm.Script(`
    var foo = (new Function("return process"))();
    foo.exit()
`)
const context = vm.createContext({
    Function: Function
})
script.runInContext(context) // 此處直接退出進(jìn)程,下面的代碼都不會(huì)執(zhí)行
console.log("process is exited ?")

此段代碼中,通過外部的Function構(gòu)造器, 使得生成的函數(shù)能夠訪問到外部的上下文,拿到process對(duì)象,直接把進(jìn)程退出了。

實(shí)際上,我們不傳遞Function給沙箱的話,沙箱內(nèi)部的代碼同樣可以通過JS的原型鏈的機(jī)制,拿到外部的Function構(gòu)造器:

const vm = require("vm");
const script = new vm.Script(`
    var foo = (new this.constructor.constructor("return process"))();
    foo.exit()
`)
const context = vm.createContext()  // 此處不把外部的Function傳遞進(jìn)去
script.runInContext(context) // 此處直接退出進(jìn)程,下面的代碼都不會(huì)執(zhí)行
console.log("process is exited ?")

上面的沙箱里面的代碼,可以通過訪問沙箱內(nèi)部的上下文thiscontructor屬性拿到外部的Object構(gòu)造器,再通過Objectcontructor屬性直接拿到外部的Function構(gòu)造器。

方式二:通過原型鏈方法劫持、污染

同樣以 vm 實(shí)現(xiàn)沙箱加載外部代碼為例:

const vm = require("vm");
const script = new vm.Script(`
this.constructor.prototype.toString = function() {
    console.log("hehe")
}
`)
const context = vm.createContext({
    console: console
})
script.runInContext(context)
let a = { name: 1 }
console.log(a, a.toString())

內(nèi)部沙箱代碼通過獲取外部的Object構(gòu)造器,改寫原型上的toString方法,達(dá)到原型鏈方法破壞的目的。

總結(jié)

由于JS某些神奇的語言特性,直接編譯執(zhí)行外部輸入的JS代碼,是一件很危險(xiǎn)的操作。說到底,想要解決某些問題,必須先了解根源。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/106470.html

相關(guān)文章

  • Node.js 指南(遷移到安全Buffer構(gòu)造函數(shù))

    摘要:遷移到安全的構(gòu)造函數(shù)移植到概述本指南介紹了如何遷移到安全的構(gòu)造函數(shù)方法,遷移修復(fù)了以下棄用警告由于安全性和可用性問題,不建議使用和構(gòu)造函數(shù),請(qǐng)改用或構(gòu)造方法。 遷移到安全的Buffer構(gòu)造函數(shù) 移植到Buffer.from()/Buffer.alloc() API. 概述 本指南介紹了如何遷移到安全的Buffer構(gòu)造函數(shù)方法,遷移修復(fù)了以下棄用警告: 由于安全性和可用性問題,不建議使用...

    dingding199389 評(píng)論0 收藏0
  • NPM酷庫:vm2,安全沙箱環(huán)境

    摘要:而標(biāo)準(zhǔn)庫中的是不安全的,用戶腳本可以輕易突破沙箱環(huán)境,獲取主程序的上述代碼在執(zhí)行時(shí),程序在第二行就直接退出,虛擬機(jī)環(huán)境中的代碼逃逸,獲得了主線程的變量,并調(diào)用,造成主程序非正常退出。 NPM酷庫,每天兩分鐘,了解一個(gè)流行NPM庫。 今天我們要了解的庫是 vm2,則是一個(gè)Node.js 官方 vm 庫的替代品,主要解決了安全問題。 不安全的vm 在Node.js官方標(biāo)準(zhǔn)庫中有一個(gè)vm庫,...

    pkhope 評(píng)論0 收藏0
  • HTML5 安全問題解析

    摘要:本地安全問題在之前引入了本地這個(gè)東西,但是后面被廢除了,他的安全點(diǎn)和后臺(tái)數(shù)據(jù)庫的關(guān)注點(diǎn)差不多,就是要防止在數(shù)據(jù)中混入查詢指令。僵尸網(wǎng)絡(luò)風(fēng)險(xiǎn)中解決了單線程問題,提出了機(jī)制,它為提供多線程支持,但是多線程帶來了一個(gè)非??膳碌奈kU(xiǎn)僵尸網(wǎng)絡(luò)。 HTML5 安全問題解析 標(biāo)簽: html html5 web安全 本文參考: w3school:html5相關(guān)基礎(chǔ)知識(shí)(w3school.com.c...

    maybe_009 評(píng)論0 收藏0
  • 前端每周清單第 41 期 : Node 與 Rust、OpenCV 火花,網(wǎng)絡(luò)安全二三事

    摘要:的網(wǎng)站仍然使用有漏洞庫上周發(fā)布了開源社區(qū)安全現(xiàn)狀報(bào)告,發(fā)現(xiàn)隨著開源社區(qū)的日漸活躍,開源代碼中包含的安全漏洞以及影響的范圍也在不斷擴(kuò)大。與應(yīng)用安全是流行的服務(wù)端框架,本文即是介紹如何使用以及其他的框架來增強(qiáng)應(yīng)用的安全性。 showImg(https://segmentfault.com/img/remote/1460000012181337?w=1240&h=826); 前端每周清單專注...

    syoya 評(píng)論0 收藏0
  • 安全開發(fā)筆記

    摘要:登錄注冊(cè)安全風(fēng)險(xiǎn)登錄注冊(cè)的風(fēng)險(xiǎn)點(diǎn)主要有四個(gè)暴力破解撞庫遍歷注冊(cè)用戶批量注冊(cè)。引入了驗(yàn)證碼機(jī)制同樣引入了額外的安全風(fēng)險(xiǎn),比如短信驗(yàn)證碼的短信炸彈風(fēng)險(xiǎn)圖形驗(yàn)證碼的可繞過可識(shí)別等。 概述 很多技術(shù)研發(fā)不了解安全,也不重視安全,只有在自己的服務(wù)器被黑掉、被掛馬、被脫褲才想起關(guān)注安全,但是這個(gè)時(shí)候,技術(shù)架構(gòu)已經(jīng)成型、代碼已經(jīng)在線上穩(wěn)定運(yùn)行,再亡羊補(bǔ)牢,改代碼、改策略,往往成本巨大、確收效很低。所...

    Cruise_Chan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<