Perché un carattere indiano ha causato dei problemi nei dispositivi Apple

by SerHack


L'azienda Apple è stata criticata negli ultimi tempi per aver creato una totale centralizzazione all'interno del melafonino (anche noto come iPhone): è noto come ogni proprietario infatti è quasi obbligato dalla stessa azienda ad eseguire gli aggiornamenti sul proprio dispositivo, senza la possibilità di ritornare alla versione precedente.

Se da una parte questa situazione ha notevolmente migliorato la sicurezza di tutti i dispositivi Apple, dall'altra pero' ha creato un problema non da poco: infatti nel caso in cui qualcuno trovasse qualche tipo di problema nella sicurezza del software interno degli iPhone, avrebbe a disposizione un potenziale pubblico composto da oltre 10 milioni di utenti su cui testare e/o sfruttare il bug per scopi illeciti.

L'ultimo "difetto" degli iPhone è una errata visualizzazione e comprensione da parte del sistema operativo di un carattere indiano , per la precisione della lingua telugu che ha causato non pochi problemi negli ultimi giorni.

Il bug sembra abbia causato riavvii improvvisi dell'app in cui si tentava la visualizzazione del carattere indiano; se la lettera veniva visualizzata in qualche componente del sistema operativo, per esempio della SpringBoard, si poteva causare addirittura un riavvio dell'intero sistema operativo che avrebbe portato a un bootloop del dispostivo. In quel caso, l'utente avrebbe dovuto ripristinare il dispositivo in modalità DFU, perdendo così tutti i dati.

Purtroppo non solo gli iPhone hanno avuto questo tipo di seccatura, alcuni utenti riportano di aver trovato lo stesso in dispositivi come Mac, Watch e iMac. A questo punto ci si chiede come è stato possibile per un azienda con così tanto fatturato come la Apple, tralasciare il bug.

I caratteri Unicode: un po' di teoria

L'Unicode è un sistema di codifica che assegna un numero univoco ad ogni carattere usato per la scrittura di testi, in maniera indipendente dalla lingua, dalla piattaforma informatica e dal programma utilizzato. La standardizzazione di questo sistema ha semplificato non di poco il lavoro degli sviluppatori, risolvendo eventuali fraintendimenti avvenuti in passato utilizzando esclusivamente i caratteri ASCII.

L'Unicode è sviluppato in diversi gruppi, i cui caratteri / lettere corrispondono alle diverse lingue: questa serie di caratteri che sto utilizzando per scrivere l'articolo appartengono al gruppo dei caratteri "Latini".

Il sistema Unicode pero' non contiene solo numeri, lettere e simbol: ci sono, infatti, alcuni caratteri "speciali" che da definizione vengono implementati in ogni sistema operativo (come lo spazio fra due parole, il cosidetto "Invio a capo").

Immaginiamoci il motore dei caratteri di un qualsiasi dispositivo: esso per definizione scrive un qualsiasi carattere da sinistra verso destra e qui sta il problema: come è possibile che allora si possa scrivere in arabo da destra verso sinistra?

Semplicemente l'Unicode ci viene incontro standardizzando un carattere "invisibile" che consente a qualsiasi dispositivo di capire in che direzione; il carattere per far andare il testo da destra a sinistra. Esempio:
abc‏abc


Una lista completa di tutti i caratteri Unicode può essere trovata qui.

La lingua Telugu


La lingua Telugu è una lingua indiana parlata dal 5% della popolazione della popolazione dell'india; a differenza delle lingue occidentali, una parola in lingua Telegu non è strettamente data da una sequenza di lettere nella stessa riga ma anche di varie lettere composte quasi a formare un simbolo. Se non ci fossero i caratteri unicode, questo sarebbe un problema e andrebbe a crearsi una situazione in cui il sistema andrebbe sviluppato per più lingue diverse con il conseguente problema della compatibilità tra dispositivi di lingua diversa.

Diamo uno sguardo al carattere Telugu per eccellenza che in questi giorni ha causato un po' di grattacapi:

జ్ఞా

Sottolineo che il carattere da me inserito in questa pagina è sicuro e non provocherà alcun tipo di problema al vostro dispositivo.

