Secondo i ricercatori di Phylum, pacchetti PyPi (Python Package Index) malevoli possono creare CloudFlare Tunnel per aggirare i firewall.
“La serie di package contenenti codice malevolo”, spiega Antonio Minnella, analista di Sicurezza Exprivia, ha “come target gli utenti di PyPI, il noto repository di package Python dal quale è possibile scaricare librerie sviluppate dalla community di sviluppatori Python”.
“Questo attacco”, commenta Paolo Passeri, Cyber Intelligence Principal di Netskope, “combina due aspetti che stanno caratterizzando il panorama delle minacce attuale”. Ecco quali e come proteggersi.
Indice degli argomenti
Pacchetti su PyPi malevoli bypassano i firewall
Il team di ricerca di Phylum ha scoperto che sei malevoli pacchetti su PyPI, Python Package Index, installano malware, nel dettaglio information-stealing e RAT (remote access trojan), mentre usano Cloudflare Tunnel per aggirare le restrizioni dei firewall per gli accessi da remoto.
Questo attacco combina due aspetti: “Da un lato gli attaccanti si stanno concentrando sempre più spesso sulla supply chain, applicando il paradigma di compromettere una singola entità per colpire numerosi obiettivi”, mette in guardia Paolo Passeri, “dall’altro le tecniche di evasione che fanno uso di piattaforme cloud diventano sempre più sofisticate e creative”.
“PyPi, il repository ufficiale per il software di terze parti per il linguaggio Python”, sottolinea Passeri, “si conferma un obiettivo privilegiato. L’enorme diffusione di questo linguaggio dovuto alla sua flessibilità che lo rende applicabile a molteplici contesti, rende il bacino di possibili vittime estremamente ampio, fatto questo che è alla base della crescita allarmante di campagne eseguite mediante package malevoli (tipicamente information stealer come in questo caso) distribuiti dagli attaccanti tramite PyPi, non senza creatività e senso dello humor come in una recente campagna in cui il pacchetto pubblicato emulava il kit di sviluppo di una nota azienda di sicurezza”.
La scoperta
“I ricercatori hanno intercettato un primo package sospetto lo scorso 22 dicembre, analizzandolo in dettaglio sono emerse una serie di curiose anomalie che hanno insospettito i ricercatori”, continua Minnella.
I pacchetti malevoli sono infatti: pyrologin (con 165 download); easytimestamp (con 141 download); discorder (83 download); discord-dev (228); style.py (193 download); pythonstyles (130).
Essi puntano a rubare informazioni sensibili degli utenti archiviate nei browser, far girare shell command e usare keylogger per trafugare segreti digitati su una tastiera.
“Eseguendo una scansione automatizzata per contenere i rischi è stato rilevato un package denominato pyrologin che presentava una serie di anomalie riconducibili al comportamento tipico dei malware Python. Nello specifico veniva invocata una funzione, offuscata in Base64, che a sua volta scaricava un file .zip dal dominio transfer[.]sh oltre a delle stringhe contenenti dei comandi PowerShell con parametri ‘SilentContinue’ e ‘-WindowStyle Hidden’. Tali dettagli mettono in risalto quello che a tutti gli effetti è un chiaro tentativo di mascherare le reali intenzioni del software”, sottolinea Minnella: “Nei giorni successivi sono stati identificati ulteriori casi analoghi a quello appena descritto e sono stati individuati altri pacchetti: easytimestamp, discover, discover-dev, style.py e pythonstyles che presentavano caratteristiche simili a pyrologin”.
La catena di attacco
Il primo anello nella catena dell’attacco “si presenta con l’esecuzione del comando pip install ben noto agli sviluppatori python e non solo, seguito dal ‘nome_package’ in questo modo si permetterà al malware di infettare la macchina corrente attraverso l’esecuzione del codice contenuto nel file setup.py del packege specificato”, mette in guardia Minnella.
- L’esecuzione di una stringa codificata in formato Base64 per essere resa non immediatamente leggibile ad occhio nudo. Una volta decodificata la stringa si ottiene la funzione nella figura 2.
Figura 2 - La funzione run che riceve in ingresso l’argomento cmd e lo passerà a subprocess.Popen() che eseguirà cmd in un nuovo processo all’interno di una shell. L’utilizzo del comando exec sulla stringa encodata in Base64 può essere riconducibile al tentativo di rendere più complessa l’analisi statica del codice.
- Verifica l’esistenza del path “C:/ProgramData/Updater”. In caso contrario, visualizza un messaggio in console informando l’utente che le dipendenze stanno per essere installate. Successivamente verificare quale versione di Python è in esecuzione e quindi passa un lungo comando PowerShell alla funzione di run. Il controllo della versione del Python in uso determina quali pacchetti devono essere installati per supportare la distribuzione finale del malware”, spiega Minnella.
I dettagli tecnici sui pacchetti PyPi malevoli
L’installer (setup.py) su questi file contiene una string base64-encoded che decodifica a uno script PowerShell. “Al fine di far agire indisturbata la minaccia, i setup.py, dei pacchetti compromessi”, dichiara Gianmarco Troia, analista di Sicurezza Exprivia, “contengono una stringa che comporta la decodifica di uno script PowerShell. Per consentire la sua esecuzione evitando di destare sospetti, lo script imposta un flag ‘-ErrorAction SilentlyContinue’ che ne consentiranno l’esecuzione anche qualora si verifichino dei problemi”.
“All’interno di questo iter, vengono quindi installate delle dipendenze e degli ulteriori pacchetti scritti in Python che permetteranno il controllo da remoto e anche l’acquisizione di screenshot. Durante la sua esecuzione, lo script scarica un file ZIP da una risorsa remota, tale archivio contiene diversi file che saranno estratti in una cartella temporanea, tra essi troviamo “server.pyw” il quale avvia quattro diversi thread, ognuno dei quali ha uno scopo ben preciso. Dopo aver eseguito quanto precedentemente descritto lo script ha necessità di installare un client Cloudflare Tunnel sulla macchina.
“Tale operazione viene svolta con l’esecuzione del file “cftunnel.py” contenuto nell’archivio ZIP menzionato.
Questa tipologia di connessione viene normalmente utilizzata dai server Web per diventare disponibili pubblicamente in tempi brevi, servendosi quindi di Cloudflare ed evitando la configurazione di firewall o la
gestione di problemi di routing. Tutto ciò però viene sfruttato anche dagli attaccanti per accedere da remoto al RAT sulla macchina infettata, non incontrando problemi di alcun tipo nonostante possa esserci un firewall a protezione della stessa macchina”.
Il comando Powershell
“Andando ad analizzare nel dettaglio il comando PowerShell eseguito”, secondo Minnella “è emerso che: il primo parametro ad essere settato è “SilentContinue”, necessario per non informare l’utente di tutto ciò che sta per essere eseguito; successivamente viene eseguita una richiesta per scaricare il file update.zip; da transfer[.]sh e salvarlo nella tmp directory locale; il file appena scaricato viene esploso; il file originariamente scaricato, update.zip, viene eliminato; attraverso l’esecuzione del comando Start-Process viene invocato “python -m pip install” seguito da una serie di package potenzialmente pericolosi tra cui troviamo pynput, pydirectinput, e pyscreenshot. Tali librerie permettono di prendere il controllo remoti di tastiera e mouse e di eseguire arbitrariamente degli screenshot del computer della vittima”.
“Il file zip scaricato contiene sei file (cftunnel.py, cgrab.py, discord.py, lauch.vbs, pwgrab.py e server.pyw) e due cartelle (static e templates).
L’esecuzione di lauches.vbs permette di lanciare un’istanza di powershell.exe in maniera del tutto trasparente all’utente.
La successiva esecuzione del file server.pyw [figura 3] evidenzia una nuova invocazione del comando exec, a cui viene passato come
parametro ancora una volta una stringa encodata in Base64 ma stavolta compressa con l’algoritmo LZMA (Algoritmo Lempel-Ziv-Markov)”.
debug mode”, prosegue Minnella.
“L’esecuzione prevede il lancio di quattro thread prima di procedere alla esecuzione di una app flask (un micro-framework per applicazioni web scritto in Python), continua Minnella.
I 4 thread
Ecco i quattro thread, illustrati Minnella: “Il primo thread invoca l’esecuzione della funzione startup che si presenta come in figura 5:
“Il secondo thread, invoca la funzione ping [figura 6]:
http://127.0.0.1:8099/metrics , in esecuzione sulla macchina locale, e in caso di risposta inoltra la stessa ad un URL proxato dalla rete onion”.
“Il terzo thread, avvia un keylogger che cattura tutti i tasti digitati sulla tastiera dall’utente vittima [Figura 7]”.
discord oltre agli eventuali wallet di crypto che l’utente potrebbe avere.
Crea un file.zip contenente tutto ciò che è riuscito a rubare e lo salva su transfer[.]sh. Ad operazione eseguita invia un ping su un altro sito sempre protetto da rete onion, probabilmente come feedback del fatto che l’operazione di data exfiltration sia andata a buon fine”.
Il tunnel Cloudflare
Al termine dei 4 thread, “lo script esegue un cftunnel.py anch'esso archiviato nell'archivio Zip scaricato inizialmente. Questo script viene utilizzato per installare un client tunnel Cloudflare sul computer della vittima”, avverte Minnella.
“Un tunnel Cloudflare è un servizio che consente agli utenti di creare un tunnel bidirezionale da un server (in questo caso il pc della vittima) all'infrastruttura Cloudflare”, continua Minnella: “In questo modo si consente ai server Web di diventare immediatamente disponibili al pubblico tramite Cloudflare senza configurare firewall, aprire porte o aggiungere regole di routing. Gli utenti malintenzionati sfruttano questa opzione per accedere attraverso il tunnel alla macchina compromessa anche se il dispositivo è protetto dal firewall”.
“Analogamente CloudFlare costituisce una piattaforma abusata spesso dagli attaccanti per evadere i controlli di sicurezza, l’utilizzo del tunnel fornisce un modo sicuro agli attaccanti per effettuare le operazioni di comando e controllo bypassando i controlli di sicurezza di eventuali dispositivi perimetrali”, conclude Paolo Passeri.
L’accesso all’app flask
“In questo caso, gli attori malevoli, attraverso il tunnel hanno accesso all’applicazione flask che gira sulla macchina della vittima e attraverso il ping eseguito dal thread due visto in precedenza, l’attaccante sarà informato del fatto che il tunnel è attivo e ha il controllo di quella specifica macchina”, evidenzia Minnella.
“L’app flask in esecuzione sulla macchina della vittima, e alla quale gli attaccanti hanno accesso attraverso il tunnel installato, permette loro di ottenere informazioni sulla macchina tra cui: username dell’utente, indirizzo IPV4, IPV6, CPU, GPU, RAM della macchina.
Oltre alla possibilità di eseguire arbitrariamente dei comandi, scaricare dei file in locale e grabbare file dalla macchina come mostrato nel form della pagina control.html che python attraverso Flask sta servendo sulla macchina della vittima [Figura 9]”.
schermo della vittima, sotto forma di screenshot che vengono costantemente renderizzati e può agire utilizzando tastiera e mouse grazie agli eventi che vengono catturati da funzioni JavaScript e passati a Python per essere eseguiti, come se fosse l’utente locale a eseguirli”.
Scopo dell’attacco
I dati rubati includono wallet di criptovalute, cookies e password sui browser, dati Telegram, token di Discord eccetera. I data, zippati, saranno trasmessi attraverso transfer agli attaccanti. Invece un ping all’onion site conferma il completamento della fase di info-stealing.
“Attraverso queste vulnerabilità gli attaccanti possono agire indisturbati e sottrarre alle vittime diverse informazioni, quali ad esempio cookies dei rispettivi browser, password, portafogli di cryptovalute eccetera”, evidenzia Gianmarco Troia, analista di Sicurezza Exprivia.
“Tutti i dati sottratti vengono poi compressi e inviati agli attaccanti con il supplemento di un ping al sito onion per confermare il completamento della fase di furto delle informazioni. Quello che salta all’occhio è la peculiarità di questo remote access trojan, ovvero la possibilità di fornire un feed in tempo reale, con una velocità di un frame al secondo, di cosa la vittima stia digitando sulla macchina o dei movimenti del mouse”.
“Inoltre attraverso l’esecuzione dell’aggiuntivo pacchetto flask, l’attaccante potrà ottenere username e indirizzo IP della vittima, eseguire ulteriori comandi all’interno della shell della macchina infetta, mirare a file specifici, eseguire del codice in Python e scaricare, o lanciare, payload aggiuntivi”, ricorda Gianmarco Troia.
Come proteggersi dai pacchetti PyPi malevoli
La prima forma efficace di difesa consiste nel rispettare le best practice di sicurezza.
“La pratica di rilasciare software malevolo attraverso package è molto diffusa, basti pensare che appena due mesi fa erano stati individuati 29 package malevoli sulla stessa piattaforma di distribuzione pypi.org, è facile quindi ipotizzare che torneremo a parlarne più presto di quanto possiamo immaginare”, conclude Minnella: “Possiamo affermare che questo sia malware atipico, in quanto combina funzionalità di infostealer a quelle di RAT, ovvero non si limita a rubare i dati della vittima ma, installando una C2C, fornisce agli attaccanti il pieno accesso alla macchina vittima”.
Per proteggersi, occorre usare un antivirus scan e, in caso di infezione, eliminare i pacchetti malevoli manualmente e quindi cambiare tutte le password per i siti visitati di frequente.
“Quanto descritto pone attenzione su come le diverse minacce, in particolar modo sulla piattaforma PyPi”, sottolinea Gianmarco Troia, “stiano diventando sempre più all’avanguardia e pericolose. L’informazione su tali vicende rappresenta un prima forma di autodifesa che mira alla sensibilizzazione. Ovviamente tali pacchetti sono stati rimossi dalla piattaforma e gli account che li hanno diffusi sono stati eliminati. Tuttavia questo non fermerà gli attaccanti, i quali potranno reiterare l’operazione attraverso nuovi nomi o pacchetti”.