Может ли WASM использоваться для проверки целостности метода JS? - PullRequest
0 голосов
/ 03 мая 2018

Я экспериментирую с webAssembly и пытаюсь найти способ проверки целостности метода JS, используемого модулем webAssembly.

Для целей обсуждения давайте предположим, что двоичный модуль не может быть взломан (я знаю, что это не так), но сторона 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
    }
}

Я хотел бы позвонить doStuff() со стороны JS, и doStuff() будет работать только в случае успешной проверки целостности. Я думал о некоторой проверке целостности, подобной Subresource , проверяющей представление метода toString. Однако, если я хочу получить текущий (в памяти) метод JS toString, мне придется вызвать JS, который может быть скомпрометирован.

Q: Можно ли как-то получить toString другим способом? Любой другой подход также приветствуется.

Обновление: после того, как вырыли немного глубже, прочитав эту статью , кажется, что нет никакого доступа к памяти JS, кроме общего массива. Так что любая техника проверки будет оценена.


Обновление 2 (цель): Моя конечная цель - убедиться, что часть WASM будет работать только с определенным JS, или, по крайней мере, затруднить взаимодействие с манипулируемым JS.

Fiddle Пример: , следующий за скрипкой , является простой проверкой функции, сравнивающей toString функции char по char. Если вы измените функцию validateMe, проверка завершится неудачно. Я пытаюсь "пуленепробиваемый" это.

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Нет, не может. Хотя, конечно, вы можете проверить целостность некоторого исходного кода, который не дает вам никакой реальной безопасности. Независимо от того, что вы делаете, вы не можете запретить стороннему компьютеру запускать, изменять и делать все, что угодно.

Теперь вы можете сделать это наверняка сложнее (обфускация, шифрование памяти, самопереписывающий код, интерпретаторы / виртуальные машины ... и все эти трюки), но, как правило, сделать его достаточно сложным, чтобы быть несколько полезным, не обязательно. -тривиальный (например, см. Denuvo и в этом посте Reddit , VMProtect, Вы когда-либо использовали виртуализатор кода или vmprotect для защиты от обратного инжиниринга? и т. д.) и со временем или достаточной популярностью, это все равно будет обойдено.

Единственный способ защитить ваше приложение - запустить его на стороне сервера; который дороже и открывает вам другие проблемы.


Обратите внимание, что если вашей целью была попытка защитить исходный код , а не само приложение (другими словами, чтобы другие не читали / не копировали код), то компилирование (с оптимизацией) такой язык, как C, в WebAssembly может быть справедливым вариантом (и вы хотели бы написать в нем как можно больше своего приложения). Даже если решение не скрывает, как работает приложение, оно может затруднить чтение / повторное использование исходного кода / дизайна - это всего лишь форма запутывания.

Однако этот вопрос направлен на то, чтобы не дать злоумышленникам обойти защиту и / или манипулировать поведением / данными, и для этого немного запутывания путем компиляции в WebAssembly не собирается купить вам какую-либо защиту.

0 голосов
/ 03 мая 2018

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; };
...