Как можно проверить подлинность глобальных переменных в браузерном JS?

Представим себе, что у вас есть API, которое вставляется на страницу через <script src=.../>.

Вам необходимо получить доступ к большому количеству браузерных API - от new Function или Object.keys до subtle, Blob, WebWorker, WASM и так далее. Вам нужно убедиться, что переменные не подменены, не обернуты в Proxy, и так далее. Сделать это может другой скрипт или браузерный плагин.

Дополнительные известные условия и ограничения:
- у вас есть полное управление ответом сервера - заголовки, статусы, тело ответа итд
- скрипт загружается не в anonymous режиме (при загрузке скрипта можно работать с cookie)
- вы можете заставить разработчика, который внеряет на страницу ваш скрипт, сделать любые дополнительные действия, которые не ломают его сайт (добавить или изменить заголовки, добавить произвольный код на страницу итд). Но по возможности лучше этого избегать
- И внедряющий сайт, и ваш работают через HTTPS
- Атака Man-in-the-Middle не выполняется на уровне сети/операционной системы, сервер не может стать злоумышленником
- у пользователя не стоят мошеннические HTTPS-сертификаты
- никто в сети не изменяет запросы и ответы
- браузерные плагины могут манипулировать заголовками запроса и ответа (но не телом!). Однако они не могут манипулировать рядом заголовков, таким как CSP (однако могут изменять cookie). Я не знаю, почему именно это работает так, но для меня это кажется хорошим и разумным подходом.
  • Вопрос задан
  • 333 просмотра
Пригласить эксперта
Ответы на вопрос 1
Jabher
@Jabher Автор вопроса
То, о чем знаю я:
- через конструкторы можно получить доверенные объекты Function, Boolean, Number и так далее
- доступ к глобальному объекту window можно получить через (function () {return this}).call(null)
- нельзя изменить значение document, origin, location, domain у window - это либо невозможно, либо вызовет перезагрузку страницы
- проверить WebWorker и document.createElement('iframe') возможно, получив доступ к Blob и URL.createObjectURL.
- контексты исполнения Web Worker, Shared Worker - безопасны, в них нельзя внедриться. Это значит, что все содержимое WorkerNavigator является доверенным.
- можно проверить Web Worker при помощи CSP. sha* алгоритм является криптостойким, это значит, что за разумное время найти код, который решает нужную задачу и при этом имеет корректный sha не является возможным. Если код загружается и отвечает ожидаемым способом, это значит, что сам воркер загрузился (при этом мы все еще не можем считать сам глобальный Worker доверенным)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы