2010-10-03 15 views
6

Ho sentito la teoria. Indirizzo Spazio La randomizzazione prende le librerie e le carica in posizioni casuali nello spazio degli indirizzi virtuali, in modo che nel caso in cui un hacker trovi un buco nel tuo programma, non ha un indirizzo pre-conosciuto per eseguire un attacco return-to-libc contro, per esempio. Ma dopo averci pensato per qualche secondo, non ha alcun senso come misura difensiva.Come può ASLR essere efficace?

Diciamo che il nostro ipotetico TargetLib (libc o qualsiasi altra cosa l'hacker sta cercando) è caricato in un indirizzo casuale invece che in uno deterministico. Ora l'hacker non sa in anticipo dove sono TargetLib e le routine al suo interno, ma nemmeno il codice dell'applicazione. Deve avere una sorta di tabella di ricerca da qualche parte nel binario per trovare le routine all'interno di TargetLib, e questo deve essere in una posizione deterministica. (O in una posizione casuale, indicata da qualcos'altro.È possibile aggiungere quante indicazioni indirette si desidera, ma alla fine si deve iniziare in una posizione nota.)

Ciò significa che invece di puntare il proprio codice di attacco al posizione nota di TargetLib, tutto ciò che l'hacker deve fare è puntare il suo codice di attacco sulla voce della tabella di ricerca dell'applicazione per TargetLib e dereferenziare il puntatore alla routine di destinazione, e l'attacco procede senza impedimenti.

C'è qualcosa nel modo in cui funziona l'ASLR che non capisco? Perché, come descritto, non vedo come sia qualcosa di più di un dosso, fornendo l'immagine della sicurezza ma senza una sostanza reale. Mi sto perdendo qualcosa?

risposta

2

Credo che questo sia efficace perché cambia l'indirizzo di base della libreria condivisa. Ricorda che le funzioni importate da una libreria condivisa vengono applicate all'immagine eseguibile quando viene caricata, e quindi non esiste una tabella di per sé, solo indirizzi specifici che puntano a dati e codice sparsi nel codice del programma.

Solleva la barra per un attacco efficace perché rende un semplice overrun del buffer (dove è possibile impostare l'indirizzo di ritorno nello stack) in uno in cui il sovraccarico deve contenere il codice per determinare la posizione corretta e quindi jmp ad esso . Presumibilmente questo rende solo più difficile.

Praticamente tutte le DLL in Windows sono compilate per un indirizzo di base a cui probabilmente non verranno eseguite e verranno comunque spostate, ma quelle principali di Windows tendono ad avere il loro indirizzo di base ottimizzato in modo che il trasferimento non sia necessario.

+1

Hai mai eseguito il debug di un file EXE di Windows a livello di ASM? C'è una tabella di importazione reale lì. Il caricatore non applica patch al codice, (tutte le posizioni in cui il codice può chiamare alcune routine esterne), applica la patch alla tabella di importazione, che è fondamentalmente una lunga sequenza di istruzioni JMP, a cui il compilatore genera CALL. –

+0

Non è solo la memoria condivisa ... – rook

+0

@Mason Wheeler - non per molto tempo, ma è bello saperlo. Mentre questo rende più facile determinare un particolare indirizzo, l'effetto netto è lo stesso, vero? Cambia un noto a uno sconosciuto, il che rende più difficile l'attacco. –

1

Non so se ti faccio domande correttamente ma ti spiegherò quando ASLR è efficace e quando no.

Supponiamo di avere app.exe e TargetLib.dll. app.exe sta utilizzando (collegato a) TargetLib.dll. Per semplificare la spiegazione, supponiamo che lo spazio degli indirizzi virtuali contenga solo questi 2 moduli.

Se entrambi sono abilitati per ALSR, l'indirizzo di base di app.exe è sconosciuto. Può risolvere alcuni indirizzi di chiamata di funzione quando viene caricato, ma un utente malintenzionato non sa né dove si trova la funzione né dove si trovano le variabili risolte. La stessa cosa accade quando viene caricato TargetLib.dll. Anche se app.exe ha una tabella di ricerca, un utente malintenzionato non sa dove si trova la tabella.

Poiché un utente malintenzionato non può stabilire quale sia il contenuto dell'indirizzo specifico, deve attaccare l'applicazione senza utilizzare alcuna informazione di indirizzo fissa. Di solito è più difficile se usa il solito metodo di attacco come overflow dello stack, overflow dell'heap, use-after-free ...

D'altra parte, se app.exe non è ASLR abilitato, è molto più facile per un utente malintenzionato sfruttare l'applicazione. Perché potrebbe esserci una chiamata di funzione a un'interfaccia API interessante a indirizzo specifico nell'app.exe e l'attaccante può usare l'indirizzo come indirizzo di destinazione per saltare. (L'attacco ad un'applicazione di solito inizia dal salto verso un indirizzo arbitrario).

supplementazione: si può già capire, ma voglio chiarire una cosa. Quando un utente malintenzionato sfrutta un'applicazione per vulnerabilità come il danneggiamento della memoria, di solito è obbligato a utilizzare fixed address jump instruction. Non possono usare l'istruzione relative address jump da sfruttare. Questo è il motivo per cui ALSR è davvero efficace per tali exploit.

+0

Va bene. È l'ultimo punto che non riesco a capire. Perché un utente malintenzionato può utilizzare 'fixed address jump' (che è un opcode ASM) ma non' address address jump' (che è solo un altro opcode ASM)? C'è qualche differenza magica di cui non sono a conoscenza? –

+1

Bene, per spiegarlo capisci prima come funziona tale exploit. Un buon esempio è il tipico overflow del buffer e la sovrascrittura dell'indirizzo di ritorno. Non spiegherò il dettaglio qui, ma il punto principale è che ciò che fa un utente malintenzionato è sovrascrivere l'indirizzo di ritorno con un certo valore fisso. Quando il flusso di esecuzione esce dalla funzione vulnerabile, salta all'indirizzo sovrascritto. Questo salto è sempre 'salto indirizzo fisso' non' salto relativo'. Potrebbero esserci alcune vulnerabilità che è possibile utilizzare per "salto relativo" da sfruttare, ma sono casi rari. –

+1

In altre parole, ciò che un utente malintenzionato può fare è solo corrompere 'data' not' instruction'. Per sfruttare un'app corrompono i "dati" utilizzati dall'istruzione "salta indirizzo fisso". L'autore di un attacco sta estraendo lo shellcode (codice che desidera eseguire) e passando allo shellcode. Nel codice shell possono usare salti relativi ma in circostanze ASLR saltare allo shellcode stesso è un problema difficile. –

Problemi correlati