WebAssembly的安全模型有两个重要目标:(1)保护用户免受有缺陷或恶意模块的侵害;(2)在(1)的约束下,为开发人员提供有用的原语和缓解措施,以开发安全的应用程序。
用户安全
每个WebAssembly模块在隔离的沙盒环境中执行,与主机运行时分离。这意味:
- 应用程序独立执行,无法逃脱沙盒
- 应用程序通常以确定性方式执行
开发人员安全
WebAssembly的设计通过从执行语义中消除危险功能,同时保持与为C/C++编写的程序的兼容性,来促进安全程序。
控制流完整性
模块必须在加载时声明所有可访问函数及其关联类型。即使使用动态链接也是如此。这允许通过结构化控制流隐式执行控制流完整性(CFI)。
由于编译代码是不可变的且在运行时不可观察,WebAssembly程序受到保护,免受控制流劫持攻击。
间接函数调用
间接函数调用在运行时受类型签名检查;所选间接函数的类型签名必须与调用站点指定的类型签名匹配。
内存安全
与传统C/C++程序相比,这些语义消除了WebAssembly中的某些内存安全错误。
缓冲区溢出
当数据超过对象的边界并访问相邻内存区域时,无法影响存储在索引空间中的局部或全局变量,因为它们是固定大小的并按索引寻址。
指针安全
WebAssembly消除了指针语义用于函数调用和具有固定静态范围的变量,允许对任何索引空间中的无效索引的引用在加载时触发验证错误,或在运行时最坏情况下触发陷阱。
安全限制
虽然攻击者无法执行直接代码注入攻击,但有可能使用针对间接呼叫的代码重用攻击来劫持模块的控制流。然而,传统的返回导向编程(ROP)攻击在WebAssembly中是不可能的,因为控制流完整性确保呼叫目标是加载时声明的有效函数。
侧信道攻击
可能发生侧信道攻击,例如针对模块的计时攻击。未来可能会提供额外的保护,如代码多样化或内存随机化。
来源:WebAssembly.org | 编译整理:JSVMP
Comments | NOTHING