用最新的技术重新造了一遍 evel
的轮子。
import
攻击,自行试了一下 vm2
sandbox
之类的逃逸漏洞,均无效。vm()
换成 window
代码照样跑得起来。node:vm
会炸。secure-vm 不会。debugger
无效,DevTools 看不到代码来源也下不了断点(在 Chromium 上显示未知或直接隐去具体代码,在 Firefox 上看不到代码内容)。babel
实现一下 ESM 支持,这个在 ses
和 ShadowRealm
实现有得抄。Opera
,但是最新版的 Chromium
、Edge
、Firefox
、Safari
是没问题的(其它的我还没测,IE ?哈哈)Worker.terminate()
那样想结束就结束。为了运行不可信任的用户代码/做微应用。可能有的场景有:
现行的前端可用沙箱有 ses
但仍在提案中,而这个大概是支持 ES2021 就能跑的程度了。
相比 ses
这个 TC39 提案来说 secure-vm 的心智负担极小(就个 vm
函数),虽然部分细节不一致但是相对也值得了。
目前这个项目只有一个指定 initalizer 的功能,用来和别的什么东西作兼容。未来还会支持:
preventExtensions
和 setPrototype
之类功能的支持。这是一个又新又旧并且标准还未规定行为的 JS 沙箱。
虽然目前在早期阶段,但我希望后面会越来越好的,加油!
未来 JavaScript 标准中确实会出现沙箱。
并且 ses
这个 npm 库我记得就是对这个 TC39 提案的一种实现。参照:
SES is hardened JavaScript. SES stands for fearless cooperation. This package is a SES shim for JavaScript features proposed to ECMA TC39. Hardened JavaScript is highly compatible with ordinary JavaScript. Most existing JavaScript libraries can run on hardened JavaScript.
但是 secure-vm 不强求严格模式,并且即使不开严格模式也不会出事。
链接确实是忘加了,补充一下:
1
shendaowu 2023-12-03 09:10:05 +08:00
将来标准的 JavaScript 会支持类似沙箱的东西吗?我看 TC39 里的 ShadowRealm 好像是干这个的?你的“这个 TC39 提案”是不是忘了加链接了?
|
2
musi 2023-12-03 15:18:50 +08:00 via iPhone
很新?不就是 iframe + proxy ?这不是现在微前端主流沙箱隔离方案?
|
3
musi 2023-12-03 15:21:17 +08:00 via iPhone
另外这种隔离方案防君子不防小人,沙箱逃逸方案简直不要太多
|
4
musi 2023-12-03 15:22:12 +08:00 via iPhone
忘了说了,现在 shadowRealm 的 polyfill 也是这种实现
|
5
shendaowu 2023-12-03 20:40:45 +08:00
@musi 问一下大佬未来 JavaScript 标准中会有能防小人的比较安全的类似沙箱的东西吗?会有的话大概还要等几年?
|
6
musi 2023-12-04 08:55:28 +08:00 1
@shendaowu 到目前为止 js 提案中还没有那种稍微安全的 API 出现,另外值得一提的是,这种提案涉及到底层,必须由浏览器底层去适配,由 JS 自己去实现是不现实的。而每个浏览器由自己的安全模型,比如 Chrome 。之前 Chrome 也说了下内部对于 shadowrealm 的讨论,有兴趣可以看看这里 https://github.com/tc39/notes/blob/main/meetings/2021-01/jan-26.md#realms-update
|
7
linwuhi 2023-12-04 17:15:34 +08:00
很不错
|