Nello spazio del kernel, si sta utilizzando lo stesso stack che interrompe l'utilizzo. Quando si verifica un'interruzione, the CPU pushes a return address and RFLAGS. Ciò elimina 16 byte al di sotto di rsp
. Anche se volessi scrivere un gestore di interrupt che presupponesse che i 128 byte completi della zona rossa fossero preziosi, sarebbe impossibile.
Si potrebbe forse avere un ABI kernel interna che aveva una piccola zona rossa rsp-16
-rsp-48
o qualcosa del genere. (Piccolo perché lo stack del kernel è prezioso e la maggior parte delle funzioni non richiede comunque molto la zona rossa.)
Gli operatori di interrupt dovrebbero sub rsp, 32
prima di premere qualsiasi registro. (e ripristinarlo prima di iret
).
Questa idea non funzionerà se un gestore di interrupt può essa stessa essere interrotta prima che si sub rsp, 32
, o dopo che ripristina rsp
prima di un iret
. Ci sarebbe una finestra di vulnerabilità in cui i dati importanti sono a rsp .. rsp-16
.
Un altro problema pratico con questo schema è che AFAIK gcc non ha parametri di zona rossa configurabili. È acceso o spento. Quindi dovresti aggiungere il supporto per l'aroma del kernel di red-zone a gcc/clang se volessi approfittarne.
Anche se è sicuro da interruzioni nidificate, i vantaggi sono piuttosto ridotti. La difficoltà di dimostrare che è sicuro in un kernel potrebbe renderlo non ne vale la pena. (E come ho detto, io non sono affatto sicuro che può essere implementato in modo sicuro, perché penso che gli interrupt annidati sono possibili.)
(A proposito, vedere il wiki x86 tag per collegamenti alla ABI documentando la zona rossa e altre cose)
fonte
2016-06-26 21:48:46
Correlati: http://stackoverflow.com/questions/38042188/where-exactly-is-the-red-zone-on-x86-64 e http://stackoverflow.com/questions/37941779/why-do -e-abbiamo-bisogno-stack-allocazione-quando-abbiamo-una-zona-rossa hanno risposte che spiegano cos'è la zona rossa per il codice che può usarlo. –