Google is committed to advancing racial equity for Black communities. See how.
This page was translated by the Cloud Translation API.
Switch to English

Puntatori contrassegnati

A partire da Android 11, per i processi a 64 bit, tutte le allocazioni di heap hanno un tag definito per l'implementazione impostato nel byte superiore del puntatore sui dispositivi con supporto kernel per ARM Top-byte Ignore (TBI). Qualsiasi applicazione che modifica questo tag viene terminata quando il tag viene controllato durante la deallocazione. Ciò è necessario per l'hardware futuro con supporto ARM Memory Tagging Extension (MTE).

Ignora primo byte

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

TBI richiede un kernel compatibile che gestisca correttamente i puntatori con tag passati dallo spazio utente. I kernel comuni di Android da 4.14 (Pixel 4) e versioni successive presentano le patch TBI richieste.

I dispositivi con il supporto TBI nel kernel vengono rilevati dinamicamente all'avvio del processo e un tag dipendente dall'implementazione viene inserito nel byte superiore del puntatore per tutte le allocazioni di heap. Successivamente, viene eseguito un controllo per garantire che il tag non sia stato troncato durante la deallocazione della memoria.

Disponibilità dell'estensione per la codifica della memoria

L'estensione MTE (Memory Tagging Extension) di ARM aiuta a risolvere i problemi di sicurezza della memoria. MTE funziona taggando i bit di indirizzo 56 ° -59 ° di ciascuna allocazione di memoria sullo stack, sull'heap e sulle globali. Il set di istruzioni e hardware controlla automaticamente che venga utilizzato il tag corretto ad ogni accesso alla memoria.

Le app Android che memorizzano in modo errato le informazioni nel byte superiore del puntatore non funzionano correttamente su un dispositivo abilitato per MTE . I puntatori con tag semplificano il rilevamento e il rifiuto degli usi errati del primo byte del puntatore prima che i dispositivi MTE siano disponibili.

Supporto per sviluppatori

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

  1. L'applicazione ha tentato di liberare un puntatore che non era stato allocato dall'allocatore di heap del sistema.
  2. Qualcosa nella tua app ha modificato il primo byte di un puntatore. Il byte superiore del puntatore non può essere modificato e il codice deve essere modificato per risolvere questo problema.

Esempi del puntatore di byte superiore modificato in modo errato.

  • I puntatori a un tipo particolare hanno metadati specifici dell'applicazione memorizzati nei primi 16 bit di indirizzo.
  • Un puntatore cast per raddoppiare e poi indietro, perdendo i bit di indirizzo inferiori.
  • Codice che calcola la differenza tra gli indirizzi delle variabili locali da diversi stack frame come un modo per misurare la profondità di ricorsione.

Alcune applicazioni possono dipendere da librerie che si comportano in modo non corretto quando viene impostato il byte superiore del puntatore. Riconosciamo che potrebbe non essere banale risolvere rapidamente questi problemi sottostanti nelle biblioteche. Pertanto, le applicazioni che utilizzano targetSdkLevel < 11 non avranno la codifica del puntatore abilitata per impostazione predefinita. Forniamo anche un portello di fuga per le applicazioni create per Android 11 o versioni successive per facilitare il periodo di transizione.

Il portello di fuga viene utilizzato aggiungendo quanto segue al file AndroidManifest.xml :

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

Ciò disabiliterà la funzione di codifica del puntatore per la tua applicazione. Si ricorda che questa non affronta il sottostante problema di codice di salute. Questo portello di fuga scomparirà nelle future versioni di Android, perché problemi di questa natura saranno incompatibili con MTE .