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.

PIE en positie-onafhankelijke code

ASLR kan alleen code verplaatsen die niet uitgaat van een vast laadadres. Gedeelde bibliotheken worden al lang als positie-onafhankelijke code (PIC) gecompileerd en bereiken hun data via PC-relatieve adressering en de global offset table (GOT). Oudere uitvoerbare bestanden waren echter voor een vast adres gelinkt, zodat de code van het hoofdprogramma op een bekende plek bleef en aanvallers een betrouwbare bron van ROP-gadgets bood. Bouwen met -fPIE en -pie maakt ook het uitvoerbare bestand verplaatsbaar, zodat de loader het eveneens kan randomiseren. Op x86-64 zijn de kosten klein, omdat PC-relatieve datatoegang native wordt ondersteund.

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.

Nu oefenen: vragen over ASLR

Wat is het juiste doel van ASLR (address space layout randomization)?

  1. ADe adressen van stack, heap en bibliotheken bij elke uitvoering veranderen, zodat het moeilijk is te voorspellen welke adressen een aanvaller beoogt
  2. BGeheugenadressen willekeurig kiezen om het cachehitpercentage te verhogen
  3. COngebruikt geheugen willekeurig vrijgeven om de vrije capaciteit te vergroten
Antwoord en toelichting tonen

Antwoord: A. De adressen van stack, heap en bibliotheken bij elke uitvoering veranderen, zodat het moeilijk is te voorspellen welke adressen een aanvaller beoogt

Bij aanvallen die bijvoorbeeld bufferoverflows misbruiken, is het belangrijk de adressen van bibliotheekfuncties en data op de stack te kennen. ASLR verschuift bij elke start van een proces de adressen waarop stack, heap, gedeelde bibliotheken en het uitvoerbare bestand worden geplaatst, zodat aanvallers adressen niet vast kunnen aannemen. Het kan niet alleen volledig beschermen en wordt gecombineerd met andere maatregelen zoals scheiding van schrijven en uitvoeren.

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.

“ASLR” in de toelichting

Vragen met “ASLR” (3)

  1. Wat is het juiste doel van ASLR (address space layout randomization)?
  2. Welke volgorde van de geheugenindeling van een gangbaar proces op Linux en dergelijke, van laag naar hoog adres, is juist?
  3. Wat is de belangrijkste reden om een uitvoerbaar bestand als PIE (position-independent executable) te bouwen?

Verwante termen

Heap PIE (position-independent executable) BSS-sectie Dynamisch linken Dynamische linker ELF Entry point Fragmentatie Gedeelde bibliotheek (shared library) GOT (global offset table)

Naar de woordenlijst