资讯专栏INFORMATION COLUMN

不安全的JS

xingpingz / 2900人阅读

摘要:以实现沙箱加载外部代码为例此处直接退出进程,下面的代码都不会执行此段代码中,通过外部的构造器使得生成的函数能够访问到外部的上下文,拿到对象,直接把进程退出了。

在某些特别的场景下,我们需要编译执行外部输入的JS代码。在浏览器端,我们可以借助new Functioneval等API。而在 node 端,我们可以借助vm模块实现一个沙箱,运行外部输入的JS 代码。但无论是浏览器端,还是node端,这些操作都有安全隐患。

外部输入的JS代码可以利用JS语言的特性,从而破坏主程序的环境。

目前,笔者了解到主要有两种方式攻击主程序

方式一:通过 new Functioneval 在创建时,能获取到全局变量的特性,对主程序的环境进行破坏。

以 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 ?")

上面的沙箱里面的代码,可以通过访问沙箱内部的上下文thiscontructor属性拿到外部的Object构造器,再通过Objectcontructor属性直接拿到外部的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代码,是一件很危险的操作。说到底,想要解决某些问题,必须先了解根源。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/106470.html

相关文章

  • Node.js 指南(迁移到安全Buffer构造函数)

    摘要:迁移到安全的构造函数移植到概述本指南介绍了如何迁移到安全的构造函数方法,迁移修复了以下弃用警告由于安全性和可用性问题,不建议使用和构造函数,请改用或构造方法。 迁移到安全的Buffer构造函数 移植到Buffer.from()/Buffer.alloc() API. 概述 本指南介绍了如何迁移到安全的Buffer构造函数方法,迁移修复了以下弃用警告: 由于安全性和可用性问题,不建议使用...

    dingding199389 评论0 收藏0
  • NPM酷库:vm2,安全沙箱环境

    摘要:而标准库中的是不安全的,用户脚本可以轻易突破沙箱环境,获取主程序的上述代码在执行时,程序在第二行就直接退出,虚拟机环境中的代码逃逸,获得了主线程的变量,并调用,造成主程序非正常退出。 NPM酷库,每天两分钟,了解一个流行NPM库。 今天我们要了解的库是 vm2,则是一个Node.js 官方 vm 库的替代品,主要解决了安全问题。 不安全的vm 在Node.js官方标准库中有一个vm库,...

    pkhope 评论0 收藏0
  • HTML5 安全问题解析

    摘要:本地安全问题在之前引入了本地这个东西,但是后面被废除了,他的安全点和后台数据库的关注点差不多,就是要防止在数据中混入查询指令。僵尸网络风险中解决了单线程问题,提出了机制,它为提供多线程支持,但是多线程带来了一个非常可怕的危险僵尸网络。 HTML5 安全问题解析 标签: html html5 web安全 本文参考: w3school:html5相关基础知识(w3school.com.c...

    maybe_009 评论0 收藏0
  • 前端每周清单第 41 期 : Node 与 Rust、OpenCV 火花,网络安全二三事

    摘要:的网站仍然使用有漏洞库上周发布了开源社区安全现状报告,发现随着开源社区的日渐活跃,开源代码中包含的安全漏洞以及影响的范围也在不断扩大。与应用安全是流行的服务端框架,本文即是介绍如何使用以及其他的框架来增强应用的安全性。 showImg(https://segmentfault.com/img/remote/1460000012181337?w=1240&h=826); 前端每周清单专注...

    syoya 评论0 收藏0
  • 安全开发笔记

    摘要:登录注册安全风险登录注册的风险点主要有四个暴力破解撞库遍历注册用户批量注册。引入了验证码机制同样引入了额外的安全风险,比如短信验证码的短信炸弹风险图形验证码的可绕过可识别等。 概述 很多技术研发不了解安全,也不重视安全,只有在自己的服务器被黑掉、被挂马、被脱裤才想起关注安全,但是这个时候,技术架构已经成型、代码已经在线上稳定运行,再亡羊补牢,改代码、改策略,往往成本巨大、确收效很低。所...

    Cruise_Chan 评论0 收藏0

发表评论

0条评论

xingpingz

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<