WASI: WebAssembly вне браузера

Узнаём, как Wasm выходит за пределы браузера через WASI.

WASI (WebAssembly System Interface) — это стандартный набор системных функций (файлы, время, сеть), который даёт Wasm безопасный доступ к ОС вне браузера.

Проблема за пределами браузера

В браузере Wasm получает доступ к миру через импорты из JS. А на сервере или в CLI нет JS-окружения — но есть файлы, аргументы командной строки, время, сеть. Нужен стандартный интерфейс к ОС, иначе каждый рантайм придумывал бы свой. Этим стандартом и стал WASI: набор системных вызовов, который рантайм (Wasmtime, WasmEdge) предоставляет модулю как импорты.

Что даёт WASI

ВозможностьЧто позволяет
Файловая системачитать/писать файлы (но только в разрешённых папках)
Аргументы и переменныеargv, env — как у обычной программы
Время и часытекущее время, монотонный таймер
Случайностькриптослучайные байты
Сеть (WASI Preview 2)сокеты с явным разрешением

Программа «Hello, WASI»

Простейшая WASI-программа печатает текст в stdout. Например, на Rust для цели wasm32-wasi. Исходник помечаем language-text — это код для компиляции, не для браузера:

// main.rs, цель wasm32-wasi
fn main() {
    println!("Привет из WASI!");
}
rustc --target wasm32-wasi main.rs -o hello.wasm
wasmtime hello.wasm
# выведет: Привет из WASI!

Главная идея — безопасность через возможности

WASI устроен по принципу capability-based security (безопасность на основе возможностей). Программа не получает доступ ко всей файловой системе автоматически. Рантайму явно говорят: «разреши этому модулю папку /data» — и только её модуль и увидит. Это противоположность обычным процессам, которые по умолчанию могут трогать многое.

# дать модулю доступ только к папке ./data
wasmtime run --dir=./data app.wasm

Почему это будущее

WASI делает один и тот же .wasm-модуль переносимым: он запускается на Linux, Windows, macOS, на ARM и x86 — без перекомпиляции, ведь рантайм одинаков везде. Плюс изоляция из коробки. Это привлекательно для serverless (быстрый холодный старт), edge-вычислений (один артефакт на любую площадку) и плагинов (безопасное исполнение чужого кода).

Как работает под капотом

Когда WASI-модуль вызывает «записать в файл», он на самом деле зовёт импортированную функцию вроде fd_write. Рантайм перехватывает этот вызов, проверяет, разрешён ли данный файловый дескриптор (выдан ли он через --dir), и только тогда обращается к реальной ОС. То есть все системные вызовы проходят через шлюз рантайма, который применяет политику доступа. Песочница не «вокруг» модуля, а встроена в сам интерфейс.

Частые ошибки

  • Ждать полного доступа к ФС — без явного --dir модуль не увидит ни одной папки.
  • Путать WASI и браузерный Wasm — в браузере импорты от JS, в WASI — системный интерфейс рантайма.
  • Считать сеть всегда доступной — сетевые возможности появились позже (Preview 2) и тоже требуют разрешения.

Итоги

  • WASI — стандартный системный интерфейс для Wasm вне браузера.
  • Даёт файлы, время, аргументы, случайность, сеть — но по явному разрешению.
  • Безопасность на основе возможностей: доступ только к тому, что выдали.
  • Один модуль переносим между ОС и архитектурами — будущее serverless/edge.
Проверьте себя
1. Что такое WASI?
AБраузерный API для Wasm
BСтандартный системный интерфейс, дающий Wasm безопасный доступ к ОС вне браузера
CФормат сжатия модулей
DЯзык программирования
2. Как WASI решает вопрос безопасности доступа к файлам?
AЗапрещает файлы полностью
BЧерез capability-based: модуль видит только явно разрешённые папки
CШифрует все файлы
DДоступ к ФС открыт по умолчанию
3. Почему WASI считают перспективным для serverless и edge?
AОн быстрее браузера
BОдин и тот же модуль переносим между ОС/архитектурами и изолирован из коробки
CОн не требует памяти
DОн работает только на x86