即首先,预编译的代码较难阅读,因此很难有效地更改浏览器代码。
与JS相比,它如何更具“沙盒”风格,这是否使其不那么容易破解?
“ WebAssembly被指定为在安全的沙盒执行环境中运行。” -https://developer.mozilla.org/en-US/docs/WebAssembly/Concepts
WASM VM内存格式的属性是否使其更具客户端抵抗性?
还有什么?
答案 0 :(得分:7)
WebAssembly的设计从未像JavaScript那样易于入侵。 WebAssembly模块在浏览器中运行,并且可以像其他任何JavaScript应用程序一样进行检查和调试。他们提供的唯一额外保护是混淆。这是一种较低级的语言,这使得解密代码变得更加困难-尽管这并不是一种强有力的保护措施!
WebAssembly模块被沙箱化,因为一个模块无法访问内存,或者无法与另一个正在运行的模块进行交互。他们有自己的隔离执行环境。还对JavaScript进行了沙箱处理,以防止代码从一个选项卡或页面与另一个选项卡或页面进行交互-更重要的是,它防止访问底层主机OS!
Webassembly使用线性内存,这是一个连续的内存块,通常用于创建堆。可以将其导出到主机环境,这意味着托管JavaScript代码可以作为字节数组直接对其进行读写。
总而言之,WebAssembly并非易受黑客攻击,并且具有不同的沙箱。如果您是正在使用这项技术的火车,也许是时候重新考虑了吗?
答案 1 :(得分:6)
在Web上,WebAssembly与JavaScript在同一沙箱中运行,因此WebAssembly不能以任何方式影响其主机,而纯JavaScript也无法做到这一点。但是WebAssembly更进一步,并且这样做使导入不受信任的代码更加安全,因为其导入方式如此。
实例化WebAssembly模块时,将为其提供一组导入函数。这些导入是模块有权访问的唯一主机功能,并且在实例化模块后就无法更改它们。如果没有导入,则WebAssembly模块只能表示纯计算,并且只能影响其自身内存的状态。这意味着,如果您不提供任何可以进行网络请求的导入,则可以确定WebAssembly模块不能进行网络请求。将其与JavaScript相比,通常无法确定程序是否使用特定的API。
这并不意味着WebAssembly模块中的代码不能包含错误或安全漏洞。例如,当将错误的C程序编译到WebAssembly时,仍然有可能对有漏洞的C程序进行缓冲区溢出攻击,但是区别在于,它们可以执行的最坏操作由易于确定的导入决定。因此,如果将eval
导入有问题的C WebAssembly模块中,则可能会遇到严重问题,但是如果仅导入console.log
,则攻击者最糟糕的操作就是向控制台发送垃圾邮件。
我不认为WebAssembly的安全性低。 WebAssembly模块不比最小化或模糊化的JavaScript难读,当您考虑使用asm.js样式的JavaScript时,差异几乎消失了。当然,阅读WebAssembly模块要比打印精美的JavaScript程序难,但这在安全性方面并没有帮助您。