Memoria inizializzata zero

La memoria non inizializzata in C e C++ è una causa comune di problemi di affidabilità, bug di sicurezza della memoria e fughe di informazioni. Per evitare questi problemi, Android inizializza quanta più memoria possibile.

Memoria dello spazio utente inizializzata zero

A partire da Android 12, la memoria dello stack è inizializzata a zero in tutto il codice nativo della piattaforma (incluso JNI) e la memoria heap è inizializzata a zero in tutti i processi nativi della piattaforma (come netd ) ma non nello zygote o nelle app.

Si consiglia vivamente alle applicazioni originali e di terze parti create con NDK di utilizzare il flag del compilatore -ftrivial-auto-var-init=zero per inizializzare a zero le variabili locali dello stack. Il compilatore ottimizza eventuali azzeramenti non necessari. Ad esempio, quando una variabile locale viene inizializzata esplicitamente (come, int x = 123; la variabile x viene inizializzata solo una volta). Se il programma ha un buffer di stack di grandi dimensioni in un hotspot di prestazioni, lo sviluppatore può disabilitare l'inizializzazione utilizzando un attributo del compilatore:

__attribute__((__uninitialized__)) char buf[BUFSIZ];

Le applicazioni possono anche acconsentire esplicitamente all'inizializzazione heap zero utilizzando l'attributo manifest android:nativeHeapZeroInitialized . In alternativa, l'inizializzazione dell'heap zero può essere controllata in fase di esecuzione con:

int mallopt(M_BIONIC_ZERO_INIT, level)

Dove il livello è 0 o 1.

Memoria del kernel inizializzata zero

Lo stack e l'heap del kernel sono inizializzati a zero per i kernel GKI, il che è fortemente raccomandato dal CDD .

Per l'inizializzazione dello stack, GKI utilizza la configurazione CONFIG_INIT_STACK_ALL_ZERO , che si traduce nella creazione del kernel utilizzando il flag del compilatore -ftrivial-auto-var-init=zero . Per l'inizializzazione dell'heap, GKI utilizza CONFIG_INIT_ON_ALLOC_DEFAULT_ON , che rende inizializzate a zero tutte le allocazioni di heap di pagina e SLAB e SLUB quando vengono create. Questa opzione è effettivamente simile al passaggio init_on_alloc=1 come opzione di avvio del kernel.

Segnalazioni di bug

I nostri strumenti generano segnalazioni di bug approfondite che contengono informazioni aggiuntive per facilitare il debug. L'ulteriore analisi dello stack di allocazione e deallocazione aiuta a comprendere meglio il ciclo di vita di una determinata allocazione e porta molto più rapidamente alla radice dei bug di sicurezza della memoria.

Esempio di segnalazione di bug generata dallo strumento di sicurezza della memoria
Figura 1 : segnalazioni di bug generate dagli strumenti di sicurezza della memoria

Durante lo sviluppo, i fornitori dovrebbero monitorare la presenza di bug controllando /data/tombstones e logcat per eventuali arresti anomali nativi. Per ulteriori informazioni sul debug del codice nativo di Android, vedere le informazioni qui .