Suunnittelee OpenBSD:n W^X-suojausmekanismin vahvistamista

Theo De Raadt jaettu aikoo vahvistaa W^X (Write XOR Execute) -muistin suojausmekanismia. Mekanismin ydin on, että prosessimuistisivuja ei voida käyttää samanaikaisesti kirjoittamista ja suorittamista varten. Siten koodi voidaan suorittaa vasta, kun kirjoitus on poistettu käytöstä, ja muistisivulle kirjoittaminen on mahdollista vasta sen jälkeen, kun suoritus on poistettu käytöstä. W^X-mekanismi auttaa suojaamaan käyttäjätilan sovelluksia tavallisilta puskurin ylivuotohyökkäyksiltä, ​​mukaan lukien pinon ylivuoto, ja se on aktiivinen OpenBSD:ssä oletuksena.

W^X-työn alusta lähtien oli selvää, että tämä oli pitkä tie, koska JIT:tä käyttäviä sovelluksia oli huomattava määrä. JIT-toteutukset voidaan jakaa kolmeen luokkaan:

  • Muistin vaihtaminen W- ja X-tilojen välillä, järjestelmäkutsun "kustannusten" hyväksyminen mprotect.
  • Luodaan aliaksia saman muistin W- ja X-kuvausten parin välille.
  • Likaisin vaihtoehto vaatii W|X-muistimallin, joka mahdollistaa samanaikaisen tallennuksen ja suorittamisen.

Tällä hetkellä kolmatta vaihtoehtoa käyttäviä ohjelmia on huomattavasti vähemmän ja ensimmäistä ja toista vaihtoehtoa enemmän. Koska ohjelmia piti kuitenkin ajaa W|X JIT:llä (pääasiassa Chromium ja Iridum), lisättiin "wxallowed" tiedostojärjestelmän liitosvaihtoehto, joka salli muistin käytön samanaikaisesti sekä kirjoittamiseen että suorittamiseen, mikäli suoritettava ELF tiedosto on merkitty "wxneeded"-merkillä, ja itse sovellukset suojattiin lisäksi mekanismeilla lupaus и paljastaa rajoittaaksesi luetteloa käytetyistä järjestelmäkutsuista ja sovelluksen käytettävissä olevista tiedostojärjestelmän osista.

Tällaisten sovellusten haavoittuvuuksien hyödyntämisen vaikeuttamiseksi entisestään mekanismiin ehdotetaan lisäystä. MAP_STACK, joka tarkistaa, suoritetaanko järjestelmäkutsu kirjoitettavalta muistisivulta. Jos sivu on kirjoitettava, prosessi pakotetaan lopettamaan. Tällä tavalla hyökkääjä ei pysty hyödyntämään järjestelmäkutsuja ja hänen on yritettävä löytää tarvittavat gadgetit JIT-toteutuksessa tai jopa tehdä vaikeampi työ järjestelmäkutsujen tunnistamisessa suoraan sisällä. vahingossa linkitetty libc.

Chrome/Iridium-prosessit ovat jo varsin luotettavasti suojattuja pledge and unveil -toiminnolla, mutta esimerkiksi write(2)-järjestelmäkutsun käytön poistamisella on ilmeisesti jotain etua, koska se aiheuttaa lisävaikeuksia hyökkääjälle. Ongelmia voi kuitenkin syntyä myös, jos JIT-toteutus käyttää alkuperäisiä järjestelmäkutsuja W|X-muistista. On kuitenkin syytä toivoa, että näin ei tapahdu, sillä ABI:ta on muutettu useita kertoja, mutta kukaan ei ole koskaan ilmoittanut ongelmista.

Muutokset ovat jo saatavilla tavallisina otoksina OpenBSD-Current haarasta, kaikki kiinnostuneet ovat tervetulleita testaamaan.

Aiheeseen liittyvät uutiset tilan ilmestymisestä Chrome/Iridiumissa ansaitsevat erillisen kommentin Theolta JITless. Hänen näkökulmastaan ​​tämä on hyväksyttävää joillekin käyttömalleille, mutta ei luultavasti kaikille, koska tämä tila luonnollisesti lisää prosessorin kuormitusta. Tällä hetkellä Chrome toimii enimmäkseen, jos poistat "wxallowed":n käytöstä /usr/localissa, vaikka joissakin laajennuksissa saattaa esiintyä ongelmia (esimerkki on haamukuva). Tavalla tai toisella Theo toivoo, että täysimittainen työ JITless-tilassa saadaan täysin toimintakuntoon lähitulevaisuudessa.

Lähde: opennet.ru

Lisää kommentti