Questo simbolo è formato dai diversi caratteri elencati: la consonante ja (జ), una virama (consonante non seguita da vocale) ( ్ ), la consonante nya (ఞ), un carattere zero-width non-joiner e la vocale aa ( ా).

Per chi è nerd e vuole più tecnicismi, i codici unicode corrispondenti sono: U+0C1C U+0C4D U+0C1E U+200C U+0C3E. Il carattere zero-width non-joiner è un carattere che modifica solo una componente visiva del carattere e non va a cambiarne struttura e/o significato etimologico. Un esempio qui sotto dell'aggiunta del carattere zero-width non-joiner.

Esempio


Prima immagine: senza zero-width non-joiner. Seconda: con lo "spazio invisibile".

Il problema

Ritornando al discorso del difetto segnalato negli ultimi giorni, sembrerebbe che la sequenza di caratteri unicode con il carattere zero-width non-joiner vada ad intaccare il motore grafico della Apple responsabile della visualizzazione dei caratteri che in qualche modo ritorna un errore imprevisto.

Dato che il simbolo జ్ఞా è in origine un unione di più caratteri, ogni carattere del simbolo (cioè జ , ్, ఞ , ZWNJ, ా) DEVE essere allocato nella memoria Ram e dopo secondo vari esperti l'origine del problema risiederebbe qui. Secondo diversi esperti la lettura sbagliata del simbolo zero-width non-joiner con la sequenza dei caratteri indiani causerebbe un allocazione errata dei caratteri: non verificando se effettivamente il buffer dei simboli è stato effettuato con successo, si verifica un null pointer in esecuzione.

Per evitare una corruzione dei dati interni alla Ram del dispositivo, nel momento in cui il null pointer viene segnalato e notificato (sembrerebbe che accade quando il ZWNJ viene letto), il processo in esecuzione non ha più i permessi per sovrascrivere e/o leggere l'indirizzo di memoria: EXC_BAD_ACCESS; in questo modo al applicazione in esecuzione viene negato "l'unificazione dei caratteri telugu in un simbolo unico".

Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000000
Termination Signal: Segmentation fault: 11
Termination Reason: Namespace SIGNAL, Code 0xb
Terminating Process: exc handler [0]
Triggered by Thread: 0


Arrestando l'applicazione in maniera anomala, il Core del sistema operativo protegge esso stesso da una eventuale corruzione totale che non permetterebbe neanche il ripristino in modalità DFU, rendendo il melafonino un semplice e solido mattone.

Tutto ciò si verifica ogni volta il sistema prova a leggere il simbolo "జ్ఞా" con il carattere zero-width non joiner: ciò non significa che un carattere zero-width non-joiner causa un potenziale arresto dell'applicazione anomala. Teoricamente se il simbolo Telugu risiede in una applicazione come SpringBoard, il sistema non avrà problemi a chiuderla, dato che dà precedenza al Core dell'iOS.

Risposta dell'Apple

L'azienda ha riferito già di aver risolto questo tipo di problema con l'ultima beta di iOS (11.3). Come sempre il fix verrà rilasciato in tempi brevi anche nella versione stabile. C'è pero' da ricordare che non è la prima volta che la particolarità di alcuni caratteri Unicode affligge in questo modo i dispositivi Apple, e ironia della sorte, è stata la stessa Apple anni fa a implementare e standardizzare i caratteri con il sistema Unicode.

Un altro elemento da notare è il Core (che include: il kernel e alcuni componenti chiave del sistema operativo, come il motore grafico per la scrittura e lettura dei caratteri, icone e dati) dei dispositivi Apple (iOS, MacOS e WatchOS) che molto probabilmente è condiviso tra i diversi sistemi operativi Made in Cupertino, dato che le piattaforme iPhone, Mac, iMac e iWatch hanno dato lo stesso problema con lo stesso tipo di simbolo.

Altro scacco matto per la Apple? è solo l'ennesimo "sbaglio" di un'azienda che sta spendendo più risorse per il marketing che per il fronte ingegneristico del software?

About Me
Hi, I am SerHack. A developer and security researcher.
Newsletter