Web Assembly 如何促进 less hackable/more 无需信任的浏览器内代码执行?
How does Web Assembly facilitate less hackable/more trustless in-browser code execution?
即其一,预编译代码更难阅读,因此更难以有意义地更改浏览器代码。
它比 JS 'sandboxed' 有何优势,这是否降低了它的可破解性?
"WebAssembly is specified to be run in a safe, sandboxed execution environment." - https://developer.mozilla.org/en-US/docs/WebAssembly/Concepts
是否有 WASM VM 内存格式的属性使其更能抵抗客户端黑客攻击?
还有什么吗?
WebAssembly 的设计从未像 JavaScript 那样不易被黑客攻击。 WebAssembly 模块 运行 在浏览器中,可以像任何其他 JavaScript 应用程序一样进行检查和调试。他们提供的唯一额外保护是混淆。它是一种较低级别的语言,这使得破译代码变得更加困难 - 尽管这不是一个强大的保护措施!
WebAssembly 模块被沙盒化,因为一个模块无法访问内存或与另一个 运行ning 模块交互。他们有自己独立的执行环境。 JavaScript 也被沙盒化以防止一个选项卡或页面的代码与另一个选项卡或页面交互 - 更重要的是防止它访问底层主机 OS!
Webassembly 使用线性内存,这是一个连续的内存块,通常用于创建堆。它可以导出到宿主环境,这意味着宿主JavaScript代码可以直接将其作为字节数组读写。
总而言之,WebAssembly 的可破解性并不少,并且有一个不同的沙箱。如果这些是您正在研究这项技术的火车,也许是时候重新考虑一下了?
在 Web 上,WebAssembly 运行 与 JavaScript 在同一个沙箱中,因此 WebAssembly 无法以任何方式影响其主机,而纯 JavaScript 也无法做到这一点.但 WebAssembly 走得更远,确实 使其对 运行 不受信任的代码更安全,因为它的导入工作方式。
实例化 WebAssembly 模块时,会为其提供一组导入函数。这些导入是模块唯一可以访问的主机函数,一旦模块被实例化,它们就不能更改。如果没有导入,WebAssembly 模块只能表达纯计算并且只能影响其自身内存的状态。这意味着如果您不提供任何可以发出网络请求的导入,则可以确定 WebAssembly 模块无法发出网络请求。将此与 JavaScript 进行对比,其中确定程序是否使用特定 API 通常是无法确定的。
这并不意味着 WebAssembly 模块中的代码不能有错误或安全漏洞。例如,当那些 C 程序被编译为 WebAssembly 时,对有缺陷的 C 程序的 buffer over运行 攻击仍然是可能的,但不同之处在于它们能做的最坏的事情是由导入决定的,这很容易检查。因此,如果您将 eval
导入到有缺陷的 C WebAssembly 模块中,您可能会遇到严重的问题,但如果您仅导入 console.log
,攻击者最糟糕的做法就是向您的控制台发送垃圾邮件。
我不认为 WebAssembly 与安全相关是低级别的。 WebAssembly 模块并不比最小化或模糊化的 JavaScript 更难阅读,当您考虑 asm.js-style JavaScript 时,差异几乎消失了。当然,阅读 WebAssembly 模块比阅读 pretty-printed JavaScript 程序更难,但就安全性而言,这并不能真正让你到达任何地方。
即其一,预编译代码更难阅读,因此更难以有意义地更改浏览器代码。
它比 JS 'sandboxed' 有何优势,这是否降低了它的可破解性?
"WebAssembly is specified to be run in a safe, sandboxed execution environment." - https://developer.mozilla.org/en-US/docs/WebAssembly/Concepts
是否有 WASM VM 内存格式的属性使其更能抵抗客户端黑客攻击?
还有什么吗?
WebAssembly 的设计从未像 JavaScript 那样不易被黑客攻击。 WebAssembly 模块 运行 在浏览器中,可以像任何其他 JavaScript 应用程序一样进行检查和调试。他们提供的唯一额外保护是混淆。它是一种较低级别的语言,这使得破译代码变得更加困难 - 尽管这不是一个强大的保护措施!
WebAssembly 模块被沙盒化,因为一个模块无法访问内存或与另一个 运行ning 模块交互。他们有自己独立的执行环境。 JavaScript 也被沙盒化以防止一个选项卡或页面的代码与另一个选项卡或页面交互 - 更重要的是防止它访问底层主机 OS!
Webassembly 使用线性内存,这是一个连续的内存块,通常用于创建堆。它可以导出到宿主环境,这意味着宿主JavaScript代码可以直接将其作为字节数组读写。
总而言之,WebAssembly 的可破解性并不少,并且有一个不同的沙箱。如果这些是您正在研究这项技术的火车,也许是时候重新考虑一下了?
在 Web 上,WebAssembly 运行 与 JavaScript 在同一个沙箱中,因此 WebAssembly 无法以任何方式影响其主机,而纯 JavaScript 也无法做到这一点.但 WebAssembly 走得更远,确实 使其对 运行 不受信任的代码更安全,因为它的导入工作方式。
实例化 WebAssembly 模块时,会为其提供一组导入函数。这些导入是模块唯一可以访问的主机函数,一旦模块被实例化,它们就不能更改。如果没有导入,WebAssembly 模块只能表达纯计算并且只能影响其自身内存的状态。这意味着如果您不提供任何可以发出网络请求的导入,则可以确定 WebAssembly 模块无法发出网络请求。将此与 JavaScript 进行对比,其中确定程序是否使用特定 API 通常是无法确定的。
这并不意味着 WebAssembly 模块中的代码不能有错误或安全漏洞。例如,当那些 C 程序被编译为 WebAssembly 时,对有缺陷的 C 程序的 buffer over运行 攻击仍然是可能的,但不同之处在于它们能做的最坏的事情是由导入决定的,这很容易检查。因此,如果您将 eval
导入到有缺陷的 C WebAssembly 模块中,您可能会遇到严重的问题,但如果您仅导入 console.log
,攻击者最糟糕的做法就是向您的控制台发送垃圾邮件。
我不认为 WebAssembly 与安全相关是低级别的。 WebAssembly 模块并不比最小化或模糊化的 JavaScript 更难阅读,当您考虑 asm.js-style JavaScript 时,差异几乎消失了。当然,阅读 WebAssembly 模块比阅读 pretty-printed JavaScript 程序更难,但就安全性而言,这并不能真正让你到达任何地方。