Puntatori taggati

A partire da Android 11, per i processi a 64 bit, tutte le allocazioni heap hanno un tag definito dall'implementazione impostato nel byte superiore del puntatore sui dispositivi con supporto del kernel per ARM Top-byte Ignora (TBI). Qualsiasi app che modifica l'impostazione viene interrotto quando il tag viene controllato durante la deallocation. Questa operazione è necessaria per hardware futuro con il supporto delle estensioni per la codifica della memoria ARM (MTE).

Ignora top-byte

La funzione Top-byte Ignora di ARM è disponibile per il codice a 64 bit in tutto l'hardware Armv8 AArch64. Questa caratteristica significa che l'hardware ignora il byte superiore di un puntatore quando che accede alla memoria.

Il TBI richiede un kernel che gestisce correttamente i puntatori con tag passati dallo spazio utente. I kernel comuni di Android a partire dalla versione 4.14 (Pixel 4) e versioni successive includono lo TBI richiesto di sicurezza.

I dispositivi con il supporto TBI nel kernel vengono rilevati dinamicamente dell'ora di inizio del processo e un tag dipendente dall'implementazione viene inserito nella parte superiore byte del puntatore per tutte le allocazioni di heap. Dopodiché, viene eseguito un controllo assicurati che il tag non sia stato troncato durante l'allocazione della memoria.

Idoneità delle estensioni di tagging della memoria

L'estensione di tagging della memoria (MTE) di ARM aiuta a risolvere i problemi di sicurezza della memoria. MTE funziona taggando i bit di indirizzo dal 56° al 59° di ogni memoria l'allocazione su stack, heap e globali. Hardware e set di istruzioni verifica automaticamente che venga utilizzato il tag corretto a ogni accesso alla memoria.

Le app per Android che memorizzano erroneamente le informazioni nel byte superiore del I cursori sono garantiti per l'interruzione su un dispositivo MTE integrato. I puntatori taggati semplificano il rilevamento e il rifiuto di utilizzi non corretti dei componenti principali byte del puntatore prima che i dispositivi MTE siano disponibili.

Assistenza per gli sviluppatori

Se la tua app si è arrestata in modo anomalo e ti è stato chiesto questo link, potrebbe significare che uno dei seguenti:

  1. L'app ha tentato di liberare un puntatore che non è stato allocato dal l'allocatore dell'heap del sistema.
  2. Qualcosa nella tua app ha modificato il byte superiore di un puntatore. Il byte principale il puntatore non può essere modificato e il codice deve essere modificato per risolvere il problema problema.

Esempi di utilizzo o modifica non corretti del puntatore byte principali.

  • I puntatori a un determinato tipo hanno metadati specifici dell'app memorizzati nei primi 16 bit di indirizzo.
  • Un puntatore viene trasmesso al doppio e poi all'indietro, perdendo i bit di indirizzo più bassi.
  • Codice che calcola la differenza tra gli indirizzi delle variabili locali da diversi stack frame per misurare la profondità della ricorsione.

Alcune app potrebbero dipendere da librerie che si comportano in modo errato quando il byte superiore del puntatore. Ci rendiamo conto che non banali per risolvere rapidamente i problemi di base nelle librerie. Di conseguenza, app che usano targetSdkLevel < 30 non avranno il tagging del puntatore abilitato per impostazione predefinita. Forniamo anche un'istanza per le app create con targetSdkLevel >= 30 per facilitare il periodo di transizione.

L'escape hatch viene utilizzato aggiungendo quanto segue al tuo File AndroidManifest.xml:

  <application android:allowNativeHeapPointerTagging="false">
  ...
  </application>

Questa operazione disattiva la funzionalità di tagging del puntatore per il tuo dell'app. Non consente di risolvere il problema di integrità del codice sottostante. Questa via di uscita scomparirà in futuro Android, poiché i problemi di questo tipo non saranno compatibili con MTE.