摘要:以實現沙箱加載外部代碼為例此處直接退出進程,下面的代碼都不會執行此段代碼中,通過外部的構造器使得生成的函數能夠訪問到外部的上下文,拿到對象,直接把進程退出了。
在某些特別的場景下,我們需要編譯執行外部輸入的JS代碼。在瀏覽器端,我們可以借助new Function 、eval等API。而在 node 端,我們可以借助vm模塊實現一個沙箱,運行外部輸入的JS 代碼。但無論是瀏覽器端,還是node端,這些操作都有安全隱患。
外部輸入的JS代碼可以利用JS語言的特性,從而破壞主程序的環境。
目前,筆者了解到主要有兩種方式攻擊主程序
方式一:通過 new Function 、 eval 在創建時,能獲取到全局變量的特性,對主程序的環境進行破壞。以 vm 實現沙箱加載外部代碼為例:
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) // 此處直接退出進程,下面的代碼都不會執行 console.log("process is exited ?")
此段代碼中,通過外部的Function構造器, 使得生成的函數能夠訪問到外部的上下文,拿到process對象,直接把進程退出了。
實際上,我們不傳遞Function給沙箱的話,沙箱內部的代碼同樣可以通過JS的原型鏈的機制,拿到外部的Function構造器:
const vm = require("vm"); const script = new vm.Script(` var foo = (new this.constructor.constructor("return process"))(); foo.exit() `) const context = vm.createContext() // 此處不把外部的Function傳遞進去 script.runInContext(context) // 此處直接退出進程,下面的代碼都不會執行 console.log("process is exited ?")
上面的沙箱里面的代碼,可以通過訪問沙箱內部的上下文this的contructor屬性拿到外部的Object構造器,再通過Object的contructor屬性直接拿到外部的Function構造器。
方式二:通過原型鏈方法劫持、污染同樣以 vm 實現沙箱加載外部代碼為例:
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())
內部沙箱代碼通過獲取外部的Object構造器,改寫原型上的toString方法,達到原型鏈方法破壞的目的。
總結由于JS某些神奇的語言特性,直接編譯執行外部輸入的JS代碼,是一件很危險的操作。說到底,想要解決某些問題,必須先了解根源。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106470.html
摘要:遷移到安全的構造函數移植到概述本指南介紹了如何遷移到安全的構造函數方法,遷移修復了以下棄用警告由于安全性和可用性問題,不建議使用和構造函數,請改用或構造方法。 遷移到安全的Buffer構造函數 移植到Buffer.from()/Buffer.alloc() API. 概述 本指南介紹了如何遷移到安全的Buffer構造函數方法,遷移修復了以下棄用警告: 由于安全性和可用性問題,不建議使用...
摘要:而標準庫中的是不安全的,用戶腳本可以輕易突破沙箱環境,獲取主程序的上述代碼在執行時,程序在第二行就直接退出,虛擬機環境中的代碼逃逸,獲得了主線程的變量,并調用,造成主程序非正常退出。 NPM酷庫,每天兩分鐘,了解一個流行NPM庫。 今天我們要了解的庫是 vm2,則是一個Node.js 官方 vm 庫的替代品,主要解決了安全問題。 不安全的vm 在Node.js官方標準庫中有一個vm庫,...
摘要:本地安全問題在之前引入了本地這個東西,但是后面被廢除了,他的安全點和后臺數據庫的關注點差不多,就是要防止在數據中混入查詢指令。僵尸網絡風險中解決了單線程問題,提出了機制,它為提供多線程支持,但是多線程帶來了一個非常可怕的危險僵尸網絡。 HTML5 安全問題解析 標簽: html html5 web安全 本文參考: w3school:html5相關基礎知識(w3school.com.c...
摘要:的網站仍然使用有漏洞庫上周發布了開源社區安全現狀報告,發現隨著開源社區的日漸活躍,開源代碼中包含的安全漏洞以及影響的范圍也在不斷擴大。與應用安全是流行的服務端框架,本文即是介紹如何使用以及其他的框架來增強應用的安全性。 showImg(https://segmentfault.com/img/remote/1460000012181337?w=1240&h=826); 前端每周清單專注...
摘要:登錄注冊安全風險登錄注冊的風險點主要有四個暴力破解撞庫遍歷注冊用戶批量注冊。引入了驗證碼機制同樣引入了額外的安全風險,比如短信驗證碼的短信炸彈風險圖形驗證碼的可繞過可識別等。 概述 很多技術研發不了解安全,也不重視安全,只有在自己的服務器被黑掉、被掛馬、被脫褲才想起關注安全,但是這個時候,技術架構已經成型、代碼已經在線上穩定運行,再亡羊補牢,改代碼、改策略,往往成本巨大、確收效很低。所...
閱讀 4276·2021-10-13 09:39
閱讀 482·2021-09-06 15:02
閱讀 3229·2019-08-30 15:53
閱讀 1040·2019-08-30 13:04
閱讀 2029·2019-08-30 11:27
閱讀 2010·2019-08-26 13:51
閱讀 2092·2019-08-26 11:33
閱讀 2902·2019-08-26 10:36