Может ли 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 не собирается покупать вам какую-либо ценную бумагу.