Išsami WebAssembly modulio patvirtinimo proceso analizė, nagrinėjanti jo esminį vaidmenį saugumo, tipų tikrinimo ir saugaus vykdymo įvairiose pasaulinėse platformose srityse.
WebAssembly modulio patvirtinimo procesas: saugumo ir tipų vientisumo užtikrinimas globalioje aplinkoje
WebAssembly (Wasm) greitai iškilo kaip revoliucinė technologija, leidžianti našiai ir nešiojamai vykdyti kodą internete ir už jo ribų. Jos pažadas pasiekti beveik prigimtinį greitį ir saugią vykdymo aplinką daro ją patrauklią įvairioms programoms – nuo internetinių žaidimų ir sudėtingų duomenų vizualizacijų iki „serverless“ funkcijų ir kraštinės kompiuterijos. Tačiau pati Wasm galia reikalauja tvirtų mechanizmų, užtikrinančių, kad nepatikimas kodas nepakenktų pagrindinės sistemos saugumui ar stabilumui. Būtent čia lemiamą vaidmenį atlieka WebAssembly modulio patvirtinimo procesas.
Globalizuotoje skaitmeninėje ekosistemoje, kurioje programos ir paslaugos sąveikauja tarp žemynų ir veikia įvairiose aparatinės bei programinės įrangos konfigūracijose, gebėjimas pasitikėti ir saugiai vykdyti kodą iš įvairių šaltinių yra svarbiausias. Patvirtinimo procesas veikia kaip kritiškai svarbus vartų sargas, kruopščiai tikrinantis kiekvieną gaunamą WebAssembly modulį prieš leidžiant jį paleisti. Šiame įraše gilinsimės į šio proceso subtilybes, pabrėšime jo svarbą tiek saugumui, tiek tipų tikrinimui, taip pat jo poveikį pasaulinei auditorijai.
Būtinybė patvirtinti WebAssembly modulius
WebAssembly dizainas yra iš prigimties saugus, sukurtas su izoliuotos aplinkos vykdymo modeliu. Tai reiškia, kad Wasm moduliai pagal numatytuosius nustatymus negali tiesiogiai pasiekti pagrindinės sistemos atminties ar atlikti privilegijuotų operacijų. Tačiau ši izoliuota aplinka priklauso nuo paties Wasm baitkodo vientisumo. Teoriškai piktavaliai galėtų bandyti sukurti Wasm modulius, kurie išnaudoja galimus interpretatoriaus ar vykdymo aplinkos pažeidžiamumus arba tiesiog bando apeiti numatytas saugumo ribas.
Įsivaizduokite scenarijų, kai tarptautinė korporacija naudoja trečiosios šalies Wasm modulį kritiškai svarbiam verslo procesui. Be griežto patvirtinimo, klaidingas ar kenkėjiškas modulis galėtų:
- Sukelti paslaugos trikdymą (denial-of-service), sugadindamas vykdymo aplinką.
- Netyčia nutekinti jautrią informaciją, prieinamą Wasm izoliuotoje aplinkoje.
- Bandyti neteisėtai pasiekti atmintį, potencialiai sugadinant duomenis.
Be to, WebAssembly siekia būti universaliu kompiliavimo tikslu. Tai reiškia, kad kodas, parašytas C, C++, Rust, Go ir daugeliu kitų kalbų, gali būti sukompiliuotas į Wasm. Šio kompiliavimo proceso metu gali atsirasti klaidų, dėl kurių Wasm baitkodas gali būti neteisingas arba netinkamai suformuotas. Patvirtinimo procesas užtikrina, kad net jei kompiliatorius sukurs klaidingą išvestį, ji bus aptikta prieš padarant žalą.
Patvirtinimo procesas turi du pagrindinius, tarpusavyje susijusius tikslus:
1. Saugumo užtikrinimas
Svarbiausia patvirtinimo proceso funkcija – užkirsti kelią kenkėjiškų ar netinkamai suformuotų Wasm modulių vykdymui, kurie galėtų pakenkti pagrindinei aplinkai. Tai apima patikrinimą dėl:
- Valdymo srauto vientisumo: Užtikrinama, kad modulio valdymo srauto grafas yra gerai suformuotas ir neturi nepasiekiamo kodo ar nelegalių šuolių, kurie galėtų būti išnaudoti.
- Atminties saugumo: Patikrinama, ar visi atminties prieigos veiksmai neviršija paskirtos atminties ribų ir nesukelia buferio perpildymo ar kitų atminties pažeidžiamumų.
- Tipų pagrįstumo: Patvirtinama, kad visos operacijos atliekamos su tinkamų tipų reikšmėmis, užkertant kelią tipų painiavos atakoms.
- Išteklių valdymo: Užtikrinama, kad modulis nebando atlikti operacijų, kurių jam neleidžiama, pavyzdžiui, savavališkų sistemos iškvietimų.
2. Tipų tikrinimas ir semantinis teisingumas
Be gryno saugumo, patvirtinimo procesas taip pat griežtai tikrina Wasm modulio semantinį teisingumą. Tai užtikrina, kad modulis atitinka WebAssembly specifikaciją ir kad visos jo operacijos yra saugios tipų atžvilgiu. Tai apima:
- Operandų dėklo vientisumo: Patikrinama, ar kiekviena instrukcija operuoja su teisingu operandų skaičiumi ir tipais vykdymo dėkle.
- Funkcijų signatūrų atitikimo: Užtikrinama, kad funkcijų iškvietimai atitinka iškviečiamų funkcijų deklaruotas signatūras.
- Globalių kintamųjų ir lentelių prieigos: Patikrinama, ar prieiga prie globalių kintamųjų ir funkcijų lentelių yra atliekama teisingai.
Šis griežtas tipų tikrinimas yra esminis Wasm gebėjimui užtikrinti nuspėjamą ir patikimą vykdymą skirtingose platformose ir vykdymo aplinkose. Jis pašalina didelę programavimo klaidų ir saugumo pažeidžiamumų klasę pačioje ankstyviausioje stadijoje.
WebAssembly patvirtinimo proceso etapai
WebAssembly modulio patvirtinimo procesas nėra vienas monolitinis patikrinimas, o greičiau nuoseklių žingsnių serija, kurių kiekvienas tiria skirtingus modulio struktūros ir semantikos aspektus. Nors tiksli implementacija gali šiek tiek skirtis tarp skirtingų Wasm vykdymo aplinkų (pvz., Wasmtime, Wasmer ar naršyklės integruoto variklio), pagrindiniai principai išlieka tie patys. Įprastas patvirtinimo procesas apima šiuos etapus:
1 etapas: Dekodavimas ir pagrindinės struktūros patikrinimas
Pirmasis žingsnis yra išanalizuoti dvejetainį Wasm failą. Tai apima:
- Leksinė analizė: Baitų srauto suskaidymas į prasmingus ženklus (tokenus).
- Sintaksinė analizė: Patikrinama, ar ženklų seka atitinka Wasm dvejetainio formato gramatiką. Tai patikrina struktūrinį teisingumą, pvz., tinkamą sekcijų tvarką ir galiojančius „magiškus skaičius“.
- Dekodavimas į abstraktų sintaksės medį (AST): Modulio atvaizdavimas vidiniu, struktūrizuotu formatu (dažnai AST), kurį vėlesniems etapams lengviau analizuoti.
Globali reikšmė: Šis etapas užtikrina, kad Wasm failas yra gerai suformuotas Wasm dvejetainis failas, nepriklausomai nuo jo kilmės. Sugadintas ar tyčia netinkamai suformuotas dvejetainis failas čia patirs nesėkmę.
2 etapas: Sekcijų patvirtinimas
Wasm moduliai yra suskirstyti į atskiras sekcijas, kurių kiekviena turi konkretų tikslą (pvz., tipų apibrėžimai, importo/eksporto funkcijos, funkcijų kūnai, atminties deklaracijos). Šiame etape tikrinama:
- Sekcijų buvimas ir tvarka: Patikrinama, ar yra visos reikiamos sekcijos ir ar jos išdėstytos teisinga tvarka.
- Kiekvienos sekcijos turinys: Kiekvienos sekcijos turinys patvirtinamas pagal jos specifines taisykles. Pavyzdžiui, tipų sekcijoje turi būti apibrėžti galiojantys funkcijų tipai, o funkcijų sekcija turi atitikti galiojančius tipus.
Pavyzdys: Jei modulis bando importuoti funkciją su konkrečia signatūra, bet pagrindinė aplinka teikia funkciją su kitokia signatūra, šis neatitikimas bus aptiktas importo sekcijos patvirtinimo metu.
3 etapas: Valdymo srauto grafo (CFG) analizė
Tai yra lemiamas etapas saugumui ir teisingumui. Patvirtintojas sukuria valdymo srauto grafą kiekvienai modulio funkcijai. Šis grafas vaizduoja galimus vykdymo kelius per funkciją.
- Blokų struktūra: Patikrinama, ar blokai, ciklai ir „if“ sąlygos yra tinkamai įdėti ir užbaigti.
- Nepasiekiamo kodo aptikimas: Nustatomas kodas, kuris niekada negali būti pasiektas, o tai kartais gali būti programavimo klaidos arba bandymo paslėpti kenkėjišką logiką ženklas.
- Šakojimosi patvirtinimas: Užtikrinama, kad visi šakojimosi veiksmai (pvz., `br`, `br_if`, `br_table`) nukreipti į galiojančias žymes CFG viduje.
Globali reikšmė: Gerai suformuotas CFG yra būtinas norint išvengti išnaudojimo, kuris remiasi programos vykdymo nukreipimu į netikėtas vietas. Tai yra atminties saugumo pagrindas.
4 etapas: Dėklu pagrįstas tipų tikrinimas
WebAssembly naudoja dėklu pagrįstą vykdymo modelį. Kiekviena instrukcija naudoja operandus iš dėklo ir grąžina rezultatus atgal į jį. Šiame etape atliekamas kruopštus operandų dėklo patikrinimas kiekvienai instrukcijai.
- Operandų atitikimas: Kiekvienai instrukcijai patvirtintojas patikrina, ar šiuo metu dėkle esančių operandų tipai atitinka tos instrukcijos laukiamus tipus.
- Tipų sklaida: Stebima, kaip tipai keičiasi per visą bloko vykdymą, užtikrinant nuoseklumą.
- Blokų išėjimai: Patikrinama, ar visi keliai, išeinantys iš bloko, į dėklą įdeda tą patį tipų rinkinį.
Pavyzdys: Jei instrukcija tikisi sveikojo skaičiaus dėklo viršuje, bet randa slankiojo kablelio skaičių, arba jei funkcijos iškvietimas nesitiki grąžinamos reikšmės, bet dėkle ji yra, patvirtinimas nepavyks.
Globali reikšmė: Šis etapas yra svarbiausias siekiant išvengti tipų painiavos pažeidžiamumų, kurie yra dažni žemesnio lygio kalbose ir gali būti išnaudojimo vektorius. Įgyvendindamas griežtas tipų taisykles, Wasm garantuoja, kad operacijos visada atliekamos su tinkamo tipo duomenimis.
5 etapas: Reikšmių diapazono ir funkcijų patikrinimai
Šis etapas užtikrina Wasm specifikacijoje ir pagrindinėje aplinkoje apibrėžtų apribojimų ir suvaržymų laikymąsi.
- Atminties ir lentelių dydžių apribojimai: Patikrinama, ar deklaruoti atminties ir lentelių dydžiai neviršija nustatytų apribojimų, užkertant kelią išteklių išeikvojimo atakoms.
- Funkcijų vėliavėlės: Jei Wasm modulis naudoja eksperimentines ar specifines funkcijas (pvz., SIMD, gijas), šiame etape patikrinama, ar vykdymo aplinka palaiko šias funkcijas.
- Konstantų išraiškų patvirtinimas: Užtikrinama, kad konstantų išraiškos, naudojamos inicializatoriams, yra iš tikrųjų konstantos ir gali būti įvertintos patvirtinimo metu.
Globali reikšmė: Tai užtikrina, kad Wasm moduliai veiktų nuspėjamai ir nebandytų sunaudoti pernelyg daug išteklių, o tai yra kritiškai svarbu bendroms aplinkoms ir debesijos diegimams, kur išteklių valdymas yra esminis. Pavyzdžiui, modulis, sukurtas didelio našumo serveriui duomenų centre, gali turėti kitokius išteklių lūkesčius nei tas, kuris veikia ribotų išteklių IoT įrenginyje kraštinėje kompiuterijoje.
6 etapas: Iškvietimų grafo ir funkcijų signatūrų patikrinimas
Šiame galutiniame patvirtinimo etape nagrinėjami ryšiai tarp funkcijų modulyje ir jo importo/eksporto elementų.
- Importo/eksporto atitikimas: Patikrinama, ar visos importuotos funkcijos ir globalūs kintamieji yra teisingai nurodyti ir ar eksportuoti elementai yra galiojantys.
- Funkcijų iškvietimų nuoseklumas: Užtikrinama, kad visi iškvietimai į kitas funkcijas (įskaitant importuotas) naudoja teisingus argumentų tipus ir skaičių, ir kad grąžinamos reikšmės yra tvarkomos tinkamai.
Pavyzdys: Modulis gali importuoti funkciją `console.log`. Šiame etape būtų patikrinta, ar `console.log` tikrai yra importuota ir ar ji iškviečiama su laukiamais argumentų tipais (pvz., eilute ar skaičiumi).
Globali reikšmė: Tai užtikrina, kad modulis gali sėkmingai sąveikauti su savo aplinka, nesvarbu, ar tai būtų JavaScript pagrindinė aplinka naršyklėje, Go programa ar Rust paslauga. Nuoseklios sąsajos yra gyvybiškai svarbios sąveikai globalizuotoje programinės įrangos ekosistemoje.
Saugumo pasekmės tvirtam patvirtinimo procesui
Patvirtinimo procesas yra pirmoji gynybos linija nuo kenkėjiško Wasm kodo. Jo kruopštumas tiesiogiai veikia bet kurios sistemos, vykdančios Wasm modulius, saugumo būklę.
Atminties pažeidimų ir išnaudojimo prevencija
Griežtai taikydamas tipų taisykles ir valdymo srauto vientisumą, Wasm patvirtintojas pašalina daugelį įprastų atminties saugumo pažeidžiamumų, kurie kamuoja tradicines kalbas, tokias kaip C ir C++. Problemos, tokios kaip buferio perpildymas, naudojimas po atlaisvinimo ir „kabančios“ rodyklės, iš esmės yra išvengiamos dėl dizaino, nes patvirtintojas atmestų bet kokį modulį, bandantį atlikti tokias operacijas.
Globalus pavyzdys: Įsivaizduokite finansinių paslaugų įmonę, naudojančią Wasm aukšto dažnio prekybos algoritmams. Atminties pažeidimo klaida galėtų sukelti katastrofiškus finansinius nuostolius ar sistemos prastovas. Wasm patvirtinimo procesas veikia kaip saugumo tinklas, užtikrinantis, kad tokios klaidos pačiame Wasm kode būtų aptiktos prieš jas išnaudojant.
Paslaugos trikdymo (DoS) atakų sušvelninimas
Patvirtinimo procesas taip pat apsaugo nuo DoS atakų:
- Išteklių apribojimai: Įgyvendinant atminties ir lentelių dydžių apribojimus, neleidžiama moduliams sunaudoti visų prieinamų išteklių.
- Begalinių ciklų aptikimas (netiesiogiai): Nors aiškiai neaptinkami visi begaliniai ciklai (kas bendruoju atveju yra nenusprendžiama problema), CFG analizė gali nustatyti struktūrines anomalijas, kurios gali rodyti tyčinį begalinį ciklą ar kelią, vedantį į pernelyg didelį skaičiavimą.
- Netinkamai suformuoto dvejetainio failo prevencija: Atmetus struktūriškai netinkamus modulius, išvengiama vykdymo aplinkos gedimų, kuriuos sukelia analizatoriaus klaidos.
Nuspėjamo elgesio užtikrinimas
Griežtas tipų tikrinimas ir semantinė analizė užtikrina, kad Wasm moduliai veiktų nuspėjamai. Šis nuspėjamumas yra labai svarbus kuriant patikimas sistemas, ypač paskirstytose aplinkose, kur skirtingi komponentai turi sąveikauti sklandžiai. Kūrėjai gali pasitikėti, kad patvirtintas Wasm modulis vykdys numatytą logiką be netikėtų šalutinių poveikių.
Pasitikėjimas trečiųjų šalių kodu
Daugelyje pasaulinių programinės įrangos tiekimo grandinių organizacijos integruoja kodą iš įvairių trečiųjų šalių tiekėjų. WebAssembly patvirtinimo procesas suteikia standartizuotą būdą įvertinti šių išorinių modulių saugumą. Net jei tiekėjo vidinės kūrimo praktikos yra netobulos, gerai įgyvendintas Wasm patvirtintojas gali aptikti daug potencialių saugumo trūkumų prieš diegiant kodą, taip skatinant didesnį pasitikėjimą ekosistema.
Tipų tikrinimo vaidmuo WebAssembly
Tipų tikrinimas WebAssembly nėra tik statinės analizės etapas; tai yra pagrindinė jo vykdymo modelio dalis. Patvirtinimo proceso tipų tikrinimas užtikrina, kad Wasm kodo semantinė prasmė yra išsaugota ir kad operacijos visada yra tipų atžvilgiu teisingos.
Ką aptinka tipų tikrinimas?
Dėklu pagrįstas tipų tikrinimo mechanizmas patvirtintojo viduje kruopščiai tikrina kiekvieną instrukciją:
- Instrukcijų operandai: Instrukcijai, tokiai kaip `i32.add`, patvirtintojas užtikrina, kad dvi viršutinės reikšmės operandų dėkle yra `i32` (32 bitų sveikieji skaičiai). Jei viena iš jų yra `f32` (32 bitų slankiojo kablelio skaičius), patvirtinimas nepavyksta.
- Funkcijų iškvietimai: Iškviečiant funkciją, patvirtintojas patikrina, ar pateiktų argumentų skaičius ir tipai atitinka funkcijos deklaruotus parametrų tipus. Taip pat užtikrinama, kad grąžinamos reikšmės (jei tokių yra) atitinka funkcijos deklaruotus grąžinimo tipus.
- Valdymo srauto konstrukcijos: Konstrukcijos, tokios kaip `if` ir `loop`, turi specifinius tipų reikalavimus savo šakoms. Patvirtintojas užtikrina, kad jie yra įvykdyti. Pavyzdžiui, `if` instrukcija, turinti netuščią dėklą, gali reikalauti, kad visos šakos sukurtų tuos pačius rezultuojančius dėklo tipus.
- Prieiga prie globalių kintamųjų ir atminties: Prieiga prie globalaus kintamojo ar atminties vietos reikalauja, kad prieigai naudojami operandai būtų tinkamo tipo (pvz., `i32` poslinkiui atminties prieigoje).
Griežto tipų tikrinimo privalumai
- Mažiau klaidų: Daugelis įprastų programavimo klaidų yra tiesiog tipų neatitikimai. Wasm patvirtinimas jas aptinka anksti, prieš vykdymą.
- Pagerintas našumas: Kadangi tipai yra žinomi ir patikrinti patvirtinimo metu, Wasm vykdymo aplinka dažnai gali generuoti labai optimizuotą mašininį kodą, nereikalaujant atlikti tipų patikrinimų vykdymo metu.
- Padidintas saugumas: Tipų painiavos pažeidžiamumai, kai programa neteisingai interpretuoja duomenų, prie kurių prieina, tipą, yra reikšmingas saugumo išnaudojimo šaltinis. Wasm stipri tipų sistema juos pašalina.
- Nešiojamumas: Tipų atžvilgiu saugus Wasm modulis veiks nuosekliai skirtingose architektūrose ir operacinėse sistemose, nes tipų semantika yra apibrėžta Wasm specifikacijoje, o ne pagrindinėje aparatinėje įrangoje.
Praktiniai aspektai diegiant Wasm globaliai
Kadangi organizacijos vis dažniau naudoja WebAssembly globalioms programoms, svarbu suprasti patvirtinimo proceso pasekmes.
Vykdymo aplinkų implementacijos ir patvirtinimas
Skirtingos Wasm vykdymo aplinkos (pvz., Wasmtime, Wasmer, lucet, naršyklės integruotas variklis) įgyvendina patvirtinimo procesą. Nors visos jos laikosi Wasm specifikacijos, gali būti subtilių skirtumų našumo ar specifinių patikrinimų srityje.
- Wasmtime: Žinomas dėl savo našumo ir integracijos su Rust ekosistema, Wasmtime atlieka griežtą patvirtinimą.
- Wasmer: Universali Wasm vykdymo aplinka, kuri taip pat pabrėžia saugumą ir našumą, su išsamiu patvirtinimo procesu.
- Naršyklių varikliai: Chrome, Firefox, Safari ir Edge visos turi labai optimizuotą ir saugią Wasm patvirtinimo logiką, integruotą į jų JavaScript variklius.
Globali perspektyva: Diegiant Wasm įvairiose aplinkose, svarbu užtikrinti, kad pasirinktos vykdymo aplinkos patvirtinimo implementacija būtų atnaujinta pagal naujausias Wasm specifikacijas ir saugumo geriausias praktikas.
Įrankiai ir kūrimo eiga
Kūrėjai, kompiliuojantys kodą į Wasm, turėtų žinoti apie patvirtinimo procesą. Nors dauguma kompiliatorių tai atlieka teisingai, galimų patvirtinimo klaidų supratimas gali padėti derinti kodą.
- Kompiliatoriaus išvestis: Jei kompiliatorius sukuria netinkamą Wasm, patvirtinimo etapas jį aptiks. Kūrėjams gali tekti koreguoti kompiliatoriaus vėliavėles arba spręsti išeities kodo problemas.
- Wasm-Pack ir kiti kūrimo įrankiai: Įrankiai, kurie automatizuoja Wasm modulių kompiliavimą ir pakavimą įvairioms platformoms, dažnai netiesiogiai arba aiškiai įtraukia patvirtinimo patikrinimus.
Saugumo auditas ir atitiktis
Organizacijoms, veikiančioms reguliuojamose pramonės šakose (pvz., finansų, sveikatos apsaugos), Wasm patvirtinimo procesas prisideda prie jų saugumo atitikties pastangų. Galimybė pademonstruoti, kad visas nepatikimas kodas praėjo griežtą patvirtinimo procesą, kuris tikrina saugumo pažeidžiamumus ir tipų vientisumą, gali būti didelis privalumas.
Praktinė įžvalga: Apsvarstykite galimybę integruoti Wasm patvirtinimo patikrinimus į savo CI/CD procesus. Tai automatizuoja procesą, užtikrinantį, kad būtų diegiami tik patvirtinti Wasm moduliai, pridedant papildomą saugumo ir kokybės kontrolės lygį.
Wasm patvirtinimo ateitis
WebAssembly ekosistema nuolat vystosi. Ateities pokyčiai gali apimti:
- Sudėtingesnė statinė analizė: Gylesnė analizė dėl galimų pažeidžiamumų, kurie peržengia pagrindinių tipų ir valdymo srauto patikrinimų ribas.
- Integracija su formalios verifikacijos įrankiais: Leidimas matematiškai įrodyti kritiškai svarbių Wasm modulių teisingumą.
- Profiliu pagrįstas patvirtinimas: Patvirtinimo pritaikymas pagal laukiamus naudojimo modelius, siekiant optimizuoti tiek saugumą, tiek našumą.
Išvada
WebAssembly modulio patvirtinimo procesas yra jo saugaus ir patikimo vykdymo modelio pagrindas. Kruopščiai tikrindamas kiekvieną gaunamą modulį dėl struktūrinio teisingumo, valdymo srauto vientisumo, atminties saugumo ir tipų pagrįstumo, jis veikia kaip nepakeičiamas sargas nuo kenkėjiško kodo ir programavimo klaidų.
Mūsų tarpusavyje susijusiame pasauliniame skaitmeniniame kraštovaizdyje, kur kodas laisvai keliauja tinklais ir veikia daugybėje įrenginių, šio patvirtinimo proceso svarbos negalima pervertinti. Jis užtikrina, kad WebAssembly pažadas – didelis našumas, nešiojamumas ir saugumas – gali būti realizuotas nuosekliai ir saugiai, nepriklausomai nuo geografinės kilmės ar programos sudėtingumo. Kūrėjams, įmonėms ir galutiniams vartotojams visame pasaulyje tvirtas patvirtinimo procesas yra tylus gynėjas, kuris daro WebAssembly revoliuciją įmanomą.
Kadangi WebAssembly toliau plečia savo įtaką už naršyklės ribų, gilus jo patvirtinimo mechanizmų supratimas yra būtinas visiems, kurie kuria ar integruoja sistemas su Wasm palaikymu. Tai yra reikšmingas žingsnis į priekį saugaus kodo vykdymo srityje ir gyvybiškai svarbus šiuolaikinės, globalios programinės įrangos infrastruktūros komponentas.