WebAssembly для начинающих, часть 3: как работает переносимость и безопасность WASM
Опубликовано: 2023-01-05Узнайте, как работают модели переносимости и безопасности WebAssembly (WASM) в этом руководстве для начинающих.
Оба являются расширенными темами WebAssembly (WASM). Мы рекомендуем вам прочитать два предыдущих раздела в нашей серии WebAssembly для начинающих.
- WebAssembly для начинающих. Часть 1. Введение в WASM
- WebAssembly для начинающих. Часть 2. Цели, ключевые понятия и варианты использования
Давайте начнем.
Переносимость WebAssembly
Портативность WebAssembly делает его готовым к использованию в Интернете. Фактически вы можете определить WASM как переносную изолированную платформу.
Кроме того, его двоичный формат позволяет выполнять его в различных архитектурах наборов команд и операционных системах. Это означает, что вы можете использовать WASM не только в Интернете, но и вне Интернета.
Чтобы понять переносимость WASM, мы обсудим следующее:
- Локальная, ограниченная и недетерминированная среда.
- Конкретные характеристики среды выполнения
- Веб- и не-веб-переносимость WASM
Локальный, ограниченный и недетерминированный
WASM нуждается в эффективном выполнении и соответствующих средах, которые являются локальными, ограниченными и недетерминированными. Недетерминизм — это вычисление, которое указывает, что алгоритм/компилятор/среда выводит разное поведение или результаты даже для одних и тех же входных данных. Это противоположность детерминированному алгоритму.
Два других аспекта, limited и local , связаны с недетерминированным выполнением. Чтобы заставить недетерминированное выполнение работать, вам нужны четко определенные варианты использования, которые « ограничены ».
Кроме того, эти исполнения являются « локальными » и не влияют на окружающую среду. Прочтите их официальный недетерминизм в документе WebAssembly, чтобы узнать больше об этом.
Конкретные характеристики среды выполнения
Чтобы сделать WebAssembly переносимым, предполагается, что среда выполнения обладает следующими характеристиками:
- Адресация байтовой памяти и 8-битные байты.
- 32-битные целые числа со знаком в дополнении до двух. Опционально 64 бита.
- Программная эмуляция возможна посредством невыровненного доступа к памяти или надежного захвата.
- Поддержка 32-битных и 64-битных чисел с плавающей запятой, как определено в IEEE 754-2008.
- Гарантия выполнения всех потоков с продвижением вперед.
- Для 64-битного доступа wasm64 должен предоставлять неблокирующие операторы атомарной памяти.
- Операторы атомарной памяти без блокировок включают 8-, 16- и 32-разрядный доступ.
- wasm64 поддерживает линейную память выше 4 ГБ с 64-битными индексами или указателями.
- Порядок байтов с прямым порядком байтов.
Все основные браузеры, включая Chrome, Edge, Firefox и WebKit, поддерживают все эти экологические требования.
Более того, WebAssembly развивается быстрыми темпами. Группа сообщества WASM и рабочая группа W3C WebAssembly работают над его стандартизацией. Это означает, что любое из этих требований может измениться в будущем.
Веб- и не-веб-переносимость WASM
Основная цель WebAssembly — обеспечить переносимость и нативную производительность в Интернете и вне Интернета. В этом разделе мы рассмотрим, как это достигается с помощью WASM.
№1. Веб-встраивание
WASM хорошо интегрируется с веб-экосистемой, включая веб-модель безопасности, веб-переносимость и веб-API. Кроме того, у него должно быть достаточно места для творческого развития в будущем (прочитайте WebAssembly для начинающих — часть 2, чтобы понять его цели).
Итак, как же WASM обеспечивает совместимость с Интернетом? Он использует API-интерфейсы JavaScript, что позволяет разработчикам легко использовать JavaScript для компиляции модулей WebAssembly. Он также заботится о хранении и извлечении модулей компилятора, управлении импортом из модулей компилятора, управлении памятью и так далее.
Чтобы узнать больше о том, как WASM обеспечивает веб-совместимость высокого уровня, прочтите это: Веб-встраивание — WebAssembly.
№ 2. Не веб-встраивание
Как упоминалось ранее, WASM также работает с несетевыми средами. Как разработчик или бизнес, вы можете создавать высокопроизводительные приложения или писать разделы своего приложения, которые нуждаются в настройке производительности. Например, вы можете использовать его на устройствах IoT, серверах центров обработки данных и настольных/мобильных приложениях.
Поскольку не-веб-приложения не могут использовать веб-API, они полагаются на динамическое связывание WASM. Вам также необходимо использовать тестирование функций, процесс разработки программного обеспечения, который тестирует несколько вариантов функций, чтобы увидеть, что лучше всего подходит для взаимодействия с пользователем. Кроме того, разработчики могут использовать виртуальные машины JavaScript для упрощения встраивания не в Интернет или разработки своих приложений без него.
Чтобы узнать больше, прочитайте Non-Web Embeddings — WebAssembly.
Безопасность WebAssembly
WebAssembly — это решение в двоичном формате, обеспечивающее производительность, аналогичную нативной. Он отлично работает в Интернете, но его также можно настроить для работы с не-веб-встраиваниями. Это делает WASM широко доступным для всех служб, решений и процессов. Однако это означает больше проблем с безопасностью.
Проблемы и риски безопасности WASM
Несмотря на то, что WebAssembly считается безопасным и эффективным, он сопряжен с множеством угроз безопасности, в том числе:
- Песочница WebAssembly
- Управление памятью
- Обфускация кода
- Проверка целостности
№1. Песочница WebAssembly
WASM выполняется в веб-браузере, как и JavaScript. Он использует ту же виртуальную машину (ВМ), что и JavaScript. Песочница эффективно обеспечивает безопасную среду выполнения и препятствует тому, что работает под капотом.
Таким образом, если код JavaScript/WebAssembly содержит вредоносный код, его трудно обнаружить, поскольку это черный ящик. Кроме того, код WASM находится в готовом к запуску двоичном формате; он работает быстрее, что затрудняет поиск вредоносного кода антивирусными решениями. Например, код может содержать нежелательную рекламу или возможность перенаправлять пользователей на нежелательные вредоносные сайты.
Кроме того, чрезмерная зависимость WebAssembly от JavaScript для работы в Интернете также означает, что он наследует уязвимости JavaScript. Вот почему, как разработчик, вы должны соблюдать меры предосторожности и меры безопасности JavaScript при кодировании WASM.
№ 2. Управление памятью
Управление памятью в WASM сложное. Во-первых, он не имеет прямого доступа к физической памяти, так как выполняется внутри виртуальной машины. Вот почему он использует память хост-машины.
Во-вторых, очистка памяти в WASM требует явного процесса, в то время как JavaScript очищает сам себя.
Кроме того, когда функция WASM возвращает выходные данные в JavaScript, она возвращает указатель на позицию в выделенном пространстве памяти WASM. Таким образом, если объявленная память переполняется, программа WASM может давать сбой, что портит работу пользователя. Чтобы предотвратить это, программисты должны использовать дезинфицирующие средства для отладки своего кода или использовать цепочки инструментов, такие как emscripten.
№3. Обфускация кода
Выполнение песочницы WASM делает его код запутанным. Кроме того, двоичный формат WASM также не читается человеком, что затрудняет обратный инжиниринг, необходимый для выявления вредоносного кода.
Это затрудняет отладку кода WebAssembly из-за отсутствия удобочитаемого формата. Это открывает множество лазеек в системе безопасности, включая возможность хакеров скрывать код, который крадет конфиденциальную информацию или внедряет код для захвата хост-компьютера.
№ 4. Проверки целостности
Любые данные, передаваемые через Интернет, уязвимы для изменения данных. Например, хакеры могут выполнить атаку «человек посередине», чтобы изменить значения данных. Это проблема для WASM, учитывая, что у него нет надлежащего способа проверки целостности.
Однако он может работать с JavaScript для проверки целостности. Еще один способ определить потенциальные уязвимости кода WASM — использовать инструменты интеграции, такие как Jit. Это гарантирует, что код свободен от злоумышленников и не может повлиять на приложения или окружающую облачную инфраструктуру.
Понимание модели безопасности WASM
WebAssembly серьезно относится к безопасности. Вот почему в официальных документах WASM они упомянули, что их модель безопасности преследует две важные цели:
- Убедитесь, что никакие ошибочные или вредоносные модули не влияют на пользователей
- Убедитесь, что разработчики могут снижать любые риски безопасности и создавать безопасные приложения, гарантируя, что пункт 1 всегда поддерживается.
Модель безопасности WASM знает, что приложения WebAssembly выполняются независимо, но при этом не могут выйти из своей изолированной программной среды. Однако API-интерфейсы могут открыть путь для атаки на хост-среду.
Другой отказоустойчивый метод включает в себя детерминированное выполнение приложений с ограниченными ожиданиями. При соблюдении обоих условий выполнение большинства приложений считается безопасным.
Чтобы повысить безопасность, разработчики должны применять политику единого источника для потока информации. Если вы разрабатываете не для Интернета, вы должны использовать модель безопасности POSIX. Если вы хотите узнать больше о его модели безопасности, ознакомьтесь с: Безопасность — WebAssembly.
Системный интерфейс WebAssembly (WASI)
WASI (интерфейс системы WebAssembly) также играет решающую роль в не-веб-встраивании WASM, поскольку повышает безопасность. Это модульный системный интерфейс, предлагающий потрясающие характеристики безопасности и портативности.
Фактически, теперь он является частью Устава подгруппы системного интерфейса WebAssembly и, следовательно, стандартизирован. Благодаря WASI WASM получил широкое распространение в различных областях пограничных/серверных вычислений. Кроме того, WASI упрощает безопасность при переходе к не-веб-встраиванию из среды веб-встраивания.
Заключительные слова
Портативность и безопасность WebAssembly — две большие темы. В части 3 WebAssembly для начинающих мы попытались упростить и разбить ее, особенно для новичков.
Далее вы можете ознакомиться с шпаргалками по JavaScript для разработчиков и учащихся.