Un gruppo di ricercatori accademici dell’Università di Cambridge ha scoperto una nuova modalità di attacco chiamata Trojan Source che permette di iniettare codice potenzialmente dannoso nel sorgente di qualunque progetto facendo in modo che non possa essere individuato con una revisione umana.
Trojan Source si basa su un semplice trucco che non richiede la modifica del compilatore: per questo può riguardare qualunque progetto sviluppato in Go, C++, C#, JavaScript, Java, Rust e Python.
In informatica un carattere di controllo è un carattere non visualizzabile che non rappresenta in sé un simbolo scritto. Tutti i caratteri nella tabella ASCII al di sotto della posizione 32 fanno parte di questa categoria: in un altro articolo abbiamo visto cosa sono e come ottenere i caratteri speciali usando la tastiera.
Due degli autori della ricerca, Nicholas Boucher e Ross Anderson, spiegano che è possibile sfruttare una caratteristica del sistema di codifica Unicode per fare in modo che il comportamento del codice compilato sia diverso da quello che appare evidente limitandosi a una semplice analisi del sorgente.
Righe che sembrano semplici commenti possono diventare codice che verrà invece preso in considerazione al momento della compilazione. Usando codici Unicode è infatti possibile specificare la direzione con cui un testo viene elaborato: un aggressore può così produrre codice sorgente sintatticamente valido nella maggior parte dei linguaggi moderni per i quali l’ordine di visualizzazione dei caratteri presenta, solo all’apparenza, una logica che diverge dalla logica reale.
Questo comportamento abbinato ai già noti attacchi omografici può avere conseguenze disastrose.
Negli attacchi omografici viene sfruttata possibile di sovrapporre visualmente caratteri simili: si pensi allo zero e alla lettera “O”, alla “l” minuscola con la “i” maiuscola oppure a una “H” latina e a una “H” cirillica. Il compilatore tratterà correttamente il codice trovandosi dinanzi a funzioni diverse ma l’occhio umano può essere facilmente tratto in inganno.
Un modo per difendersi da Trojan Source è quello di rifiutare l’uso di caratteri di controllo per la direzionalità del testo nei principali linguaggi di programmazione e nei compilatori. Nella maggior parte dei casi questa semplice soluzione può essere sufficiente anche perché gli sviluppatori possono sempre usare degli escape anziché inserier nel codice sorgente caratteri potenzialmente pericolosi.
Alle due problematiche sono stati assegnati i codici identificativi CVE-2021-42574 e CVE-2021-42694.