Passa al contenuto principale

10. Considerazioni sulla sicurezza

Chi implementa UTF-8 deve considerare gli aspetti di sicurezza legati al modo in cui gestisce le sequenze UTF-8 illecite. È plausibile che in alcune circostanze un attaccante possa sfruttare un parser UTF-8 poco accorto inviandogli una sequenza di ottetti non consentita dalla sintassi UTF-8.

Attacco basato sulla codifica troppo lunga (overlong)​

Una forma particolarmente subdola di questo attacco può essere condotta contro un parser che esegue controlli di validità critici per la sicurezza sulla forma codificata in UTF-8 del suo input, ma interpreta come caratteri determinate sequenze di ottetti illecite.

Esempio 1: carattere NUL​

Ad esempio, un parser potrebbe vietare il carattere NUL quando è codificato come la sequenza di un solo ottetto 00, ma consentire erroneamente la sequenza illecita di due ottetti C0 80 e interpretarla come un carattere NUL.

Esempio 2: attraversamento di percorso​

Un altro esempio potrebbe essere un parser che vieta la sequenza di ottetti 2F 2E 2E 2F ("/../"), ma consente la sequenza di ottetti illecita 2F C0 AE 2E 2F.

Impatto reale​

Quest'ultimo exploit è stato effettivamente utilizzato in un virus diffuso che ha attaccato i server Web nel 2001; la minaccia alla sicurezza è quindi molto concreta.

Rischio di buffer overflow​

Un altro problema di sicurezza si presenta in fase di codifica in UTF-8: la descrizione di UTF-8 in ISO/IEC 10646 consente di codificare numeri di carattere fino a U+7FFFFFFF, producendo sequenze fino a 6 byte.

Esiste pertanto un rischio di buffer overflow se:

  • L'intervallo dei numeri di carattere non è esplicitamente limitato a U+10FFFF
  • Il dimensionamento dei buffer non tiene conto della possibilità di sequenze di 5 e 6 byte

Problemi di equivalenza canonica​

La sicurezza può essere influenzata anche da una caratteristica di diverse codifiche di caratteri, tra cui UTF-8: la "stessa cosa" (per quanto un utente possa percepire) può essere rappresentata da più sequenze di caratteri distinte.

Esempio: caratteri accentati​

Ad esempio, una e con accento acuto può essere rappresentata da:

  • Il carattere precomposto U+00E9 E ACUTE
  • La sequenza canonicamente equivalente U+0065 U+0301 (E + COMBINING ACUTE)

Implicazioni per la sicurezza​

Anche se UTF-8 fornisce una singola sequenza di byte per ciascuna sequenza di caratteri, l'esistenza di più sequenze di caratteri per la "stessa cosa" può avere conseguenze sulla sicurezza ogni volta che:

  • È coinvolto il confronto tra stringhe
  • Viene eseguita un'indicizzazione
  • Viene effettuata una ricerca
  • È richiesto un ordinamento
  • Viene utilizzato il confronto con espressioni regolari
  • Si effettuano operazioni di selezione

Esempio di scenario di attacco​

Un esempio sarebbe il confronto tra stringhe di un identificativo presente in una credenziale e nelle voci di una lista di controllo degli accessi.

Normalizzazione Unicode​

Questo problema può essere affrontato con soluzioni basate sulle Forme di Normalizzazione Unicode, si veda [UAX15].

Le Forme di Normalizzazione forniscono rappresentazioni canoniche che garantiscono che caratteri equivalenti risultino uguali nel confronto.


Collegamenti correlati​