Может ли WASM использоваться для проверки целостности метода JS?

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

В: Могу ли я каким-то образом получить toString по-другому? Также будет оценен любой другой подход.

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


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

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

Ответы

Ответ 1

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

Ответ 2

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

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

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


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

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