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