WASM可以用来检查JS方法的完整性吗?

时间:2018-05-03 07:47:47

标签: javascript c security emscripten webassembly

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

为了讨论的目的,让我们假设二进制模块不是hackable(我知道情况并非如此),但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交互更加困难。

小提琴示例: following fiddle是一个天真的函数验证,比较函数char的toString by char。如果更改validateMe函数,则验证失败。我试图“防弹”它。

2 个答案:

答案 0 :(得分:7)

JS是一种动态语言,您可以覆盖(几乎)所有内容。您可以将函数体作为字符串并将其哈希以生成&#34;快照&#34;然后检查这个快照,但是可以独立覆盖其中一个内部函数。

var getA = function() { return 1; };

var myFunc = function() {
  var a = getA();
  return a * 2;
};

WebAssembly.instantiate(wasmBytes, { myFunc });

// ... later on ...
getA = function() { return 5; };

答案 1 :(得分:4)

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

现在,您可以更加确定(混淆,内存加密,自我重写代码,解释器/虚拟机......以及所有这些技巧),但通常情况下,使其变得非常有用非常有用-trivial(例如,参见Denuvothis Reddit post,VMProtect,Have you ever used code virtualizer or vmprotect to protect from reverse engineering?等),并且随着时间的推移或足够的人气,无论如何都会被绕过。

保护应用程序的唯一方法是在服务器端运行它;这是更昂贵的,并打开你的其他问题。

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

然而,这个问题的重点是防止恶意方绕过保护和/或操纵行为/数据,并且通过编译到WebAssembly进行一些混淆是将为您购买任何安全性