Nel precedente articolo abbiamo esaminato come sia possibile modificare il comportamento di un programma caricando una libreria condivisa tramite la variabile d’ambiente LD_PRELOAD. Questo meccanismo, presente nei sistemi Linux e Unix-like, consente di caricare dinamicamente una libreria prima di qualsiasi altra specificata dal programma o dai suoi file di configurazione.

Grazie ad LD_PRELOAD, è possibile sovrascrivere o estendere le funzioni della libreria standard, permettendo così l’inserimento di funzionalità personalizzate o l’alterazione di comportamenti predefiniti.

In questo articolo approfondiamo ulteriormente come individuare l’uso di questo metodo e quali tecniche vengono adottate dai malware per evitare di essere rilevati.

Comandi Utili per Identificare Librerie Sospette

In questo paragrafo verranno illustrati alcuni comandi utili per individuare librerie potenzialmente malevole.

Creazione di una Libreria Condivisa Malevola

Prima di procedere con i test, implementiamo una libreria condivisa, come mostrato in questo articolo.

File: malware.c

Compilazione della libreria:

Caricamento della libreria tramite LD_PRELOAD:

Comandi per il Rilevamento di Librerie Sospette

  1. ldd
    Analizza le dipendenze di un eseguibile e mostra le librerie condivise caricate.

Comando:

Output del comando ldd sull’eseguibile whoami
  1. Lettura del file /proc/[PID]/maps
    Se un programma è in esecuzione, è possibile verificare le librerie effettivamente caricate leggendo il file /proc/<PID>/maps, sostituendo <PID> con l’ID del processo.

Comando:

$$ è una variabile speciale che rappresenta il PID della shell attuale

Output del comando cat /proc/$$/maps | grep malware
  1. Verifica del file /etc/ld.so.preload
    Nei sistemi Linux, il file /etc/ld.so.preload contiene un elenco di librerie condivise che vengono caricate automaticamente da ogni programma eseguito sul sistema. Ha un effetto simile alla variabile d’ambiente LD_PRELOAD, ma opera a livello globale.

In alternativa all’uso di LD_PRELOAD, è possibile aggiungere il percorso di una libreria condivisa in questo file. Tuttavia, questa operazione richiede privilegi di root.

Comando:

Output del comando cat /etc/ld.so.preload
  1. Verifica del contenuto di LD_PRELOAD
    Il primo passo per individuare eventuali librerie sospette è controllare il contenuto della variabile LD_PRELOAD, che potrebbe essere stata utilizzata per caricare librerie malevole.

Comando:

Output del comando printenv LD_PRELOAD

Tuttavia, come già accennato, un malware potrebbe sfruttare il file /etc/ld.so.preload per caricare una libreria malevola. In questo scenario, la variabile LD_PRELOAD potrebbe apparire vuota, pur consentendo comunque l’esecuzione della libreria dannosa a livello di sistema.

  1. Uso di lsof
    Il comando lsof permette di visualizzare i file aperti da un processo, incluse le librerie condivise in uso.

Comando:

Output del comando lsof –p  <PID>

Come nascondere malware.so da: ldd, /etc/ld.so.preload, cat /proc/[PID]/maps, e lsof

In questo paragrafo esploreremo come nascondere una libreria malevola da alcuni dei comandi precedentemente discussi. Immaginiamo di visualizzare i file /proc/[PID]/maps e /etc/ld.so.preload utilizzando il comando cat. Analizzando le funzioni invocate dai tali comandi (tramite objdump), notiamo che i comandi cat, lsof e ldd richiamano la funzione read. Questa funzione è una chiamata di sistema che permette di leggere i dati da un file descriptor. È una delle funzioni fondamentali per la gestione dell’I/O (input/output) nei programmi.

Evidenza dell’utilizzo della funzione read

A questo punto, l’obiettivo è sovrascrivere il comportamento della funzione read. Per raggiungere questo scopo, abbiamo creato il seguente script:

New File: malware.c

Il codice intercetta la chiamata alla funzione read, legge i dati normalmente e poi rimuove eventuali righe contenenti la stringa “malware.so” prima di restituire il risultato.

Occultamento di malware.so riuscito

Sebbene l’occultamento sui file /proc/[PID]/maps e /etc/ld.so.preload funzioni esclusivamente quando vengono aperti con il comando cat, questo scenario evidenzia quanto sia semplice da parte di un malware sovrascrivere il comportamento di una funzione per nascondere tracce di persistenza.

Apertura del file /etc/ld.so.preload con nano

Conclusioni

I test effettuati mostrano come i malware possano sfruttare meccanismi legittimi, come LD_PRELOAD, per iniettare codice malevolo in un sistema Linux, riuscendo a eludere facilmente sia l’utente che gli strumenti di rilevamento. Attraverso il caricamento di librerie condivise, il malware può alterare il comportamento di un programma, aggirando le misure di sicurezza tradizionali. Il problema si complica ulteriormente quando impiegano tecniche di evasione, come la sovrascrittura della funzione read. In questo modo, riescono a occultare le proprie tracce, mettendo in evidenza l’urgenza di adottare soluzioni avanzate per il rilevamento e la protezione contro attacchi di questo tipo.

Ti è piaciuto l’articolo? Seguici su Linkedin per sostenerci!

consigliati