Aggiornata la codifica UTF-8 in Java

Da un articolo di Xueming Shen, si parla della modifica che ha interessato la codifica UTF-8 in JAVA.

Tale modifica riguarda in particolare il rifiuto della non-shortest-form. Infatti l’interpretazione di questa forma particolare di rappresentazione può essere utilizzata da exploit di vario tipo per ottenere dati sensibili. I dettagli inerenti questa problematica sono ben descritti in un corrigendum, ma vediamo molto brevemente cosa significa.

UTF-8 (Unicode Transformation Format, 8 bit) è una codifica dei caratteri Unicode in sequenze di lunghezza variabile di byte, creata da Rob Pike e Ken Thompson. UTF-8 usa gruppi di byte per rappresentare i caratteri Unicode, ed è particolarmente utile per il trasferimento tramite sistemi di posta elettronica a 8-bit.

UTF-8 usa da 1 a 4 byte per rappresentare un carattere Unicode. Per esempio un solo byte è necessario per rappresentare i 128 caratteri dell’alfabeto ASCII, corrispondenti alle posizioni Unicode da U+0000 a U+007F. Facciamo un esempio per capire meglio. Ecco, la rappresentazione della stringa ABC utilizzando un solo byte:

0×41 0×42 0×43

e utilizzandone due:

0xc1 0×81 0xc1 0×82 0xc1 0×83

Quest’ultimo è proprio un caso di non-shortest-form, poiché rappresentiamo con una sequenza ridondante un carattere Unicode che andrebbe bene anche usando la sua forma più breve. Per avere altri esempi riportiamo il seguente stralcio di codice in grado di mettere a confronto la non-shortest-form con due byte e il carattere rappresentato.

  1. byte[] bb = new byte[2];
  2.     for (int b1 = 0xc0; b1 < 0xc2; b1++) {
  3.         for (int b2 = 0x80; b2 < 0xc0; b2++) {
  4.             bb[0] = (byte)b1;
  5.             bb[1] = (byte)b2;
  6.             String cstr = new String(bb, "UTF-8");
  7.             char c = cstr.toCharArray()[0];
  8.             System.out.printf("[%02x, %02x] -> U+%04x [%s]%n",
  9.                               b1, b2, c & 0xffff, (c>=0x20)?cstr:"ctrl");
  10.         }
  11.     }

Il corrigendum citato evita il crearsi di questa situazione, specificando qual è la shortest form da usare e impedendo il verificarsi di più non-shortest-form. Ciò previene possibili vulnerabilità dovute a questa differente codifica. Tale nuova interpretazione della codifica UTF-8 è compatibile con le ultime versioni Java: JDK7, Open JDK 6, JDK 6 update 11 e successive, JDK5.0u17 e 1.4.2_19. Chi fosse invece curioso di vedere la sua interpretazione in codice, ecco un confronto tra la nuova e la vecchia versione della classe UTF_8.

Modifiche nella codifica UTF-8 in Java

You can leave a response, or trackback from your own site.

2 Responses to “Aggiornata la codifica UTF-8 in Java”

  1. diggita.it scrive:

    Aggiornata la codifica UTF-8 in Java…

    Da un articolo di Xueming Shen, si parla della modifica che ha interessato la codifica UTF-8 in JAVA.

    Tale modifica riguarda in particolare il rifiuto della non-shortest-form. Infatti l’interpretazione di questa forma particolare di rappresentazione…

  2. upnews.it scrive:

    Aggiornata la codifica UTF-8 in Java…

    Da un articolo di Xueming Shen, si parla della modifica che ha interessato la codifica UTF-8 in JAVA.

    Tale modifica riguarda in particolare il rifiuto della non-shortest-form. Infatti l’interpretazione di questa forma particolare di rappresentazione…

Leave a Reply

Subscribe to RSS Feed Follow me on Twitter!