Perché la CPU non verifica / impone gli indirizzi di chiamata / ret corrispondenti?

0

Ho preso in considerazione il problema fondamentale dello stack overflow, dalla classica iniezione di codice shell che non funziona con NX bit al nuovo gadget ROP.

La prima domanda che ho avuto riguarda le CPU con registri di diramazione. Sembra che fare uno qualsiasi di questi tipi di attacchi su una CPU che tiene traccia di rami in uno "stack" di registri di diramazione, come ad esempio Itanium, sarebbe difficile se possibile. Ovviamente ci sono altri attacchi che non richiedono la sovrascrittura dell'IP di ritorno, ma la combinazione di registri di diramazione e bit NX non preclude un'enorme quantità di attacchi? In questo caso, perché le persone non considerano l'utilizzo di architetture di processori che utilizzano registri di diramazione per i propri dispositivi periferici?

Come domanda successiva, perché Intel / AMD non introduce una modalità operativa in cui la serie di istruzioni CALL / RET viene verificata e applicata? Sembra che il vero problema sia che la CPU lascia il tracking degli IP di ritorno nella cura del processo, in pila. Sarebbe una pessima interruzione di compatibilità semplicemente non spingere l'IP di ritorno nello stack, o persino spingere qualche valore casuale, ma perché non offrire una modalità in cui la CPU su CALL spinge l'IP di ritorno nello stack AND su una CPU backing store gestito per questo processo / thread / contesto. Queste pagine sarebbero totalmente off limits per il processo tranne attraverso CALL e RET. Quando viene eseguito RET, l'indirizzo prelevato dallo stack viene confrontato con l'indirizzo nella memoria secondaria e, se non sono uguali, si interrompono. Ovviamente questo sarebbe più lento, ma per le parti di applicazioni sensibili alla sicurezza, come quelle che gestiscono input esterni, l'applicazione potrebbe impostare il flag / modalità sicura scegliendo di sacrificare le prestazioni per la sicurezza.

Questo concetto ha senso? In realtà attenuerebbe gli attacchi orientati all'IP di ritorno?

    
posta Jeremiah Gowdy 29.11.2013 - 19:54
fonte

2 risposte

1

La tua idea suona come ROP Defender anche se è un implementazione software.

Ciò renderebbe più difficile il buffer overrun, ma mentre non riesco a pensare a come aggirarlo proprio ora, mi aspetto che alcuni exploit intelligenti possano aggirarlo. Quindi quello che tu proponi è effettivamente un altro tipo di tecnica anti-sfruttamento - sarebbe una sorella da Stack guard, DEP, ASLR, ecc.

Quando si considerano le tecniche anti-sfruttamento ci sono due considerazioni principali: compatibilità e prestazioni. Queste tecniche sono utilizzate solo quando c'è un ottimo risultato. La mia sensazione istintiva è che questo non lo taglierà: troppo dolore alle prestazioni per troppi benefici. Ma chi lo sa, forse verrà implementato.

    
risposta data 29.11.2013 - 23:00
fonte
0

Come ti aspetti che la CPU verifichi queste corrispondenze? Dovrebbe memorizzare la posizione delle istruzioni di chiamata. Dove li metterebbe? in pila? I processori non hanno storage di dimensioni variabili.

Non so dove si ottiene che una CPU "traccia i rami in una" pila "di registri dei rami". Non è assolutamente il caso. Le CPU mantengono i dati previsione ramo , ma non tengono traccia dell'ordine in cui sono stati prelevati i rami.

Anche se la CPU in qualche modo ha trovato un posto dove memorizzare l'indirizzo di una diramazione, dovrebbe essere detto a proposito di tutte le cose che interrompono il call / ret matching: nonlocal returns (exceptions), context switches, ecc.

Inoltre, molte (più?) architetture hardware non hanno nemmeno istruzioni call / ret! Almeno su ARM e MIPS, una chiamata di funzione è una spinta seguita da un ramo e un ritorno di funzione è un ramo seguito da un pop. (Sto semplificando ma tu hai l'idea).

Non so della funzione Itanium che hai menzionato, ma se può davvero fare ciò che cerchi, è molto insolito.

In poche parole, ciò che stai proponendo non può funzionare con un tipico processore hardware. Potrebbe funzionare in alcune macchine virtuali.

    
risposta data 29.11.2013 - 20:39
fonte

Leggi altre domande sui tag