ShadowCallStack

ShadowCallStack (SCS) è una modalità di strumentazione LLVM che protegge dalle sovrascritture degli indirizzi 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 non foglia e caricando l'indirizzo di ritorno da ShadowCallStack nella funzione epilogo. Anche l'indirizzo di ritorno 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 sullo stack normale 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 evita di esporre l'indirizzo di ShadowCallStack ad aggressori in grado di 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 di 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, le librerie che potrebbero essere caricate da applicazioni di terze parti), il che potrebbe rovinare il registro x18 . Pertanto, consigliamo di abilitare SCS solo in componenti autonomi che non verranno caricati nei file binari legacy.

Convalida

Non ci sono 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.