Linux-ontwikkelaars zetten riskante geheugenfuncties definitief bij het grofvuil

In de Linux-kernel wordt gewerkt aan het definitief opruimen van twee stokoude functies: __get_user() en __put_user(). Deze functies regelen achter de schermen het dataverkeer tussen gewone programma’s en het streng beveiligde kernelgeheugen. Hoewel ze decennialang werden gebruikt om de prestaties te verbeteren, stonden ze onder ontwikkelaars ook bekend als een hardnekkige bron van programmeerfouten en beveiligingsrisico’s.

Wanneer een applicatie gegevens uitwisselt met de kernel, moet het besturingssysteem controleren of het opgegeven geheugenadres wel veilig gebruikt mag worden. De standaardfuncties doen die veiligheidscontrole automatisch bij elke stap. De varianten met twee liggende streepjes lieten die controle echter bewust achterwege. Het idee was dat programmeurs de controle zelf vooraf eenmalig konden doen om zo tijd te besparen bij grote hoeveelheden data. Dat klinkt efficiënt, maar in de praktijk bleek het een valkuil: ontwikkelaars vergaten die handmatige check regelmatig, met gevaarlijke geheugenlekken tot gevolg.

Op moderne processors levert deze oude programmeertruc nauwelijks nog snelheidswinst op, mede doordat hedendaagse chips al hardwarematige beveiligingen aan boord hebben tegen ongeoorloofde geheugentoegang. Voor gebruikers betekent de grote opruimbeurt vooral dat het besturingssysteem weer een stuk betrouwbaarder wordt. Een complete categorie van potentiële kwetsbaarheden en mysterieuze systeemcrashes verdwijnt geruisloos naar de achtergrond, zonder dat je computer daar merkbaar trager van wordt.

Het uitfaseren van dit soort diepgewortelde kernelcode is een flinke klus, omdat de functies verspreid over honderden stuurprogramma’s en subsystemen opdoken. De kernelontwikkelaars ruimen de laatste resten nu stapsgewijs op. Daarmee kiest het Linux-project definitief voor een veiliger fundament, waarbij robuuste code zwaarder weegt dan verouderde optimalisaties uit het verleden.

Bron: https://lwn.net/Articles/1102061/