Розберіться, як працюють принципи перенесення та захисту WebAssembly (WASM), використовуючи цей вступний посібник.
Обидві ці теми є досить розгорнутими в контексті WebAssembly (WASM). Наполегливо рекомендуємо ознайомитися з двома попередніми матеріалами нашої серії для початківців з WebAssembly.
Перейдемо до справи.
Мобільність WebAssembly
Мобільність WebAssembly робить його придатним для веб-середовища. По суті, WASM можна охарактеризувати як платформу для перенесення ізольованого програмного середовища.
Крім цього, його бінарний формат дозволяє йому функціонувати на різних архітектурах наборів інструкцій та операційних системах. Це означає, що WASM можна застосовувати не лише в інтернеті, але й за його межами.
Щоб глибше зрозуміти мобільність WASM, розглянемо такі аспекти:
- Локальне, обмежене та недетерміноване середовище.
- Специфікації середовища виконання
- Застосування WASM в інтернеті та за його межами
Локальне, обмежене та недетерміноване середовище
WASM потребує ефективної реалізації та відповідного середовища, яке є локальним, обмеженим і недетермінованим. Недетермінізм стосується обчислень, які можуть генерувати різні результати або поведінку, навіть при однакових вхідних даних. Це відрізняється від детермінованого алгоритму.
Два інші аспекти, обмежений та локальний, пов’язані з недетермінованим виконанням. Щоб таке виконання було можливим, потрібні чітко окреслені варіанти використання, які є “обмеженими”.
Ці процеси виконання є “локальними”, тобто не впливають на зовнішнє середовище. Для більш детального ознайомлення з темою недетермінізму, радимо звернутися до офіційної документації WebAssembly.
Специфікації середовища виконання
Для забезпечення мобільності WebAssembly передбачається, що середовище виконання забезпечує наступні характеристики:
- Адресація пам’яті на рівні байтів та використання 8-бітних байтів.
- 32-бітні цілі числа зі знаком, представлені у додатковому коді. Додатково, 64-бітові цілі числа.
- Можливість програмної емуляції через не вирівняний доступ до пам’яті або безпечне перехоплення.
- Підтримка 32-бітних та 64-бітних чисел з плаваючою комою, як визначено стандартом IEEE 754-2008.
- Гарантоване послідовне виконання всіх потоків.
- Для 64-бітного доступу, wasm64 повинен надавати атомарні операції з пам’яттю без блокування.
- Атомарні операції з пам’яттю без блокування включають 8, 16 та 32-бітний доступ.
- wasm64 підтримує лінійну пам’ять понад 4 ГБ з 64-бітними індексами або покажчиками.
- Порядок байтів – little-endian.
Всі провідні браузери, зокрема Chrome, Edge, Firefox та WebKit, підтримують ці екологічні вимоги.
Крім того, WebAssembly активно розвивається. WASM Community Group та W3C WebAssembly Working Group працюють над його стандартизацією. Тому, в майбутньому, деякі з цих вимог можуть бути змінені.
Мобільність WASM в інтернеті та поза ним
Головною метою WebAssembly є забезпечення мобільності та продуктивності, що нагадує нативну, як в інтернеті, так і за його межами. Розглянемо, як WASM цього досягає.
#1. Інтеграція у вебі
WASM легко інтегрується у вебінфраструктуру, враховуючи модель безпеки, переносність і веб-API. Крім того, він надає достатньо простору для творчого розвитку (для розуміння його цілей, перегляньте статтю WebAssembly для початківців – частина 2).
Як WASM забезпечує сумісність з інтернетом? Він використовує JavaScript API, що дозволяє розробникам використовувати JavaScript для компіляції модулів WebAssembly. Також забезпечується зберігання та отримання модулів компілятора, управління імпортом, управління пам’яттю тощо.
Для глибшого розуміння сумісності WASM з веб-середовищем, рекомендуємо ознайомитися з матеріалом: Веб-інтеграція – WebAssembly.
#2. Інтеграція поза вебом
Як зазначалось, WASM працює і в середовищах поза інтернетом. Розробники та компанії можуть створювати високоефективні додатки або писати частини програм, що потребують оптимізації. Наприклад, його можна використовувати в пристроях Інтернету речей, серверних центрах обробки даних та настільних/мобільних додатках.
Оскільки позавеб-програми не можуть використовувати веб-API, вони покладаються на динамічне зв’язування WASM. Необхідно використовувати тестування функцій – процес розробки програмного забезпечення, який аналізує різні варіанти функцій для визначення найкращого варіанту взаємодії з користувачем. Також розробники можуть використовувати віртуальні машини JavaScript для спрощення інтеграції в не веб-середовище або розробляти програми без їх використання.
Для більш детальної інформації зверніться до статті: Інтеграція поза вебом – 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 зазначено, що їхня модель безпеки враховує дві важливі цілі:
Модель безпеки WASM враховує, що програми WebAssembly виконуються незалежно, не маючи можливості вийти за межі ізольованого програмного середовища. Проте, API можуть створити шлях для атаки на хост-середовище.
Інший метод захисту полягає в детермінованому виконанні програм з обмеженими очікуваннями. Забезпечивши обидві ці умови, виконання більшості програм можна вважати безпечним.
Для підвищення безпеки, розробники повинні застосовувати політику однакового походження для передачі інформації. Якщо розробка ведеться не для інтернету, потрібно використовувати модель безпеки POSIX. Для отримання додаткової інформації про модель безпеки, радимо переглянути: Безпека – WebAssembly.
Системний інтерфейс WebAssembly (WASI)
WASI (системний інтерфейс WebAssembly) також відіграє важливу роль у інтеграції WASM в не веб-середовище, покращуючи безпеку. Це модульний системний інтерфейс, який забезпечує високий рівень безпеки та мобільності.
Наразі він є частиною Статуту підгрупи інтерфейсу системи WebAssembly і, отже, стандартизований. Завдяки WASI, WASM широко використовується у різноманітних периферійних/серверних обчисленнях. Також, WASI спрощує безпеку під час переходу від веб-інтеграції до не веб-інтеграції.
Заключні слова
Мобільність та безпека WebAssembly – це дві великі теми. У частині 3 статті “WebAssembly для початківців” ми постаралися спростити їх та розкласти по поличках, особливо для новачків.
Далі ви можете ознайомитися зі шпаргалками JavaScript для розробників та студентів.