Mozilla, Fastly, Intel и Red Hat продвигают WebAssembly, как платформу для универсального применения

Компании Mozilla, Fastly, Intel и Red Hat объединили свои усилия в развитии технологий, способствующих превращению WebAssembly в универсальную платформу для безопасного выполнения кода в любых инфраструктурах, операционных системах и устройствах. Для совместной разработки runtime и компиляторов, позволяющих применять WebAssembly не только в web-браузерах, образовано сообщество Bytecode Alliance.

Для создания поставляемых в формате WebAssembly переносимых программ, которые можно выполнять вне браузера, предлагается использовать API WASI (WebAssembly System Interface), предоставляющий программные интерфейсы для прямого взаимодействия с операционной системой (POSIX API для работы с файлами, сокетами и т.п.). Отличительной особенностью модели выполнения приложений, использующих WASI, является запуск в sandbox-окружении для изоляции от основной системы и применение механизма безопасности на основе управления возможностями — для действий с каждым из ресурсов (файлы, каталоги, сокеты, системные вызовы и т.п.) приложению должны быть даны соответствующие полномочия (предоставляется только доступ к заявленной функциональности).

Одной из целей созданного альянса является решение проблемы распространения современных модульных приложений, имеющих большое число зависимостей. В подобных приложениях каждая зависимость может быть потенциальным источником уязвимостей или атак. Получение контроля за зависимостью позволяет получить контроль и за всеми связанными с ней приложениями. Доверие к приложению, автоматически подразумевает наличие доверия и ко всем зависимостям, но зависимости зачастую разрабатываются и сопровождаются посторонними командами, деятельность которых невозможно проконтролировать. Участники Bytecode Alliance намерены подготовить целостное решение для безопасного выполнения WebAssembly-приложений, изначально не заслуживающих доверия.

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

Запрашиваемые полномочия смогут определяться как на уровне самих зависимостей, так и делегироваться зависимостям по цепочке родительскими модулями (ресурсы в WASI ассоциируются со специальным типом файловых дескрипторов — capability). Например, модулю может быть делегирована возможность обращения к определённому каталогу и системным вызовам, и в случае компрометации инфраструктуры разработки модуля или выявления уязвимости, при атаке доступ будет ограничен лишь этими ресурсами. Декларирование ресурсов создателями модулей может стать индикатором подозрительной активности, например, когда модуль для обработки текста запрашивает полномочие на открытие сетевого соединения. Изначально заданные полномочия проверяются и в случае их изменения загрузка зависимости отвергается до обновления локальной сигнатуры модуля.

Для совместной разработки под крыло Bytecode Alliance переведено несколько связанных с WebAssembly проектов, ранее обособленно развиваемых компаниями-учредителями альянса:

  • Wasmtime — runtime для выполнения WebAssembly-приложений с расширениями WASI как обычных обособленных приложений. Поддерживается как запуск байткода WebAssembly при помощи специальной утилиты командной строки, так и компоновка готовых исполняемых файлов (wasmtime встраивается в приложение как библиотека). Wasmtime имеет гибкую модульную структуру, которая позволяет масштабировать runtime для различных применений, например, можно сформировать урезанную версию для устройств с ограниченными ресурсами;
  • Lucet — компилятор и runtime для выполнения программ в формате WebAssembly. Отличительной особенностью Lucet является применение вместо JIT полноценной упреждающей компиляции (AOT, ahead-of-time) в машинный код, пригодный для прямого исполнения. Проект развивался компанией Fastly и оптимизирован для потребления минимальных ресурсов и очень быстрого запуска новых экземпляров (Fastly применяет Lucet в движке облачных edge-вычислений, использующем WebAssembly для обработчиков, запускаемых на каждый запрос). В рамках совместного проекта компилятор Lucet планируется перевести на использование Wasmtime в качестве основы;
  • WAMR (WebAssembly Micro Runtime) — ещё один runtime для выполнения WebAssembly, изначально разработанный компанией Intel для применения в устройствах интернета вещей. WAMR оптимизирован для минимального потребления ресурсов и может применяться на устройствах с небольшим объёмом оперативной памяти. Проект включает в себя интерпретатор и виртуальную машину для выполнения байткода WebAssembly, API (подмножество Libc) и инструментарий для динамического управления приложениями;
  • Cranelift — генератор кода, транслирующий независимое от аппаратных архитектур промежуточное представление в исполняемый машинный код, оптимизированный для конкретных аппаратных платформ. Cranelift поддерживает распараллеливание компиляции функций для очень быстрой генерации результата, что позволяет использовать его для создания JIT-компиляторов (JIT на базе Cranelift используется в виртуальной машине Wasmtime);
  • WASI common — обособленная реализация API WASI (WebAssembly System Interface) для организации взаимодействия с операционной системой;
  • cargo-wasi — модуль к пакетному менеджеру Cargo, реализующий команду для компиляции кода на языке Rust в байткод WebAssembly с задействованием интерфейса WASI для использования WebAssembly вне браузера;
  • wat и wasmparser — парсеры для разбора текстового (WAT, WAST) и бинарного представлений байткода WebAssembly.

Напомним, WebAssembly во многом напоминает Asm.js, но отличается тем, что является бинарным форматом, не завязанным на JavaScript и позволяющим выполнять в браузере низкоуровневый промежуточный код, скомпилированный из различных языков программирования. В WebAssembly не требуется применение сборщика мусора, так как применяется явное управление памятью. Благодаря задействованию JIT для WebAssembly можно добиться уровня производительности близкого к нативному коду. Среди основных задач WebAssembly выделяется обеспечение переносимости, предсказуемость поведения и идентичности выполнения кода на разных платформах.

Источник: opennet.ru

Добавить комментарий