大览
用最新的技术重新造了一遍 evel 的轮子。
- 安全性高,免疫
import攻击,自行试了一下vm2sandbox之类的逃逸漏洞,均无效。 - 几乎完全透明,把
vm()换成window代码照样跑得起来。 - 众所周知 electron 前端用
node:vm会炸。secure-vm 不会。 - 防调试一把手,代码内
debugger无效,DevTools 看不到代码来源也下不了断点(在 Chromium 上显示未知或直接隐去具体代码,在 Firefox 上看不到代码内容)。- 但是 secure-vm 的内容被定位了就寄了。请尽量保护好依赖不被泄漏,或者自行验证(至少油猴插件用不了)。
- 不支持 ESM 。可以考虑用正则或者
babel实现一下 ESM 支持,这个在ses和ShadowRealm实现有得抄。 - 不稳定,不支持
Opera,但是最新版的Chromium、Edge、Firefox、Safari是没问题的(其它的我还没测,IE ?哈哈) - 没办法像
Worker.terminate()那样想结束就结束。
为啥要做?
为了运行不可信任的用户代码/做微应用。可能有的场景有:
- Playground 用来运行代码而不炸页面。
- 某缩写 C 开头 W 结尾代理的 mixin 功能可能会用到,懂得都懂。
- 少儿编程平台用来给小朋友们学习 Javascript 而不
- 跑点什么用户开发的微应用。
- 它就是很好玩所以我想试试。
现行的前端可用沙箱有 ses 但仍在提案中,而这个大概是支持 ES2021 就能跑的程度了。
相比 ses 这个 TC39 提案来说 secure-vm 的心智负担极小(就个 vm 函数),虽然部分细节不一致但是相对也值得了。
未来
目前这个项目只有一个指定 initalizer 的功能,用来和别的什么东西作兼容。未来还会支持:
- 沙箱内和沙箱外共用各种全局函数从而实现兼容。
preventExtensions和setPrototype之类功能的支持。- 允许设定禁止写入 prototype 或者覆盖各种外部 API 的属性。
- 支持 ESM (当然这个可能很遥远,到时候再说)。
总体来说
这是一个又新又旧并且标准还未规定行为的 JS 沙箱。
虽然目前在早期阶段,但我希望后面会越来越好的,加油!
