2009-03-20 13 views
19

In che modo vengono eseguiti gli attacchi di overflow dell'heap?attacchi di overflow dell'heap

In caso di attacchi stackoverflow, l'utente malintenzionato sostituisce l'indirizzo di ritorno della funzione con il suo indirizzo.

Come viene eseguito negli attacchi di overflow dell'heap? Inoltre, è possibile eseguire il codice dall'heap?

risposta

32

Nota questo varia a seconda della piattaforma e il mio esempio è eccessivamente semplificato. Fondamentalmente si tratta di gestori di heap con elenchi collegati che potrebbero essere sovraccaricati, e si possono usare i puntatori di elenchi collegati per sovrascrivere parti casuali della memoria del processo.

Immaginate ho un'implementazione mucchio ingenuo i cui blocchi di controllo sono come questo:

struct HeapBlockHeader 
{ 
    HeapBlockHeader* next; 
    HeapBlockHeader* prev; 
    int size; 

    // Actual heap buffer follows this structure. 
}; 

quando l'heap viene liberato, questo blocco di controllo palla resta in un elenco di blocchi liberati, modificando il puntatore successivo/precedente . Se sovrascrivo un buffer di heap, posso sovrascrivere i puntatori nel prossimo blocco di controllo con i dati che controllo. Supponiamo di sovrascrivere questi collegamenti in modo che puntino a un puntatore al codice (probabilmente solo nel buffer I overran) e all'indirizzo di ritorno della funzione sullo stack. Quando il gestore di heap tenta di collegare nuovamente il blocco a una lista libera, in realtà sovrascriverà l'indirizzo di ritorno nello stack con un puntatore al controllo del codice I.

Questo articolo ha una bella panoramica sugli attacchi heap overflow: http://www.h-online.com/security/features/A-Heap-of-Risk-747161.html

Questo articolo descrive alcune delle indurimento che è andato in gestore di heap di Vista per prevenire questo tipo di attacco: http://www.blackhat.com/presentations/bh-usa-06/BH-US-06-Marinescu.pdf

EDIT: On possibilità di eseguire il codice dall'heap, sì è possibile. Molte piattaforme ora rendono la memoria heap non eseguibile di default che solleva la barriera per ottenere l'esecuzione di codice arbitrario. Tuttavia, puoi ancora eseguire un attacco di stile "jump to libc": sovrascrivi l'indirizzo di ritorno in una funzione conosciuta che sarà eseguibile.

+0

Ottima risposta: sento di conoscere molto le mie particolari aree di programmazione, ma non sono mai riuscito a immergermi nei compilatori, nella gestione della memoria, nei meccanismi di protezione - sapere dove si fermano le responsabilità del processore e l'avvio del sistema operativo. Poi di nuovo tra sistema operativo e codice app. Ho letto la copertina di intel x86 manual (vol 1) per la copertina. Come sei venuto per imparare queste cose? –