Planuoja sustiprinti OpenBSD W^X saugos mechanizmą

Theo De Raadt pasidalino planuoja sustiprinti W^X (Write XOR Execute) atminties apsaugos mechanizmą. Mechanizmo esmė yra ta, kad proceso atminties puslapiai negali būti vienu metu pasiekiami rašymui ir vykdymui. Taigi, kodą galima vykdyti tik išjungus rašymą, o įrašyti į atminties puslapį galima tik išjungus vykdymą. W^X mechanizmas padeda apsaugoti vartotojo erdvės programas nuo įprastų buferio perpildymo atakų, įskaitant dėklo perpildymą, ir yra aktyvus OpenBSD pagal nutylėjimą.

Nuo pat darbo su W^X pradžios buvo aišku, kad tai buvo ilgas kelias, nes buvo daug JIT naudojančių programų. JIT diegimus galima suskirstyti į tris kategorijas:

  • Atminties perjungimas tarp W ir X būsenų, priimant sistemos skambučio „kainą“. mprotect.
  • Pseudonimų kūrimas tarp tos pačios atminties W ir X atvaizdų poros.
  • „Nešvariausia“ parinktis reikalauja W|X atminties modelio, leidžiančio vienu metu įrašyti ir vykdyti.

Šiuo metu trečią parinktį naudojančių programų yra žymiai mažiau, o pirmą ir antrąją – daugiau. Tačiau kadangi reikėjo paleisti programas su W|X JIT (daugiausia Chromium ir Iridum), buvo pridėta „wxallowed“ failų sistemos prijungimo parinktis, leidžianti vienu metu naudoti atmintį ir rašymui, ir vykdymui, tuo atveju, jei vykdomasis ELF failas pažymėtas „wxneeded“ žymekliu, o pačios programos buvo papildomai apsaugotos naudojant mechanizmus įkeisti и atskleisti apriboti naudojamų sistemos iškvietimų sąrašą ir atitinkamai programai prieinamas failų sistemos dalis.

Siekiant dar labiau apsunkinti tokių programų pažeidžiamumų išnaudojimą, siūlomas mechanizmo papildymas. MAP_STACK, kuri patikrina, ar sistemos iškvietimas vykdomas iš įrašomosios atminties puslapio. Jei puslapį galima rašyti, procesas priverstas nutraukti. Tokiu būdu užpuolikas negalės išnaudoti sistemos iškvietimų ir bus priverstas bandyti surasti reikiamas programėles JIT diegime arba net atlikti sunkesnį darbą aptikdamas sistemos iškvietimus tiesiai viduje. netyčia susieta libc.

„Chrome“ / „Iridium“ procesai jau yra gana patikimai apsaugoti naudojant „pledge and unveil“, tačiau panaikinus galimybę naudoti, pavyzdžiui, „write(2)“ sistemos iškvietimą, akivaizdu, kad yra tam tikrų pranašumų, nes tai sukuria papildomų sunkumų užpuolikui. Tačiau sunkumų taip pat gali kilti, jei JIT įgyvendinimas naudoja vietinius sistemos iškvietimus iš W|X atminties. Tačiau yra pagrindo tikėtis, kad taip nebus, nes ABI buvo keletą kartų keičiamas, tačiau apie problemas niekas nepranešė.

Pakeitimai jau matomi įprastose OpenBSD-Current šakos momentinėse nuotraukose, visi norintys kviečiami išbandyti.

Susijusios naujienos apie režimo atsiradimą naršyklėje Chrome/Iridium nusipelno atskiro Theo komentaro JITless. Jo požiūriu, tai priimtina kai kuriems naudojimo modeliams, bet tikriausiai ne visiems, nes šis režimas akivaizdžiai padidins procesoriaus apkrovą. Šiuo metu „Chrome“ dažniausiai veiks, jei išjungsite „wxallowed“ /usr/local, nors gali kilti problemų dėl kai kurių plėtinių (pavyzdys yra „ghostery“). Vienaip ar kitaip, Theo tikisi, kad visavertis darbas JITless režimu artimiausiu metu bus visiškai veikiantis.

Šaltinis: opennet.ru

Добавить комментарий