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

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

Для створення програм, що постачаються у форматі WebAssembly, які можна виконувати поза браузером, пропонується використовувати API ВАСИ (WebAssembly System Interface), що надає програмні інтерфейси для прямої взаємодії з операційною системою (POSIX API для роботи з файлами, сокетами тощо). Відмінною особливістю моделі виконання додатків, що використовують WASI, є запуск у sandbox-оточенні для ізоляції від основної системи та застосування механізму безпеки на основі управління можливостями – для дій з кожним із ресурсів (файли, каталоги, сокети, системні виклики тощо) додатку мають бути надані відповідні повноваження (надається лише доступ до заявленої функціональності).

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

Для захисту пропонується використовувати концепцію нанопроцесів, в яких кожен модуль залежності виділяється в окремо ізольований WebAssembly-модуль, повноваження якого задаються у прив'язці тільки до цього модуля (наприклад, бібліотека для обробки рядків не зможе відкрити мережний сокет або файл). На відміну від поділу на процеси, WebAssembly-обробники є легковажними і майже не вимагають додаткових ресурсів — взаємодія між обробниками не дуже повільніша за виклик звичайних функцій. Поділ може проводитися не тільки на рівні окремих модулів, але і на рівні груп модулів, яким, наприклад, необхідна робота із загальними областями пам'яті

Повноваження, що запитуються, зможуть визначатися як на рівні самих залежностей, так і делегуватися залежностям по ланцюжку батьківськими модулями (ресурси в WASI асоціюються зі спеціальним типом файлових дескрипторів — capability). Наприклад, модулю може бути делегована можливість звернення до певного каталогу та системних викликів, і у разі компрометації інфраструктури розробки модуля або виявлення вразливості, при атаці доступ буде обмежений лише цими ресурсами. Декларування ресурсів творцями модулів може стати індикатором підозрілої активності, наприклад коли модуль для обробки тексту запитує повноваження на відкриття мережного з'єднання. Спочатку задані повноваження перевіряються й у разі зміни завантаження залежності відкидається до оновлення локальної сигнатури модуля.

Для спільної розробки під крило Bytecode Alliance перекладено кілька пов'язаних з WebAssembly проектів, що раніше відокремлено розвиваються компаніями-засновниками альянсу:

  • Бурі - 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 підтримує розпаралелювання компіляції функцій для дуже швидкої генерації результату, що дозволяє використовувати його для створення JIT-компіляторів (JIT на базі Cranelift використовується у віртуальній машині Wasmtime);
  • WASI common - Відокремлена реалізація API WASI (WebAssembly System Interface) для організації взаємодії з операційною системою;
  • cargo-wasi - модуль до пакетного менеджера Cargo, що реалізує команду для компіляції коду мовою Rust у байткод WebAssembly із залученням інтерфейсу WASI для використання WebAssembly поза браузером;
  • ват и wasmparser - парсери для аналізу текстового (WAT, WAST) і бінарного уявлень байткоду WebAssembly.

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

Джерело: opennet.ru

Додати коментар або відгук