Wat is ASLR?
Afkorting van Address Space Layout Randomization. Maatregel die de adressen van stack, heap, gedeelde bibliotheken en het uitvoerbare bestand bij elke uitvoering verandert, zodat aanvallers de adressen moeilijker kunnen voorspellen.
Japanse benaming: ASLR
“ASLR” komt voor in 3 oefenvragen uit 1 onderwerpen, bijv. Linker, loader en uitvoerbare formaten.
Vakgebied: Linker, loader en uitvoerbare formaten
Hoe ASLR een proces verschuift
Wanneer een programma start, kiezen de kernel en de dynamische loader willekeurige, op pagina's uitgelijnde basisoffsets voor elk hoofdgebied van de adresruimte: de stack, de heap, het mmap-gebied waar gedeelde bibliotheken worden gemapt, en het uitvoerbare bestand zelf als het als position-independent executable (PIE) is gebouwd. De onderlinge volgorde van de gebieden blijft de gebruikelijke (text, data, BSS en heap op lage adressen, de stack bovenaan), maar hun absolute adressen verschillen bij elke uitvoering. Address space layout randomization (ASLR) verandert dus waar dingen staan, niet wat het programma doet.
Waarom aanvallers adressen nodig hebben
Exploits via geheugencorruptie, zoals stack buffer overflows, overschrijven meestal een returnadres of functiepointer met het adres van iets nuttigs: shellcode op de stack, een bibliotheekfunctie zoals system() bij een return-to-libc-aanval, of een keten van instructiefragmenten bij return-oriented programming (ROP). Voor elk daarvan zijn exacte adressen nodig. Met ASLR moet de aanvaller ze raden, en een verkeerde gok laat het proces meestal crashen in plaats van de controle over te dragen. De bescherming is probabilistisch, dus de sterkte hangt af van het aantal beschikbare willekeurige bits, dat bij 32-bit adresruimten veel beperkter is dan bij 64-bit adresruimten.
Beperkingen en aanvullende verdedigingen
Randomisatie gebeurt per gebied, dus het lekken van één pointer uit een bibliotheek onthult de offset van die hele bibliotheek, en daarmee van elke functie erin. Childprocessen die met fork() zijn gemaakt, erven de indeling van de parent, waardoor aanvallers een forkende server herhaaldelijk kunnen aftasten. Daarom wordt ASLR gecombineerd met niet-uitvoerbaar beschrijfbaar geheugen (W^X of NX), stack canaries en control-flow-beveiligingen. Ook de kernel van het besturingssysteem kan worden gerandomiseerd; dat heet KASLR. Op Linux is de instelling zichtbaar in /proc/sys/kernel/randomize_va_space.
Veelgestelde vragen
Voorkomt ASLR bufferoverflowaanvallen?
Nee. ASLR houdt de overflow zelf niet tegen; het maakt het alleen moeilijk om te weten naar welk adres gesprongen moet worden, zodat de meeste pogingen crashen in plaats van slagen. Een informatielek dat één echt adres onthult, kan het omzeilen; daarom wordt het gecombineerd met NX-geheugen en stack canaries.
Wat is het verschil tussen ASLR en PIE?
ASLR is het mechanisme van het besturingssysteem dat geheugengebieden bij elke uitvoering op willekeurige adressen laadt. PIE is een manier om het uitvoerbare bestand te compileren en linken zodat zijn code op elk adres werkt, waardoor ASLR naast bibliotheken, stack en heap ook het hoofdprogramma kan randomiseren.
Hoe controleer ik of ASLR aanstaat op Linux?
Lees /proc/sys/kernel/randomize_va_space: 0 betekent uitgeschakeld, 1 randomiseert de stack, het mmap-gebied en gedeelde bibliotheken, en 2 randomiseert daarnaast de heap op basis van brk. De meeste distributies gebruiken standaard 2.