Theo de Raadt navrhl změny pro omezení přístupu k FS pomocí funkce openat

Theo de Raadt navrhl zavést v OpenBSD nový mechanismus pro snížení útočné plochy, realizovaný prostřednictvím rozšíření možností systémového volání openat. Patche s implementací dalších příznaků pro openat a open, které omezují možnost přechodu do nadřazených adresářů pomocí „/..“ a přístupu podle absolutních cest, byly připraveny pro jádro, libc a některé aplikace z základního systému. Změny zatím nebyly zahrnuty do OpenBSD-current a jsou stále v diskusi mezi vývojáři.

Rodina systémových volání openat(2) funguje jako analog open(2) s tím rozdílem, že pokud je veparametru „path“ uvedena relativní cesta, pak se otevíraný soubor určuje vzhledem k adresáři spojenému s deskriptorem souboru „fd“, a nikoli vzhledem k aktuálnímu pracovnímu adresáři. Pokud je předána absolutní cesta do openat, například: int dirfd = open(„/tmp“, O_RDONLY | O_DIRECTORY); int hfd = openat(dirfd, „/etc/hosts“, O_RDONLY);

funkce openat() ignoruje „dirfd“ a v důsledku toho se absolutní cesta zpracovává obvyklým způsobem.

Proto samotná výměna open() za openat() nezvyšuje bezpečnost programu. Takové volání může urychlit analýzu cesty, ale neomezuje přístup k souborovému systému. Zajištění ochrany nezaručují ani příznaky, které zakazují absolutní cesty (například RESOLVE_BENEATH a/nebo RESOLVE_IN_ROOT pro openat2 v Linuxu): programátor je musí přidávat ke všem vhodným voláním, a při převzetí kontroly nad procesem může útočník využít jiných cest pro otevírání souborů.

Při práci na utilitě openrsync se Theo dostal do situace, kdy potřeboval omezit její možnosti obejít souborový systém, ale nebylo možné to provést pomocí funkcí unveil() a pledge(). Pak vznikla myšlenka na mechanismus podobný openat(), ale se zabezpečovacími vlastnostmi doplňujícími pledge/unveil nebo dokonce fungujícími i v jejich nepřítomnosti.

Hlavní myšlenkou je učinit omezení součástí samotného deskriptoru adresáře. K tomu je navržen příznak F_BELOW, který lze nastavit přes fcntl(), nebo příznak O_BELOW pro open(). Takto omezený deskriptor „dirfd“ bude povolovat pouze přechody dolů po stromu adresářů: volání openat() s absolutní cestou nebo s přechodem nahoru přes „..“ budou končit chybou ENOENT. V případě útoku vedoucího k vykonání kódu bude tabulka sdílených deskriptorů souborů procesu obsahovat méně funkční „dirfd“, což omezí útočnou plochu.

Zdroj: opennet.ru

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster