Theo de Raadt föreslog att inkludera en ny mekanism i OpenBSD för att minska ytan för attacker, som implementerades genom att utöka systemanropet openat. Patchar som implementerar ytterligare flaggor för openat och open, som begrĂ€nsar möjligheten att navigera till överordnade kataloger genom "../" och referera med absoluta sökvĂ€gar, har förberetts för kĂ€rnan, libc samt vissa applikationer i det grundlĂ€ggande systemet. Ăndringarna har Ă€nnu inte inkluderats i OpenBSD-current och befinner sig under diskussion bland utvecklarna.
Familjen av systemanrop openat(2) fungerar som en motsvarighet till open(2), med undantag för att om den relativa sökvÀgen anges i parametern "path", sÄ bestÀms den öppnade filen i förhÄllande till katalogen kopplad till filbeskrivaren "fd", snarare Àn den aktuella arbetskatalogen. Om du skickar en absolut sökvÀg i openat, till exempel: int dirfd = open("/tmp", O_RDONLY | O_DIRECTORY); int hfd = openat(dirfd, "/etc/hosts", O_RDONLY);
funktionen openat() kommer att ignorera "dirfd" och följaktligen kommer den absoluta sökvÀgen att behandlas pÄ vanligt sÀtt.
DÀrför förbÀttrar en ersÀttning av open() med openat() sÀkerheten i programmet i sig inte. En sÄdan anrop kan snabba upp tolkningen av sökvÀgen, men det begrÀnsar inte Ätkomsten till filsystemet. Flagtor som förbjuder absoluta sökvÀgar (till exempel RESOLVE_BENEATH och/eller RESOLVE_IN_ROOT för openat2 i Linux) garanterar inget skydd: programmeraren mÄste lÀgga till dem till alla lÀmpliga anrop, och vid en processövertagning kan angriparen utnyttja alternativa sÀtt att öppna filer.
I arbetet med verktyget openrsync uppstod behovet av att begrÀnsa dess förmÄga att navigera i filsystemet, men det visade sig vara omöjligt att göra detta med hjÀlp av funktionerna unveil() och pledge(). Idén uppkom dÄ om en mekanism liknande openat(), men med sÀkerhetsegenskaper som kompletterar pledge/unveil eller till och med fungerar i deras frÄnvaro.
Huvudidén Àr att göra begrÀnsningar till en del av sjÀlva katalogbeskrivaren. För detta föreslÄs flaggan F_BELOW, som kan stÀllas in via fcntl() eller flaggan O_BELOW för open(). En sÄlunda begrÀnsad beskrivare "dirfd" kommer endast att tillÄta nedÄtgÄende navigering i katalogtrÀdet: anrop av openat() med absolut sökvÀg eller med en uppÄtgÄende navigering genom ".." kommer att avslutas med felet ENOENT. Vid en attack som leder till kodexekvering kommer processens filbeskrivartabell att innehÄlla mindre funktionella "dirfd", vilket kommer att begrÀnsa attackytan.
KĂ€lla: opennet.ru
