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

Theo De Raadt podijeljeni planira ojačati mehanizam zaštite memorije W^X (Write XOR Execute). Bit mehanizma je da se stranicama memorije procesa ne može istovremeno pristupiti za pisanje i izvođenje. Dakle, kod se može izvršiti tek nakon što je pisanje 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 međuspremnika, uključujući preljeve stogova, i aktivan je u OpenBSD-u prema zadanom.

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

  • Prebacivanje memorije između W i X stanja, prihvaćanje "cijene" sistemskog poziva mprotect.
  • Stvaranje aliasa između para W i X preslikavanja iste memorije.
  • Najprljavija opcija je ona koja zahtijeva W|X memorijski model koji omogućuje istovremeno snimanje i izvođenje.

Trenutačno postoji znatno manje programa koji koriste treću opciju, a više onih koji koriste prvu i drugu. Međutim, budući da je bilo potrebno pokretati programe s W|X JIT (uglavnom Chromium i Iridum), dodana je opcija montiranja datotečnog sustava "wxallowed", koja je omogućila da se memorija koristi istovremeno i za pisanje i za izvođenje, u slučaju da je izvršni ELF datoteka je označena oznakom “wxneeded”, a same aplikacije su dodatno zaštićene mehanizmima zalog и skinuti veo za ograničavanje popisa korištenih sistemskih poziva i dijelova datotečnog sustava koji su dostupni aplikaciji.

Kako bi se dodatno zakompliciralo iskorištavanje ranjivosti u takvim aplikacijama, predlaže se dodatak mehanizmu MAP_STACK, koji provjerava da li se sistemski poziv izvršava sa stranice memorije za pisanje. Ako se stranica može pisati, proces se prisilno prekida. Na ovaj način napadač neće moći iskoristiti sistemske pozive i bit će prisiljen pokušati pronaći potrebne gadgete u implementaciji JIT-a ili čak obaviti teži posao otkrivanja dopuna sistemskih poziva izravno unutra slučajno povezan libc.

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

Promjene su već dostupne u redovnim snimkama ogranka OpenBSD-Current, svi zainteresirani pozvani su na testiranje.

Povezane vijesti o pojavljivanju moda u Chrome/Iridiumu zaslužuju poseban Theov komentar JITless. S njegove točke gledišta, to je prihvatljivo za neke modele korištenja, ali vjerojatno ne za sve, budući da će ovaj način rada očito povećati opterećenje procesora. Trenutno će Chrome uglavnom raditi ako onemogućite "wxallowed" za /usr/local, iako bi moglo biti problema s nekim ekstenzijama (ghostery je primjer). 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