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

Давайте подробнее рассмотрим уникальные проблемы безопасности WebAssembly, создав пример приложения с Blazor, веб-платформой с открытым исходным кодом. Blazor позволяет нам писать код C# вместо JavaScript для наших веб-страниц. Код C# встроен в библиотеки динамической компоновки (DLL) и файлы WebAssembly (.wasm), работающие в клиентском браузере.

Предпосылки

Прежде чем погрузиться в этот учебник, убедитесь, что у вас есть следующее:

  • Загрузите и установите либо Visual Studio, либо VS Code. Это интегрированная среда разработки (IDE), которую вы будете использовать для написания и запуска кода WebAssembly. Если вы выбрали VS Code, загрузите и установите .NET SDK и расширение C#.
  • Установите Расширение Visual Studio или Расширение Snyk для VS Code. Этот плагин будет сканировать и анализировать безопасность нашего кода WebAssembly.
  • Скачать пример проекта.

Запустите пример проекта

Если вы выбрали Visual Studio для своей IDE, откройте установщик Visual Studio и установите флажок Инструменты сборки .NET WebAssembly:

Откройте меню Инструменты › Параметры › Snyk, затем Общие настройки. Затем нажмите кнопку Подключить Visual Studio к Snyk.io.

Если вы выбрали VS Code в качестве IDE, щелкните значок Snyk на левой панели инструментов. Затем нажмите Доверять рабочей области и подключиться.

Запустите программу в Visual Studio или VS Code, чтобы запустить пример приложения, которое выглядит так, как показано на снимке экрана ниже, с заголовком, изображением и текстом «Отдел кадров».

Проблема безопасности №1: изоляция модулей WebAssembly

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

Двумя передовыми методами реализации изоляции модулей являются песочница и разделение.

Песочница предполагает размещение каждого модуля в отдельной изолированной среде, которая ограничивает доступ к хост-системе и другим модулям. На изображении ниже показан проект с двумя модулями WebAssembly (Финансы и Кадры). При компиляции и развертывании проекта в веб-браузере модули WebAssembly выполняются в изолированной среде, отделенной от среды выполнения хоста.

Разделение предполагает разделение основного приложения и его модулей на отдельные отсеки, каждый со своими собственными ресурсами и привилегиями доступа.

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

Затем используйте расширение Snyk Visual Studio Code, чтобы проверить, уязвим ли код WebAssembly. Откройте меню Расширения › Snyk и нажмите Сканировать.

Snyk анализирует файл и выявляет известные проблемы WebAssembly Code Quality и уязвимости, связанные с открытым исходным кодом и безопасностью кода. Если он находит проблемы или уязвимости, Snyk предлагает подробную информацию о проблеме и рекомендации по ее устранению.

Проблема безопасности № 2: линейная модель памяти WebAssembly

Линейная модель памяти — это метод адресации памяти, использующий одно непрерывное адресное пространство для организации памяти. Такой подход позволяет процессору обращаться к ячейкам памяти напрямую и последовательно. На изображении ниже показан объект, совместно используемый кодом JavaScript и WebAssembly, использующий пространство в линейной памяти.

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

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

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

  • Используйте проверку границ, чтобы убедиться, что модули обращаются к памяти только в пределах выделенного им диапазона.
  • Избегайте небезопасных функций, чтобы предотвратить уязвимости, связанные с повреждением памяти.
  • Реализуйте механизмы защиты памяти, такие как рандомизация структуры адресного пространства (ASLR) и предотвращение выполнения данных (DEP).

Проблема безопасности №3: JIT-компиляция WebAssembly

Компиляция WebAssembly точно в срок (JIT) компилирует код Wasm в машинный код во время выполнения, а не заранее. Хотя этот процесс обеспечивает значительные преимущества в производительности, он также создает потенциальные риски для безопасности.

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

var a = (0x11223344^0x44332211^0x44332211^ ...);

