ShadowCallStack

ShadowCallStack (SCS) è una modalità di strumentazione LLVM che protegge dalle sovrascritture dell'indirizzo di ritorno (come gli overflow del buffer dello stack) salvando l'indirizzo di ritorno di una funzione in uno ShadowCallStack allocato separatamente nel prologo della funzione delle funzioni nonleaf e caricando l'indirizzo di ritorno da ShadowCallStack nella funzione epilogo. Anche l'indirizzo del mittente viene memorizzato nello stack normale per compatibilità con gli svolgitori, ma per il resto non viene utilizzato. Ciò garantisce che gli attacchi che modificano l'indirizzo di ritorno nello stack regolare non abbiano alcun effetto sul flusso di controllo del programma.

Su aarch64, la strumentazione utilizza il registro x18 per fare riferimento a ShadowCallStack, il che significa che i riferimenti a ShadowCallStack non devono essere archiviati in memoria. Ciò rende possibile implementare un runtime che eviti di esporre l'indirizzo di ShadowCallStack ad aggressori che possono leggere memoria arbitraria.

Implementazione

Android supporta ShadowCallStack sia per il kernel che per lo spazio utente.

Abilitazione di SCS per il kernel

Per abilitare ShadowCallStack per il kernel, aggiungi la seguente riga al file di configurazione del kernel:

CONFIG_SHADOW_CALL_STACK=y

Abilitazione di SCS nello spazio utente

Per abilitare ShadowCallStack nei componenti dello spazio utente, aggiungi le seguenti righe al file del progetto di un componente:

sanitize: {
  scs: true
}

SCS presuppone che il registro x18 sia riservato per memorizzare l'indirizzo di ShadowCallStack e non venga utilizzato per altri scopi. Sebbene tutte le librerie di sistema siano compilate per riservare il registro x18 , ciò è potenzialmente problematico se SCS è abilitato per i componenti dello spazio utente che interagiscono con il codice legacy in-process (ad esempio, librerie che potrebbero essere caricate da applicazioni di terze parti), il che potrebbe ostacolare il registro x18 . Pertanto, consigliamo di abilitare SCS solo nei componenti autonomi che non verranno caricati nei file binari legacy.

Validazione

Non esistono test CTS specifici per SCS. Assicurati invece che i test CTS superino con e senza SCS abilitato per verificare che SCS non influisca sul dispositivo.