Theo de Raadt het voorgestel om 'n nuwe meganisme in OpenBSD in te sluit om die aanvalsoppervlak te verminder, geïmplementeer deur die openat-stelseloproep uit te brei. Oplossings wat bykomende vlae vir openat en open implementeer, wat die vermoë beperk om na boonste gidse via "/." te navigeer en toegang tot absolute paaie te verkry, is voorberei vir die kern, libc en sommige toepassings in die basisstelsel. Die veranderinge is nog nie in OpenBSD-current opgeneem nie en word tans onder ontwikkelaars bespreek.
Die openat(2) familie van stelseloproepe tree op soos open(2), behalwe dat as die "pad" parameter relatief is, die lêer wat oopgemaak moet word relatief is tot die gids wat geassosieer word met die lêerbeskrywer "fd" eerder as die huidige werkgids. As jy 'n absolute pad aan openat deurgee, byvoorbeeld: int dirfd = open("/tmp", O_RDONLY | O_DIRECTORY); int hfd = openat(dirfd, "/etc/hosts", O_RDONLY);
Die openat() funksie sal "dirfd" ignoreer en gevolglik sal die absolute pad normaal verwerk word.
Daarom verbeter die vervanging van open() met openat() nie op sigself programsekuriteit nie. Hierdie oproep kan padontleding versnel, maar beperk nie toegang tot die lêerstelsel nie. Vlae wat absolute paaie verbied (byvoorbeeld, RESOLVE_BENEATH en/of RESOLVE_IN_ROOT vir openat2 in Linux): die programmeerder moet hulle by alle toepaslike oproepe voeg, en wanneer die aanvaller beheer oor die proses verkry, kan hy of sy ander maniere gebruik om lêers oop te maak.
Terwyl hy aan die openrsync-hulpprogram gewerk het, moes Theo die lêerstelsel se deurkruisingsvermoëns beperk, maar dit was nie moontlik met die unveil()- en pledge()-funksies nie. Hy het toe 'n meganisme soortgelyk aan openat() bedink, maar met sekuriteitskenmerke wat pledge/unveil sou aanvul of selfs in hul afwesigheid sou werk.
Die basiese idee is om die beperkings deel van die gidsbeskrywer self te maak. Om dit te bereik, stel ons die F_BELOW-vlag voor, wat via fcntl() gestel kan word, of die O_BELOW-vlag vir open(). 'n "dirfd"-beskrywer wat op hierdie manier beperk word, sal slegs afwaartse deurgange in die gidsboom toelaat: openat()-oproepe met 'n absolute pad of opwaartse deurgange via ".." sal misluk met die ENOENT-fout. In die geval van 'n kode-uitvoeringsaanval, sal die proses se lêerbeskrywertabel minder funksionele "dirfd"'s bevat, wat die aanvaloppervlak beperk.
Bron: opennet.ru