Затем JIT-компилятор преобразует эту инструкцию в серию собственных инструкций кода x86:

0000:  b8 44 33 22 11      mov $0x11223344,%eax    mov eax,0x11223344
0005:  35 11 22 33 44      xor $0x44332211,%eax    xor eax,0x44332211
000a:  35 11 22 33 44      xor $0x44332211,%eax    xor eax,0x44332211

Злоумышленник использует известную ошибку, чтобы переместить указатель выполнения на адрес 0001. При этом выполняется вредоносный набор инструкций, тщательно созданных и внедренных в приведенную выше константу.

Чтобы снизить риски безопасности JIT-компиляции в приложениях WebAssembly, реализуйте следующие передовые методы управления процессом компиляции:

  • Использование предварительной компиляции (AOT) для компиляции кода Wasm в машинный код перед выполнением. Такой подход устраняет риски, связанные с динамической компиляцией.
  • Применение исправлений безопасности для известных уязвимостей в JIT-компиляторах.

Проблема безопасности № 4: веб-API и межсайтовый скриптинг (XSS)

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

Чтобы уменьшить риски XSS-атак в приложениях WebAssembly, внедрите лучшие практики для проверки ввода и кодирования вывода:

  • Проверка ввода проверяет ввод пользователя на наличие потенциально вредоносного кода или символов и отклоняет ввод, не соответствующий определенным критериям.
  • Кодирование вывода включает кодирование пользовательского ввода или вывода для предотвращения выполнения вредоносного кода.

Кроме того, используйте HTTPS для шифрования данных, передаваемых между сервером и клиентом, чтобы злоумышленники не могли перехватить и изменить данные при передаче.

Проблема безопасности № 5: небезопасная доставка контента WebAssembly

Безопасная доставка контента имеет решающее значение для приложений WebAssembly, гарантируя, что пользователи получат аутентичный неизмененный код, доставляемый по надежному каналу. Небезопасная доставка контента может создавать риски для безопасности, включая атаки «человек посередине» (MITM) и подделку кода.

В атаках MITM злоумышленники перехватывают и модифицируют код, когда он передается между сервером и клиентом. Этот метод позволяет злоумышленнику внедрить вредоносный код в приложение, которое может выполнить браузер или среда выполнения Wasm.

Чтобы защитить доставку контента в приложениях WebAssembly, следуйте приведенным ниже рекомендациям.

  • Используйте HTTPS для шифрования данных между сервером и клиентом, обеспечивая безопасную и неизменную передачу кода.
  • Используйте проверки целостности контента, такие как контрольные суммы или цифровые подписи, для проверки подлинности кода.
  • Внедрите механизмы контроля доступа, чтобы ограничить доступ к коду авторизованным пользователям.

Соберите безопасно и надежно

Разработчики с энтузиазмом восприняли WebAssembly — технологию, которая позволяет им писать высокопроизводительные приложения в веб-браузерах. Однако преимущества WebAssembly сопряжены со значительными проблемами безопасности.

В этой статье были рассмотрены некоторые проблемы безопасности WebAssembly: неправильная изоляция модулей, отсутствие защиты в линейной модели памяти, уязвимости компилятора JIT, атаки с использованием межсайтовых сценариев и небезопасная доставка контента WebAssembly.

К счастью, несколько лучших практик устраняют уязвимости, которые представляет WebAssembly. Соблюдение этих мер безопасности помогает защитить пользователей и их приложения WebAssembly.

Для защиты ваших систем и пользователей также важно быть в курсе последних угроз безопасности, влияющих на WebAssembly. Инструменты разработки помогают. Например, платформа Snyk поддерживает обширный каталог известных уязвимостей и предлагает полезную информацию для снижения этих рисков. Такие инструменты, как Snyk Code и Snyk Open Source, позволяют быстро обнаруживать и устранять проблемы с безопасностью кода. Начните свой бесплатный аккаунт сегодня.