G-Free: sconfiggere la programmazione orientata al rendimento tramite i binari senza gadget
Questo documento descrive quella che sembra una tecnica davvero interessante per prevenire gli attacchi ROP se la fonte è disponibile. Usano un preprocessore di assemblaggio tra gcc e l'assemblatore per rimuovere o proteggere tutti i possibili rami liberi (ritorni e salti indiretti). Sostengono di avere un impatto sulla velocità / prestazioni del 3% (1% in media).
Modificano le istruzioni o aggiungono no-op per modificare l'allineamento in modo da eliminare le istruzioni di diramazione non intenzionali / non allineate. Per proteggere i ritorni e i salti legittimi, crittografano l'indirizzo di ritorno con una chiave di runtime casuale nel prologo della funzione e lo decodificano da XOR appena prima del ritorno. Questo dovrebbe impedire l'esecuzione dell'output di ritorno a meno che il punto di ingresso non fosse all'inizio della funzione stessa.
La mia domanda è: come verrà restituita la crittografia dell'indirizzo, impedendo l'utilizzo dei gadget ROP? La chiave / cookie è memorizzata nello stack appena sopra l'indirizzo di ritorno, quindi cosa deve impedire all'utente malintenzionato di modificare la catena di gadget nello stack per includere anche una chiave 0x00000000 dopo ogni indirizzo di ritorno?
Il documento sembra avere 73 citazioni e nessuno ha menzionato nulla di simile per quanto posso vedere quindi mi manca qualcosa. Qualcuno può far luce su come funziona il codice di protezione per salti e ritorni legittimi?
(So che questa è una lunga domanda che richiede la lettura di un lungo documento, ma spero che almeno chi legge questo trovi il giornale così bello come lo feci)
Aggiorna
Questa è apparentemente la stessa (o molto simile) tecnica utilizzata in StackGuard e ProPolice. Qualcuno può dirmi come vanno contro le vulnerabilità di divulgazione della memoria? Non riesco a capire di sicuro. Quello che trovo o li cita di passaggio o si limita a trombare le loro virtù.