【问题标题】:Could WASM be used to check integrity of a JS method?可以使用 WASM 来检查 JS 方法的完整性吗?
【发布时间】:2018-10-13 10:43:03
【问题描述】:

我正在试验 webAssembly 并试图找出一种方法来验证 webAssembly 模块使用的 JS 方法的完整性。

为了讨论的目的,我们假设二进制模块是不可破解的(我知道不是这样),但 JS 端是。

给定以下 C 代码:

#include <emscripten.h>

//js method to validate
void validateMe();

int validateMethods(){
    // check validateMe integrity.
    // return 1 if validation succeeded.
}

EMSCRIPTEN_KEEPALIVE
void doStuff(){
    if (validateMethods()){
       // do stuff
    }
}

我想从JS端调用doStuff(),只有完整性检查成功后doStuff()才会运行。 我想进行某种完整性检查,类似于Subresource,检查方法的 toString 表示。但是,如果我想获取当前的(内存中的)JS 方法 toString,我将不得不调用可能被破坏的 JS。

问:我可以通过其他方式获取 toString 吗?任何其他方法也将不胜感激。

更新:深挖了一下,看了this article,貌似除了共享数组之外没有办法访问JS内存了。因此,任何验证技术都会受到赞赏。


更新 2(目标):我的最终目标是确保 WASM 部分仅适用于特定的 JS,或者至少使其更难与被操纵的 JS 交互。

Fiddle 示例:following fiddle,是一个简单的函数验证,将函数 char 的 toString 逐个字符进行比较。如果您更改 validateMe 函数,验证将失败。我正在尝试“防弹”它。

【问题讨论】:

  • 这还不清楚你为什么要混合 javascript 和 wasm 和 C?所以你想使用从 c 文件生成的 wasm 来检查 JS 方法的完整性?另外,“为了讨论的目的,我们假设二进制模块是不可破解的(我知道不是这样),但 JS 端是。”不清楚您所说的“但JS方面是”是什么意思?客户端的一切都不可信。
  • 其实你的问题可以分为两个,一个是C部分,另一个是“可以用WASM来检查JS方法的完整性吗?”。我不明白你为什么在你的问题中添加 C 使它变得广泛和不清楚。
  • 感谢您的回复。 WASM 是从 C 代码编译而来的。目的是提高恶意用户的门槛,IE:WASM 代码更难操作/调试,JS 对任何调试知识最少的人都是可见的。我的目标是确保 WASM 与特定的 JS 一起工作。
  • 请检查我的更新

标签: javascript c security emscripten webassembly


【解决方案1】:

不,它不能。当然,您可以验证某些源代码的完整性,但这并没有给您带来任何真正的安全性。无论您做什么,您都无法阻止第三方的计算机运行、修改和为所欲为。

现在,您可以肯定地让它变得更难(混淆、内存加密、自重写代码、解释器/虚拟机......以及所有这些技巧),但通常,让它变得有点有用是不重要的- 微不足道的(例如,参见 Denuvothis Reddit post、VMProtect、Have you ever used code virtualizer or vmprotect to protect from reverse engineering? 等),并且随着时间的推移或足够的普及,它无论如何都会被绕过。

保护您的应用程序的唯一方法是在服务器端运行它;这更昂贵,并且会给您带来其他问题。


请注意,如果您的目标是试图保护源代码而不是应用程序本身(换句话说,避免其他人阅读/复制代码),然后编译(通过优化)像 C 这样的语言进入 WebAssembly 可能是一个公平的选择(并且您希望在其中编写尽可能多的应用程序)。即使解决方案没有隐藏应用程序的工作方式,它也可以有效地使阅读/重用原始代码/设计变得更加困难——这只是一种混淆形式。

但是,这个问题的重点是防止恶意方绕过保护措施和/或操纵行为/数据,因此通过编译到 WebAssembly 进行一些混淆不会为您购买任何安全性.

【讨论】:

    【解决方案2】:

    JS 是一种动态语言,您可以(几乎)覆盖所有内容。您可以将函数的主体作为字符串获取并对其进行散列以生成它的“快照”,然后再检查此快照,但可以独立地覆盖其中一个内部函数。

    var getA = function() { return 1; };
    
    var myFunc = function() {
      var a = getA();
      return a * 2;
    };
    
    WebAssembly.instantiate(wasmBytes, { myFunc });
    
    // ... later on ...
    getA = function() { return 5; };
    

    【讨论】:

    • 感谢您的回复,我也能做到这一点:(
    • 假设没有内部函数,你将如何验证“快照”?从 JS 检索函数字符串到 wasm 也可以被操纵。
    猜你喜欢
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 2011-02-11
    • 2014-11-12
    • 1970-01-01
    • 2014-04-06
    • 2017-03-21
    • 2016-12-12
    相关资源
    最近更新 更多