WebAssembly( wasm)是一种新的在浏览器中分发代码的方式。它是一种紧凑的二进制语言,不能直接在处理器上运行。相反,代码被编译成中间字节码,可以在浏览器内快速转换为机器代码,然后比传统JavaScript更高效地执行。
什么是Wasm?
Wasm是用C/C++等高级语言编写的程序可以编译为Wasm,然后在浏览器中运行,这为将现有桌面应用程序移植到Web版本提供了新的可能性。
Wasm在沙盒执行环境中运行,通常在浏览器内,但不一定。Wasm是正在进行的工作,不断开发中。Wasm 1.0版本于2017年3月发布,所有主流浏览器(Chrome、Safari、Firefox和Edge)都支持。
浏览器中的Wasm
当在浏览器中运行时,Wasm应用程序需要将代码定义为单独的文件或JavaScript块内的字节数组。然后使用JavaScript实例化。
内存处理
Wasm中的内存是线性的,在Wasm应用程序和JavaScript之间共享。当Wasm函数返回字符串给JavaScript时,它实际上返回的是Wasm应用程序内存空间内的指针。
通信限制
Wasm应用程序不能直接与沙盒外的系统交互。它不能直接打开普通网络套接字,而是像JavaScript一样可以打开WebSocket。
Wasm安全模型
Wasm的安全模型有以下声明目标:
- 保护用户免受具有无意缺陷的应用程序的侵害
- 保护用户免受故意编写的恶意应用程序的侵害
- 为开发人员提供良好的漏洞利用缓解措施
内置安全功能
- Wasm应用程序在沙盒内运行
- 函数调用不能指向任意地址
- 间接函数调用受类型签名检查
- 调用堆栈受保护,无法覆盖返回指针
- 实现控制流完整性
潜在安全问题
与任何新功能的实现一样,浏览器的攻击面增加了:Wasm支持中可能存在实现缺陷,可能会给攻击者提供机会。
虽然Wasm的安全功能大大有助于保护应用程序免受滥用,但保护并非100%防水,在某些情况下仍然存在可能被利用的条件。
对于需要更强保护的JavaScript代码,可以考虑使用JSVMP等虚拟化保护方案,将代码转换为自定义字节码运行。
来源:Forcepoint | 编译整理:JSVMP
Comments | NOTHING