WebAssembly - 安全性

  • 简述

    根据 WebAssembly.org 的官方网站,可在https://webassembly.org/docs/security/获得,WebAssembly 在安全方面的主要目标如下 -
    WebAssembly 的安全模型有两个重要目标 -
    • 保护用户免受错误或恶意模块的侵害,以及
    • 在上一条的约束下,为开发人员提供有用的原语和缓解措施,以开发安全的应用程序。
    编译后的代码,即来自 C/C++/Rust 的 WASM 并不直接在浏览器内执行,而是使用 Javascript API。WASM 代码是沙盒化的,即通过 Javascript API 包装器执行,浏览器使用 API 与 WASM 对话。
    这是在浏览器中使用 .wasm 文件的示例。
    示例 - C 程序
    
    #include<stdio.h> 
    int square(int n) { 
       return n*n; 
    }
    
    我们将使用 WASM explorer 来获取 wasm 代码 -
    WASM Explorer 的使用
    下载 WASM 代码并使用它来测试 api。

    例子

    
    <script type="text/javascript"> 
       const importObj = {
          module: {}
       }; 
       fetch("findsquare.wasm")      
          .then(bytes => bytes.arrayBuffer())          
          .then(module => WebAssembly.instantiate(module,importObj))                 
          .then(finalcode => {
             
          console.log(finalcode); console.log(finalcode.instance.exports.square(25)); 
       }); 
    </script>
    

    输出

    您将获得以下输出 -
    导出对象
    导出对象具有对要调用的函数的引用。要调用函数 square,您必须执行以下操作 -
    
    console.log(finalcode.instance.exports.square(25));
    
  • WASM 编译代码的问题

    以下是 WASM 编译代码的问题 -
    • 在将代码编译为 wasm 时,很难检查是否插入了任何恶意代码。目前没有可用的工具来验证代码。
    • Wasm 难以分析,错误/恶意代码可以在浏览器内轻松执行。