ShadowCallStack (SCS) è una modalità di strumentazione LLVM che protegge l'indirizzo di restituzione sovrascrivi (come gli overflow del buffer dello stack) salvando per restituire l'indirizzo a un ShadowCallStack allocato separatamente il prologo di funzioni delle funzioni nonleaf e il caricamento dell'indirizzo di ritorno da ShadowCallStack nell'epilogo della funzione. Viene memorizzato anche l'indirizzo di restituzione nello stack regolare per garantire la compatibilità con i unwinder, ma non viene utilizzato per altri motivi. Ciò garantisce che gli attacchi che modificano l'indirizzo di restituzione nello stack regolare non hanno effetto sul flusso di controllo del programma.
Su aarch64, la strumentazione utilizza x18
registro per fare riferimento a ShadowCallStack, il che significa che fa riferimento
a ShadowCallStack non devono essere necessariamente
archiviati in memoria.
Ciò rende possibile implementare un runtime che evita l'esposizione
l'indirizzo di ShadowCallStack agli aggressori che possono leggere
una memoria arbitraria.
Implementazione
Android supporta ShadowCallStack sia per il kernel che per lo spazio utente.
Abilita SCS per il kernel
Per abilitare ShadowCallStack per il kernel, aggiungi la riga seguente alla file di configurazione del kernel:
CONFIG_SHADOW_CALL_STACK=y
Abilita SCS nello spazio utente
Per abilitare ShadowCallStack nei componenti dello spazio utente, aggiungi il metodo seguenti righe al file di progetto di un componente:
sanitize: { scs: true }
SCS presuppone che il registro x18
sia riservato all'archiviazione dell'indirizzo del
ShadowCallStack e non viene utilizzato per altri scopi. Anche se tutti i sistemi
compilate per prenotare il registro x18
, potenzialmente
problematico se SCS è abilitato per i componenti dello spazio utente che interagiscono con
codice legacy in-process (ad esempio, librerie che potrebbero essere caricate da terze parti
app), il che potrebbe compromettere il registro x18
. Di conseguenza, consigliamo solo
abilitare SCS in componenti autonomi che non verranno caricati in
file binari.
Convalida
Non esistono test CTS specifici per SCS. Assicurati invece che i test CTS passare con e senza SCS abilitato per verificare che SCS non influisca sul dispositivo.