Ci sono truffe digitali che non si basano su virus o vulnerabilità tecniche, ma su qualcosa di molto più semplice: l’illusione visiva. Un nome utente, un indirizzo email o un dominio possono sembrare identici a quelli di un servizio legittimo, ma essere in realtà costruiti con caratteri diversi. A occhio nudo non si nota nulla. Per i sistemi informatici, invece, si tratta di stringhe completamente distinte. È una tecnica, basata sul concetto di attacco omografico, usata molto spesso per imitare brand, piattaforme e persone reali. E funziona proprio perché sfrutta una debolezza umana: leggiamo le forme, non i codici.
Quando PayPal non è davvero PayPal
Facciamo subito un esempio che dovrebbe chiarire la portata del problema. Guardate le seguenti due stringhe:
paypal.comраypal.com
All’apparenza sembrano identiche e corrispondere all’URL di PayPal. In realtà, nel secondo indirizzo la “p” e la “a” sono lettere cirilliche mentre le successive appartengono all’alfabeto latino. Se incollate la stringa in WhatsApp, il raggiro non appare evidente: l’indirizzo sembra a tutti gli effetti un URL PayPal. Se incollate la stessa stringa nella barra degli indirizzi di Chrome, invece, appare quanto segue:
xn--ypal-43d9g.com
Quando due parole sembrano uguali ma non lo sono
Come abbiamo visto nel caso precedente, sembra di avere a che fare con la stessa parola. In realtà, il sistema informatico considera correttamente le stringhe come distinte.
E non vale solo per i nomi di dominio ma anche per username, indirizzi email, nomi di progetti o handle pubblici. Un attaccante può registrare una variante quasi identica di un nome legittimo e sfruttare la fiducia dell’utente per indurlo a cliccare, accedere o inserire dati sensibili. E il phishing basato su attacco omografico (o attacco con omoglifi, caratteri diversi che hanno la stessa forma) è servito.
La causa non è un errore, ma una scelta progettuale precisa: Internet utilizza Unicode, uno standard che include alfabeti e sistemi di scrittura di tutto il mondo.
Basti pensare che il numero di simboli in Unicode è molto più grande di quanto si immagini e cresce a ogni nuova versione dello standard. Nella versione più recente Unicode definisce circa 150.000 caratteri distribuiti su oltre 160 sistemi di scrittura, più una quantità enorme di simboli, emoji, segni tecnici e varianti tipografiche.
Oltre all’alfabeto latino, che noi utilizziamo normalmente, esistono lettere greche, lettere cirilliche, simboli matematici, varianti tipografiche stilizzate.
Molti di questi caratteri sono visivamente identici o quasi identici alle lettere latine. E quando sono inseriti in username o URL, diventano strumenti perfetti per l’impersonificazione.
Quanti di questi sono “pericolosi”?
Una parte davvero importante dei caratteri Unicode è considerata realmente responsabile di confusione visiva. Il file ufficiale confusables.txt, mantenuto aggiornato da Unicode Consortium, include circa 6.500 caratteri “confondibili”. Applicando una normalizzazione NFKC, trasformazione che prende un testo Unicode e lo riduce alla sua forma canonica più semplice e standard, il numero scende a poche centinaia realmente rilevanti per username e domini.
NFKC rimuove le varianti stilistiche, espande le legature e converte le forme compatibili in ASCII base quando possibile. Sono però le singole applicazioni e piattaforme a decidere se e quando usarla.
Chrome trasforma i nomi di dominio sospetti in Punycode, ma non è sempre così!
Come abbiamo visto prima nel caso del dominio con caratteri cirillici раypal.com, Chrome trasforma automaticamente la stringa in xn--ypal-43d9g.com.
I principali browser Web sono progettati per difendere dagli attacchi con omoglifi: mostrano il prefisso xn-- quando rilevano qualcosa di sospetto, ad esempio una mescolanza di caratteri provenienti da alfabeti diversi. Se un dominio contiene lettere di alfabeti diversi (ad esempio latino + cirillico), è considerato sospetto.
È il caso di раypal.com: il browser lo “smaschera” mostrando xn--ypal-43d9g.com. Questo formato speciale si chiama Punycode.
Se invece, ad esempio, provate a incollare l’indirizzo inesistente пример.рф scritto interamente in cirillico nella barra degli indirizzi di Chrome, il browser lo lascia così com’è senza mostrare la versione Punycode.
Perché esiste questa trasformazione
Il DNS (il sistema di risoluzione dei nomi di dominio) in origine supportava solo ASCII: lettere latine base, numeri e trattini.
Ma il Web è globale, quindi si è deciso di permettere domini con caratteri accentati, alfabeti non latini (es. domini in arabo, cinese, russo…). Per farlo senza cambiare il funzionamento alla base dei sistemi DNS, si usa una codifica speciale: tutti i domini con caratteri Unicode sono convertiti in ASCII e il risultato è rappresentato con il prefisso xn--.
La stringa xn--ypal-43d9g.com non è altro che la versione Punycode ossia l’espressione “ASCII compatibile” dello stesso dominio. Il DNS non vede mai il dominio “Unicode puro”: vede solo la versione Punycode.
I browser moderni (Chrome, Firefox, Safari, Edge) decidono dinamicamente se mostrare la forma leggibile oppure la forma Punycode in base a regole di sicurezza.
Come controllare un dominio in Windows e smascherare caratteri non latini
Uno dei modi più semplici e immediati per far emergere l’utilizzo di caratteri non latini consiste nell’usare PowerShell.
Basta premere la combinazione Windows+X in Windows quindi digitare quanto segue (sostituendo al posto di quella indicata la stringa o l’indirizzo da verificare):
$idn = New-Object System.Globalization.IdnMapping
$idn.GetAscii("раypal.com")
Un controllo di questo tipo è utile perché non tutte le applicazioni si comportano allo stesso modo. Usare PowerShell con IdnMapping permette di bypassare completamente la rappresentazione grafica e vedere come una stringa è realmente interpretata a livello tecnico.

Se il risultato è identico alla stringa di partenza, il dominio è composto solo da caratteri ASCII standard. Se invece compare il prefisso xn--, significa che la stringa contiene caratteri Unicode non latini e merita un controllo più attento.
Su Linux si può effettuare la medesima verifica digitando ad esempio idn2 раypal.com. Il tool può essere installato manualmente, su Debian, Ubunutu e derivante con il comando sudo apt install idn2.