Theo de Raad stelde wijzigingen voor om de toegang tot het bestandssysteem te beperken via de functie openat.

Theo de Raadt heeft voorgesteld een nieuwe mechanisme toe te voegen aan OpenBSD om het aanvalsoppervlak te verminderen, geïmplementeerd via een uitbreiding van de system call openat. Patches met de implementatie van extra flags voor openat en open, die de mogelijkheid om naar bovenliggende mappen te navigeren via "../" en toegang via absolute paden te beperken, zijn voorbereid voor de kernel, libc en enkele applicaties uit het basis systeem. Deze wijzigingen zijn nog niet opgenomen in OpenBSD-current en bevinden zich in de discussie fase onder ontwikkelaars.

De familie van system calls openat(2) werkt als een alternatief voor open(2), behalve dat als in de parameter 'path' een relatief pad is opgegeven, het te openen bestand wordt bepaald ten opzichte van de map die is gekoppeld aan het file descriptor 'fd', en niet ten opzichte van de huidige werkmap. Als een absoluut pad wordt doorgegeven aan openat, bijvoorbeeld: int dirfd = open("/tmp", O_RDONLY | O_DIRECTORY); int hfd = openat(dirfd, "/etc/hosts", O_RDONLY);

De functie openat() negeert 'dirfd' en daardoor wordt het absolute pad op de gebruikelijke manier verwerkt.

Daarom versterkt het vervangen van open() door openat() op zichzelf de veiligheid van het programma niet. Een dergelijke aanroep kan de padontleding versnellen, maar beperkt de toegang tot het bestandssysteem niet. De flags die absolute paden verbieden (zoals RESOLVE_BENEATH en/of RESOLVE_IN_ROOT voor openat2 in Linux) garanderen ook geen bescherming: de programmeur moet deze toevoegen aan alle relevante aanroepen, en wanneer de controle over het proces wordt overgenomen, kan een aanvaller andere paden voor het openen van bestanden benutten.

Tijdens het werken aan de utility openrsync, had Theo de behoefte om de mogelijkheden ervan voor het navigeren door het bestandssysteem te beperken, maar het was niet mogelijk om dit te doen met behulp van de functies unveil() en pledge(). Toen ontstond het idee voor een mechanisme dat vergelijkbaar is met openat(), maar met beveiligingskenmerken die pledge/unveil aanvullen of zelfs kunnen functioneren zonder deze.

Het hoofdidee is om beperkingen deel uit te laten maken van de descriptor van de catalogus zelf. Daartoe wordt de vlag F_BELOW voorgesteld, die kan worden ingesteld via fcntl(), of de vlag O_BELOW voor open(). Een op deze manier beperkte descriptor "dirfd" zal alleen afdaling in de directorystructuur toestaan: aanroepen van openat() met een absoluut pad of met omhoog gaan via ".." zullen eindigen met de fout ENOENT. In het geval van een aanval die leidt tot code-uitvoering, zal de bestanddescriptorenlijst van het proces minder functionele "dirfd" bevatten, wat de aanvalsvloer zal beperken.

Bron: opennet.ru

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster