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 un ShadowCallStack allocato separatamente nel prologo della funzione delle funzioni non a foglia e caricando l'indirizzo di ritorno da ShadowCallStack nell'epilogo della funzione. L'indirizzo di ritorno viene memorizzato anche sull'apposita pila per la compatibilità con gli unwinder, ma altrimenti non viene utilizzato. In questo modo, gli attacchi che modificano l'indirizzo di ritorno nello stack normale non hanno 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 memorizzati in memoria. In questo modo è possibile implementare un runtime che evita di esporre l'indirizzo di ShadowCallStack ad attaccanti in grado di leggere memoria arbitraria.

Implementazione

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

Attivare la crittografia lato client per il kernel

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

CONFIG_SHADOW_CALL_STACK=y

Attivare SCS nello spazio utente

Per attivare ShadowCallStack nei componenti dello spazio utente, aggiungi le righe seguenti al file blueprint 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, questo è potenzialmente problematico se SCS è attivato per i componenti dello spazio utente che interoperano con il codice legacy in-process (ad esempio le librerie che potrebbero essere caricate da app di terze parti), che potrebbero sovrascrivere il registro x18. Pertanto, consigliamo di attivare SCS solo nei componenti autocontenuti che non verranno caricati nei file binari legacy.

Convalida

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