Planovi za jačanje W^X sigurnosnog mehanizma u OpenBSD-u

Theo De Raadt podijeljeno planira ojačati mehanizam zaštite memorije W^X (Write XOR Execute). Suština mehanizma je da se stranicama procesne memorije ne može istovremeno pristupiti za pisanje i izvršenje. Dakle, kod se može izvršiti tek nakon što je upisivanje onemogućeno, a pisanje na memorijsku stranicu moguće je tek nakon što je izvršenje onemogućeno. Mehanizam W^X pomaže u zaštiti aplikacija korisničkog prostora od uobičajenih napada prekoračenja bafera, uključujući prekoračenje steka, i aktivan je u OpenBSD-u po defaultu.

Od početka rada na W^X-u, bilo je jasno da je ovo dug put, jer je postojao značajan broj aplikacija koje koriste JIT. JIT implementacije se mogu podijeliti u tri kategorije:

  • Prebacivanje memorije između W i X stanja, prihvatanje “troška” sistemskog poziva mprotect.
  • Kreiranje alijasa između para W i X mapiranja iste memorije.
  • Najprljavija opcija zahtijeva W|X memorijski model koji omogućava istovremeno snimanje i izvršavanje.

Trenutno postoji znatno manje programa koji koriste treću opciju, a više onih koji koriste prvu i drugu. Međutim, pošto je bilo potrebno pokretati programe sa W|X JIT-om (uglavnom Chromium i Iridum), dodata je opcija montiranja sistema datoteka "wxallowed", što je omogućilo da se memorija koristi istovremeno i za pisanje i za izvršavanje, u slučaju da izvršni ELF datoteka je označena markerom “wxneeded”, a same aplikacije su dodatno zaštićene mehanizmom zalog и skinuti veo da ograničite listu korišćenih sistemskih poziva i delova sistema datoteka dostupnih aplikaciji, respektivno.

Kako bi se dodatno zakomplikovalo iskorištavanje ranjivosti u takvim aplikacijama, predlaže se dodatak mehanizmu MAP_STACK, koji provjerava da li se sistemski poziv izvršava sa memorijske stranice na koju se može pisati. Ako se na stranicu može pisati, proces je prisiljen prekinuti. Na ovaj način, napadač neće moći da iskoristi sistemske pozive i biće primoran da pokuša da pronađe potrebne gadžete u JIT implementaciji ili čak obavi teži posao otkrivanja stubova sistemskog poziva direktno unutar slučajno povezan libc.

Chrome/Iridium procesi su već prilično pouzdano zaštićeni korišćenjem pledge and unveil-a, ali uklanjanje mogućnosti korištenja, na primjer, write(2) sistemskog poziva očigledno ima neku prednost, jer stvara dodatne poteškoće za napadača. Međutim, poteškoće također mogu nastati ako JIT implementacija koristi izvorne sistemske pozive iz W|X memorije. Međutim, postoji razlog za nadu da to neće biti slučaj, budući da je ABI nekoliko puta mijenjan, ali niko nikada nije prijavio probleme.

Promjene su već dostupne u redovnim snimcima OpenBSD-Current grane, svi zainteresovani su pozvani da testiraju.

Povezane vijesti o izgledu moda u Chrome/Iridiumu zaslužuju poseban komentar od Thea JITless. Sa njegove tačke gledišta, to je prihvatljivo za neke modele upotrebe, ali verovatno ne za sve, jer će se u ovom režimu opterećenje procesora očigledno povećati. Trenutno će Chrome uglavnom raditi ako onemogućite "wxallowed" za /usr/local, iako može biti problema s nekim ekstenzijama (primjer je ghostery). Na ovaj ili onaj način, Theo se nada da će punopravni rad u JITless modu biti doveden u potpuno operativno stanje u bliskoj budućnosti.

izvor: opennet.ru

Dodajte komentar