Scudo

Scudo è un allocatore dinamico modalità utente memoria o allocatore mucchio, progettato per essere resistente contro vulnerabilità mucchio relative (come troppopieno heap tampone , dopo un uso gratuito , e doppio libera ) pur mantenendo prestazioni. Esso fornisce gli allocazione C e deallocazione primitive standard (come malloc e gratuito), così come i primitivi C ++ (come new e delete).

Scudo è più di un'attenuazione di un rivelatore di errore di memoria a pieno titolo come AddressSanitizer (asan) .

A partire dalla versione di Android 11, scudo viene utilizzato per tutto il codice nativo (tranne sui dispositivi con poca memoria, dove viene ancora utilizzato jemalloc). In fase di esecuzione, tutte le allocazioni e deallocazioni dell'heap native sono servite da Scudo per tutti gli eseguibili e le loro dipendenze di libreria e il processo viene interrotto se viene rilevato un danneggiamento o un comportamento sospetto nell'heap.

In Android 10, Scudo dovevano essere abilitato su una base per-binario impostando la LOCAL_SANITIZE := scudo opzione nel file .mk o sanitize: { scudo: true, } nel file .bp.

Scudo è open source e parte del progetto del compilatore-rt di LLVM. La documentazione è disponibile presso https://llvm.org/docs/ScudoHardenedAllocator.html . Le navi di runtime Scudo come parte della toolchain Android e il supporto è stato aggiunto al Soong e fare per consentire un facile abilitazione del allocatore in un binario.

È possibile abilitare o disabilitare la mitigazione aggiuntiva all'interno dell'allocatore utilizzando le opzioni descritte di seguito.

personalizzazione

Alcuni parametri dell'allocatore possono essere definiti in base al processo in diversi modi:

  • Staticamente: Definire un __scudo_default_options funzionano nel programma che restituisce la stringa opzioni da analizzare. Questa funzione deve avere il seguente prototipo: extern "C" const char *__scudo_default_options() .
  • Dinamicamente: utilizzare la variabile d'ambiente SCUDO_OPTIONS contenenti la stringa di opzioni da analizzare. Opzioni definite in questo modo sostituiscono qualsiasi definizione effettuata attraverso __scudo_default_options .

Sono disponibili le seguenti opzioni.

Opzione impostazione predefinita a 64 bit 32 bit predefinito Descrizione
QuarantineSizeKb 256 64 La dimensione (in KB) della quarantena utilizzata per ritardare l'effettiva deallocazione dei blocchi. Un valore inferiore può ridurre l'utilizzo della memoria ma ridurre l'efficacia della mitigazione; un valore negativo ritorna ai valori di default. L'impostazione sia questo e ThreadLocalQuarantineSizeKb a zero disabilita la quarantena del tutto.
QuarantineChunksUpToSize 2048 512 La dimensione (in byte) fino alla quale i blocchi possono essere messi in quarantena.
ThreadLocalQuarantineSizeKb 64 16 La dimensione (in KB) della cache per thread utilizzata per scaricare la quarantena globale. Un valore inferiore può ridurre l'utilizzo della memoria ma potrebbe aumentare la contesa sulla quarantena globale. L'impostazione sia questo e QuarantineSizeKb a zero disabilita la quarantena del tutto.
DeallocationTypeMismatch false false Abilita la segnalazione degli errori su malloc/elimina, nuovo/gratuito, nuovo/elimina[]
DeleteSizeMismatch true true Abilita la segnalazione degli errori sulla mancata corrispondenza tra le dimensioni di nuovo ed elimina.
ZeroContents false false Abilita il contenuto del blocco zero all'allocazione e alla deallocazione.
allocator_may_return_null false false Specifica che l'allocatore può restituire null quando si verifica un errore recuperabile, invece di terminare il processo.
hard_rss_limit_mb 0 0 Quando l'RSS del processo raggiunge questo limite, il processo termina.
soft_rss_limit_mb 0 0 Quando RSS del processo raggiunge questo limite, ad ulteriore accantonamento falliscono o ritorno null (a seconda del valore di allocator_may_return_null ), fino a quando il RSS ridiscende per consentire nuove allocazioni.
allocator_release_to_os_interval_ms N / A 5000 Interessa solo un allocatore a 64 bit. Se impostato, tenta di rilasciare la memoria inutilizzata nel sistema operativo, ma non più spesso di questo intervallo (in millisecondi). Se il valore è negativo, la memoria non viene rilasciata al sistema operativo.
abort_on_error true true Se impostata, le chiamate strumento abort() al posto di _exit() dopo la stampa il messaggio di errore.

Convalida

Al momento non ci sono test CTS specifici per Scudo. Invece, assicurati che i test CTS passino con o senza Scudo abilitato per un dato binario per verificare che non influisca sul dispositivo.

Risoluzione dei problemi

Se viene rilevato un problema irreversibile, l'allocatore visualizza un messaggio di errore nel descrittore di errore standard e quindi termina il processo. Le tracce dello stack che portano alla terminazione vengono aggiunte nel registro di sistema. L'uscita di solito inizia con Scudo ERROR: seguito da una breve sintesi del problema insieme a tutti i puntatori.

Ecco un elenco dei messaggi di errore correnti e delle loro potenziali cause:

  • corrupted chunk header : La verifica di checksum pezzo ha fallito. Ciò è probabilmente dovuto a una delle due cose: l'intestazione è stata sovrascritta (parzialmente o totalmente) o il puntatore passato alla funzione non è un pezzo.
  • race on chunk header : due fili diversi stanno tentando di manipolare la stessa intestazione, allo stesso tempo. Questo di solito è sintomatico di una condizione di competizione o di una mancanza generale di blocco durante l'esecuzione di operazioni su quel blocco.
  • invalid chunk state : Il blocco non è nello stato previsto per una data operazione, ad esempio, non è allocata quando si cerca di liberarla, o non è in quarantena quando si cerca di riciclare. Un doppio libero è il motivo tipico di questo errore.
  • misaligned pointer : Requisiti di base di allineamento sono fortemente applicate: 8 byte su piattaforme a 32 bit e 16 byte su piattaforme a 64 bit. Se un puntatore passato alle nostre funzioni non si adatta a quelle, il puntatore passato a una delle funzioni non è allineato.
  • allocation type mismatch : Quando questa opzione è attivata, una funzione deallocazione chiamata su un pezzo deve corrispondere al tipo di funzione che è stato chiamato per allocare. Questo tipo di mancata corrispondenza può introdurre problemi di sicurezza.
  • invalid sized delete : quando l'operatore delete C ++ 14 dimensioni viene utilizzato, e la verifica facoltativa è abilitato, c'è una mancata corrispondenza tra le dimensioni che è stato passato quando deallocando un pezzo e la dimensione che è stato richiesto quando tali fondi. Si tratta di un problema compilatore o un tipo di confusione sull'oggetto che viene deallocato.
  • RSS limit exhausted : L'RSS massima opzionalmente specificato è stato superato.

Se stai debug di un crollo del sistema operativo stesso, è possibile utilizzare un accumulo HWASan OS . Se stai debug di un incidente in un app, è possibile utilizzare un HWASan app costruire troppo.