У овом водичу за почетнике истражите како функционишу преносивост и безбедносни модели WebAssembly (WASM).
Обе теме спадају у напредне концепте WebAssembly (WASM). Препоручујемо да прво прегледате претходне две теме из наше серије о WebAssembly-у намењене почетницима.
Кренимо!
Преносивост WebAssembly-a
Захваљујући својој преносивости, WebAssembly је спреман за употребу на вебу. WASM се може дефинисати као преносива платформа са окружењем типа „sandbox“.
Штавише, његов бинарни формат омогућава извршавање на различитим архитектурама скупа инструкција и оперативним системима. То значи да се WASM може користити не само на вебу већ и изван њега.
Да бисмо разумели преносивост WASM-а, размотрићемо следеће аспекте:
- Локално, ограничено и недетерминистичко окружење.
- Специфичне карактеристике окружења за извршавање
- WASM преносивост на вебу и ван њега
Локално, ограничено и недетерминистичко окружење
WASM захтева ефикасно извршавање и окружења која су локална, ограничена и недетерминистичка. Недетерминизам се односи на рачунарство где алгоритам/компајлер/окружење дају различита понашања или резултате, чак и са истим улазом. Ово је супротно од детерминистичког алгоритма.
Друга два аспекта, ограниченост и локалност, су повезана са недетерминистичким извршавањем. Да би недетерминистичко извршавање функционисало, потребни су добро дефинисани случајеви употребе који су „ограничени“.
Такође, ова извршавања су „локална“, без утицаја изван окружења. За више детаља о недетерминизму, погледајте званичну документацију WebAssembly-a.
Специфичне карактеристике окружења за извршавање
Да би WebAssembly био преносив, претпоставља се да окружење за извршавање нуди следеће карактеристике:
- Адресирање меморије по бајтовима и 8-битним бајтовима.
- 32-битни цели бројеви са знаком у формату „два комплемента“. Опционо и 64-битни.
- Могућност емулације софтвера кроз неусклађен приступ меморији или поуздано хватање изузетака.
- Подршка за 32-битне и 64-битне бројеве са помичном тачком, у складу са стандардом IEEE 754-2008.
- Гаранција да ће све нити бити извршене и напредовати.
- За 64-битни приступ, wasm64 треба да обезбеди операције атомске меморије без закључавања.
- Операције атомске меморије без закључавања обухватају приступ 8, 16 и 32-битним вредностима.
- wasm64 подржава линеарну меморију већу од 4GB користећи 64-битне индексе или показиваче.
- Редослед бајтова је „little-endian“.
Сви главни прегледачи, укључујући Chrome, Edge, Firefox и WebKit, подржавају све ове еколошке захтеве.
Поред тога, WebAssembly се брзо развија. WASM Community Group и W3C WebAssembly Working Group раде на његовој стандардизацији. То значи да се било који од ових захтева може променити у будућности.
WASM преносивост на вебу и ван њега
Примарни циљ WebAssembly-a је да обезбеди преносивост и перформансе блиске изворном коду, како на вебу, тако и ван њега. У овом одељку ћемо видети како WASM то постиже.
#1. Уграђивање на вебу
WASM се добро интегрише са веб екосистемом, укључујући безбедносни модел веба, преносивост и веб API-је. Поред тога, оставља довољно простора за креативни развој (погледајте WebAssembly за почетнике – 2. део да бисте разумели његове циљеве).
Како WASM постиже компатибилност са вебом? Користи JavaScript API-је, омогућавајући програмерима да лако користе JavaScript за компајлирање WebAssembly модула. Такође, брине се о складиштењу и преузимању модула компајлера, управљању увозима из модула компајлера, управљању меморијом итд.
За више информација о томе како WASM постиже високу компатибилност са вебом, прочитајте: Web Embedding – WebAssembly.
#2. Уграђивање ван веба
Као што је раније поменуто, WASM такође функционише у не-веб окружењима. Као програмер или компанија, можете креирати апликације високих перформанси или писати делове апликација којима је потребно оптимизовање перформанси. На пример, можете га користити на IoT уређајима, серверима у центрима података и десктоп/мобилним апликацијама.
Како не-веб апликације не могу користити веб API-је, ослањају се на WASM-ово динамичко повезивање. Такође, морате користити тестирање функција, процес развоја софтвера који тестира вишеструке варијације функција да би се утврдило шта је најбоље за корисничко искуство. Штавише, програмери могу користити JavaScript VM да поједноставе уграђивање ван веба или развијати своје апликације без њега.
За више информација прочитајте Non-Web Embeddings – WebAssembly.
Безбедност WebAssembly-a
WebAssembly је решење у бинарном формату које нуди перформансе сличне изворном коду. Одлично функционише на вебу, али се такође може прилагодити за рад у не-веб окружењима. Ово чини WASM широко доступним у свим услугама, решењима и процесима. Међутим, то значи и више безбедносних изазова.
WASM безбедносни изазови и ризици
Иако се WebAssembly сматра безбедним и ефикасним, он долази са неколико безбедносних ризика, укључујући:
- WASM sandbox
- Управљање меморијом
- Обфускација кода
- Провере интегритета
#1. WebAssembly Sandbox
WASM се извршава унутар веб прегледача, баш као и JavaScript. Користи исту виртуелну машину (VM) као JavaScript. Sandbox ефикасно обезбеђује сигурно окружење за извршавање и скрива оно што се дешава у позадини.
Дакле, ако JavaScript/WebAssembly код садржи злонамерни код, тешко га је открити јер је у питању „црна кутија“. Такође, WASM код је у бинарном формату спремном за покретање; ради брже, што отежава антивирусним решењима да траже злонамерни код. На пример, код може да садржи нежељене рекламе или могућност преусмеравања корисника на нежељене сајтове са малвером.
Поред тога, претерано ослањање WebAssembly-a на JavaScript да би се покренуо на вебу такође значи да он наслеђује рањивости JavaScript-a. Зато, као програмер, морате се придржавати JavaScript-ових мера предострожности и правила када кодирате WASM.
#2. Управљање меморијом
Управљање меморијом у WASM-у је компликовано. Прво, не приступа директно физичкој меморији док се извршава унутар VM-а. Зато користи меморију хост машине.
Друго, чишћење меморије у WASM-у захтева експлицитан процес, док се, у поређењу, JavaScript чисти сам.
Поред тога, када WASM функција враћа резултат у JavaScript, она враћа показивач на позицију унутар додељеног WASM меморијског простора. Дакле, ако се декларисана меморија напуни, WASM програм може да се сруши, уништавајући корисничко искуство. Да би то спречили, програмери морају користити средства за дезинфекцију за отклањање грешака у свом коду или користити ланце алата као што је emscripten.
#3. Обфускација кода
Извршавање WASM-овог sandbox-а чини његов код обфускованим. Поред тога, WASM бинарни формат такође није читљив, што отежава обрнути инжењеринг, који је неопходан за идентификацију злонамерног кода.
Ово отежава отклањање грешака у WebAssembly коду због недостатка формата који је читљив за људе. Ово отвара многе безбедносне рупе, укључујући способност хакера да сакрију код који краде осетљиве информације или врши убацивање кода како би преузели главну машину.
#4. Провере интегритета
Сви подаци који се преносе преко веба су подложни манипулацији. На пример, хакери могу да изврше „man-in-the-middle“ напад да би променили вредности података. То је проблем за WASM, с обзиром да нема одговарајући начин за проверу интегритета.
Међутим, може да ради са JavaScript-ом за проверу интегритета. Други начин да се идентификују потенцијалне рањивости WASM кода је коришћење алата за интеграцију као што је Jit. То осигурава да код нема лоших актера и да не може утицати на апликације или околну инфраструктуру у облаку.
Разумевање WASM безбедносног модела
WebAssembly озбиљно схвата безбедност. Зато су у званичним документима WASM-а напоменули да њихов безбедносни модел узима у обзир два важна циља:
- Осигурати да нема грешака или злонамерних модула који утичу на кориснике.
- Осигурати да програмери могу да ублаже било какве безбедносне ризике и креирају сигурне апликације, уз очување првог циља.
WASM безбедносни модел разуме да се WebAssembly апликације извршавају независно, не могући да побегну из sandbox окружења. Међутим, API-ји могу отворити пут за напад на окружење домаћина.
Друга техника отпорна на грешке укључује детерминистичко извршавање апликација са ограниченим очекивањима. Осигуравањем оба услова, већина извршавања апликација се сматра безбедним.
Да би побољшали безбедност, програмери би требало да примењују политику истог порекла за проток информација. Ако развијате за не-веб, морате користити POSIX безбедносни модел. Ако желите да прочитате више о његовом безбедносном моделу, погледајте: Security – WebAssembly.
WebAssembly System Interface (WASI)
WASI (WebAssembly System Interface) такође игра кључну улогу у WASM не-веб уграђивању, јер побољшава безбедност. То је модуларни системски интерфејс који нуди важне безбедносне карактеристике и преносивост.
У ствари, сада је део Повеље подгрупе за интерфејс система WebAssembly и стога је стандардизован. Захваљујући WASI-ју, WASM је широко прихваћен у различитим рачунарским областима на рубовима/серверима. Такође, WASI поједностављује безбедност при преласку на не-веб уграђивање из окружења за уграђивање на вебу.
Завршне речи
Преносивост и безбедност WebAssembly-a су две опсежне теме. У трећем делу WebAssembly-a за почетнике, покушали смо да их поједноставимо и објаснимо, посебно за почетнике.
У наставку, можете погледати JavaScript cheatsheet за програмере и оне који уче.