Unicode è uno standard di codifica dei caratteri che consente di rappresentare un’ampia gamma di simboli, alfabeti ed emoji utilizzati in tutto il mondo. Basti pensare che a settembre 2024 lo Standard Unicode è cambiato ancora con l’introduzione di 5.000 nuovi caratteri. In un altro articolo abbiamo spiegato nel dettaglio come ottenere caratteri speciali da tastiera. La flessibilità di Unicode apre le porte all’uso di tecniche avanzate di steganografia, l’arte di nascondere informazioni all’interno di elementi apparentemente “insospettabili”.
L’ingegnere software Paul Butler ha voluto confermare uno degli esempi più interessanti di questa pratica, dimostrando come sia possibile “contrabbandare” dati arbitrari all’interno di caratteri Unicode, in particolare attraverso l’uso dei cosiddetti variation selectors.
Il sistema di codifica Unicode e i code points
In Unicode, ogni carattere è associato a un valore numerico chiamato code point, rappresentato nella forma U+XXXX
(dove XXXX
è un numero esadecimale). Ad esempio, il carattere `g` corrisponde a U+0067
, una faccina sorridente a U+1F600
.
Provate ad aprire il Blocco Note di Windows, scrivete 1F600
, selezionate i caratteri appena inseriti quindi premete ALT+X
: vedrete immediatamente comparire la faccina che ride.
Per rendere il sistema ancora più flessibile, Unicode include una funzionalità chiamata variation selector, che consente di specificare diverse varianti di un carattere senza modificarne la rappresentazione visiva. Esistono due categorie principali di variation selectors:
- Standardized Variation Sequence (SVS)
- Ideographic Variation Sequence (IVS)
Questi selector vanno da U+FE00
(VS-1) a U+E01EF
(VS-256) e sono accodati a un carattere base per definirne una variante, senza però alterarne il rendering visibile. Questo significa che se il carattere `g` (U+0067
) è fatto seguire da U+FE01
(VS-2), la resa grafica sarà sempre `g`, ma il codice sottostante includerà il selector, rilevabile solo tramite analisi binaria del testo.
Occultamento di dati attraverso Unicode
I variation selectors sono utilizzati per specificare varianti stilistiche e forme grafiche. Ad esempio, il simbolo di una mano che fa il segno “vittoria” può essere rappresentato nella forma classica oppure, tramite il variation selector si può indicare di renderlo come emoji.
In generale, i variation selectors sono adoperati al fine di garantire coerenza visiva e stilistica in contesti in cui è importante controllare l’aspetto di un carattere senza modificarne il significato.
Butler mette in evidenza il fatto che i variation selectors possono essere sfruttati per nascondere testi all’interno di semplici caratteri Unicode perché tali codici sono mantenuti anche quando il testo è copiato negli appunti e incollato (CTRL+C
/CTRL+V
).
In questo modo si possono trasferire dati invisibili all’occhio umano, che però rimangono fissati all’interno della rappresentazione digitale. Poiché esistono 256 variation selectors, è possibile codificare un byte di dati per ogni carattere.
La frase contenente il messaggio nascosto
Prendete la seguente frase di esempio:
Ce la giochiamo a birra e󠅆󠅙󠅦󠅑󠄐󠄹󠅜󠅃󠅟󠅖󠅤󠅧󠅑󠅢󠅕󠄞󠅙󠅤󠄜󠄐󠅕󠄐󠅞󠅟󠅞󠄐󠆳󠆘󠄐󠅥󠅞󠄐󠅣󠅕󠅗󠅢󠅕󠅤󠅟󠄑 salsicce?
All’apparenza non c’è di nulla di strano, a parte la citazione tratta da un film di Bud Spencer e Terence Hill. Provate però a selezionare la frase e a copiarla nell’applicazione di decodifica sviluppata da Butler. Dopo aver fatto copia e incolla, nel riquadro in basso vi apparirà magicamente il nostro messaggio segreto!
Come può accadere? Utilizzando poche righe di codice di programmazione (vedere il progetto su GitHub), è possibile convertire qualunque sequenza di caratteri (quella componente il messaggio segreto) in una successione di variation selectors, poi accodati a un carattere Unicode di base. Nel nostro caso abbiamo scelto U+0065 ovvero il carattere `e`.
Ecco quindi che la semplice congiunzione nella frase presentata in precedenza contiene il messaggio segreto.
Utilizzando sempre l’applicazione Web messa a punto da Butler e agendo sull’interruttore in alto in modo da selezionare Encode, potete inserire il vostro messaggio segreto e, appena più sotto, scegliere il carattere o il simbolo all’interno del quale nasconderlo.
Applicazioni e rischi
Poiché i variation selectors non alterano la resa visiva del testo, la tecnica illustrata da Butler potrebbe essere utilizzata per aggirare filtri basati sulla semplice analisi del testo.
Altre applicazioni possono essere il watermarking dei testi: senza modificare l’aspetto di un articolo, si può marcarlo digitalmente e capire se è stato copiato e incollato altrove. Non solo. Inviando versioni leggermente diverse di un testo a diversi destinatari (con variation selectors unici per ciascuno), è possibile tracciare l’origine di una fuga di informazioni in caso di divulgazioni non autorizzate.
Ancora, la tecnica può essere utilizzata per nascondere informazioni nei testi senza destare sospetti. Ad esempio, un intero file binario potrebbe essere convertito in una stringa Unicode e trasmesso tramite un semplice messaggio in chat.
I modelli generativi basati sull’AI sono in grado di scovare i messaggi segreti?
I tokenizer, componenti fondamentali per l’elaborazione del linguaggio naturale utilizzati dai moderni modelli generativi, sembrano generalmente preservare i variation selectors. Questo significa che, in teoria, i modelli AI hanno accesso a queste informazioni durante l’elaborazione del testo.
Nonostante la conservazione dei variation selectors, i modelli AI spesso non tentano di decodificarli. Ciò potrebbe essere dovuto a una combinazione di fattori, tra cui la scarsa presenza di questi elementi nei dati di addestramento o una prioritizzazione della “comprensione” testuale rispetto alla rappresentazione visiva dei caratteri.
Tuttavia, quando un modello è affiancato da un interprete di codice, le sue capacità di risoluzione di questi elementi migliorano notevolmente. Alcuni modelli, infatti, riescono a interpretare i variation selectors con successo, dimostrando che la loro gestione è nel raggio d’azione delle soluzioni AI.
Un caso interessante riguarda il modello Gemini 2.0 Flash di Google, che riesce a decodificare i variation selector in pochi secondi, utilizzando strumenti avanzati come Codename Goose e foreverVM. Questo risultato evidenzia come l’integrazione di componenti di interpretazione del codice possa migliorare significativamente la capacità di comprensione dei modelli di IA.
Claude di Anthopic utilizza un impegnato nella risoluzione di un variation selector, con un processo più articolato, ma comunque efficace. Questi esempi suggeriscono che la chiave per una migliore gestione di questi caratteri risieda nell’uso combinato di modelli linguistici e interpreti di codice.
Qui i risultati dei test svolti da Butler con Claude e Gemini.