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 праектаў, раней адасоблена якія развіваюцца кампаніямі-заснавальнікамі альянсу:

  • wasmtime - runtime для выканання WebAssembly-прыкладанняў з пашырэннямі WASI як звычайных адасобленых прыкладанняў. Падтрымліваецца як запуск байткода WebAssembly пры дапамозе спецыяльнай утыліты каманднага радка, так і кампаноўка гатовых выкананых файлаў (wasmtime убудоўваецца ў дадатак як бібліятэка). Wasmtime мае гнуткую модульную структуру, якая дазваляе маштабаваць runtime для розных ужыванняў, напрыклад, можна сфармаваць зрэзаную версію для прылад з абмежаванымі рэсурсамі;
  • Lucet - кампілятар і runtime для выканання праграм у фармаце WebAssembly. Адметнай асаблівасцю Lucet з'яўляецца ўжыванне замест JIT паўнавартаснай папераджальнай кампіляцыі (AOT, ahead-of-time) у машынны код, прыдатны для прамога выканання. Праект развіваўся кампаніяй Fastly і аптымізаваны для спажывання мінімальных рэсурсаў і вельмі хуткага запуску новых асобнікаў (Fastly ужывае Lucet у рухавічку хмарных edge-вылічэнняў, які выкарыстоўвае WebAssembly для апрацоўшчыкаў, якія запускаюцца на кожны запыт). У рамках сумеснага праекту кампілятар Lucet плануецца перавесці на выкарыстанне Wasmtime у якасці асновы;
  • ВАМР (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

Дадаць каментар