2015-04-25 20 views
5

Sono abbastanza familiare con ASLR, ma oggi ho sentito un nuovo fatto interessante sull'implementazione dell'ASLR in Windows.Bypassare ASLR di Windows determinando l'indirizzo della libreria utilizzando le pagine condivise

Per ottimizzare le prestazioni se il processo A e B caricano la stessa DLL, Windows lo caricherà solo una volta nella memoria fisica ed entrambi i processi condivideranno la stessa istanza tramite pagine condivise.

Questa è una vecchia notizia .. Ma la parte interessante è che entrambi i processi A e B caricheranno la libreria condivisa nello stesso indirizzo virtuale (perché ??).

Mi sembra che qualsiasi attacco locale (ad esempio escalation di privilegi) può facilmente aggirare ASLR dal seguente senso:

1. Create a new dummy process 
2. Check the address of dlls of interest (kernel32, user32 ..) 
3. Attack the privileged process and bypass ASLR with the information from step 2. 

ho fatto alcuni semplici test con Olly e ha scoperto che le librerie condivise sono infatti caricati in lo stesso indirizzo virtuale.

Se questo è davvero il caso, ASLR è inutile per lo sfruttamento locale?

+2

Se la DLL sarebbe caricato a un indirizzo diverso, allora deve essere trasferito e le pagine di RAM non possono più essere condivisi. Il punto principale di ASLR è che dove viene caricato sulla macchina non è lo stesso di dove è stato caricato sul mio. E quando lo riavvierai sarà diverso. –

+0

Per quanto mi ricordo .. Ogni processo ha una tabella che traduce gli indirizzi delle pagine virtuali in pagine fisiche. Ogni processo ha una sua tabella univoca. Non è possibile caricare una volta la DLL nella RAM fisica di Microsoft e per ogni processo caricare la DLL in un indirizzo virtuale diverso? – Michael

+2

No, il riposizionamento cambia il codice in modo che una copia non sia più valida. –

risposta

5

Si è corretto, ASLR è poca difesa contro un aggressore locale. È progettato principalmente per contrastare gli indirizzi hard-coded negli exploit remoti.

Modifica: Alcuni dettagli nella mia risposta precedente non erano corretti, sebbene il punto sopra sia ancora valido. Un indirizzo di base della DLL abilitato per ASLR è in realtà una funzione di entrambi: (1) un offset casuale scelto da Windows da un insieme di 256 valori possibili al momento dell'avvio; e (2) l'ordine in cui viene caricata la DLL, che per le DLL conosciute viene randomizzata dal Gestore della sessione durante l'avvio del sistema. Conoscere solo l'offset casuale non è quindi sufficiente per calcolare l'indirizzo di base di una DLL ASLR arbitraria. Tuttavia, se si è in grado di osservare direttamente l'indirizzo di una DLL di destinazione nella memoria condivisa, come si descrive, tutte le scommesse sono comunque disattivate.

Fonti: http://www.symantec.com/avcenter/reference/Address_Space_Layout_Randomization.pdf Windows Internals, 6a edizione

+1

Molto interessante .. Questa "tecnica" è usata in natura? Ho letto alcuni casi di studio sugli exploit locali e non ho mai visto un aggressore usando questa tecnica .. – Michael

+1

@MichaelEngstler mi scuso, credo di aver sbagliato completamente su quel dettaglio. Ho modificato la mia risposta per riflettere. – peterdn