Punti chiave
Un rootkit è semplicemente un insieme di strumenti in grado di procurare e mantenere l’accesso privilegiato di root a un sistema operativo. Un rootkit malware di solito trasporta un codice/software dannoso che viene distribuito segretamente nel sistema di destinazione.
Per mantenere l’accesso backdoor per il malware, i rootkit possono sfruttare i processi del sistema in background a vari livelli di privilegi. In un sistema Windows, questo di solito significa attaccare in modalità utente o kernel.
L’importanza di comprendere il vettore di attacco
Contrariamente alla percezione popolare, un rootkit non compromette la sicurezza del sistema da solo. La penetrazione delle difese di un sistema operativo è gestita dal metodo impiegato per infettare il sistema. Ci sono molti modi per farlo oggi:
- Invio di un file infetto / Trojan come allegati di posta elettronica
- Creazione di app malware mascherate da banner / pop-up innocui sui siti Web
- L’uso di attacchi di phishing e altri malware come i keylogger offrono agli attacker l’accesso root, che può quindi essere utilizzato per iniettare il rootkit
Un rootkit inizia il suo lavoro una volta che il vettore ha compromesso con successo il sistema, dandogli la possibilità di entrare in modalità privilegiate di root all’interno del sistema operativo. Una volta ottenuto l’accesso, a seconda del luogo del suo attacco, un rootkit può cambiare il software installato o anche parti del sistema operativo stesso. Ciò può rendere difficile da rilevare un’infezione da rootkit o persino praticamente invisibile.
Comprensione della posizione di un rootkit nel sistema operativo
Windows ha due modalità per l’esecuzione del codice: la modalità utente e la modalità kernel. Di questi, la modalità kernel è la più importante, in quanto funge da collegamento diretto tra il codice hardware e software. Questa è la modalità con privilegi più alti , o “root” in un sistema Windows.
Ma non tutti i programmi e i processi richiedono l’accesso all’intera gamma di potenza di elaborazione e hardware di sistema. Queste funzioni di livello inferiore sono gestite in una modalità con privilegi inferiori: la modalità utente.
In modalità kernel, il sistema operativo esegue i codici direttamente per eseguire tutte le attività di alto livello di gestione del sistema. Al contrario, la modalità utente utilizza un’API (Application Programming Interface) per eseguire indirettamente i codici. Durante il normale funzionamento del sistema, l’API esegue chiamate di funzione al kernel e riceve informazioni in cambio.
Un rootkit di solito dirotta queste chiamate di funzione, sia in modalità utente che in modalità kernel, a seconda del suo design.
Rootkit in modalità utente e iniezione DLL
In Windows, l’aggancio delle API è una tecnica comunemente utilizzata per modificare o cambiare il flusso delle chiamate API. Un rootkit in modalità utente sfrutta questa tecnica per iniettare codice dannoso nella memoria di un programma rimanendo nascosto.
Perché questo funzioni, il rootkit deve inserire il suo codice in un processo comunemente usato. In Windows, le librerie Dynamic Link (DLL) sono perfette per questo, poiché sono chiamate da molti programmi diversi installati nel sistema operativo.
L’iniezione DLL è il metodo utilizzato dall’utente rootkit (hacker) per inserire codice dannoso in vari programmi che eseguono chiamate API nel sistema operativo. Esistono diversi modi per raggiungere questo obiettivo:
- Modifica dei valori di registro per aggiungere una nuova DLL dannosa al sistema Windows
- Utilizzo dell’aggancio globale in Windows per influire su tutte le chiamate API del programma
- Creando un thread remoto per il processo di destinazione per aggiungere ad esso DLL infetta
Aggancio IAT contro aggancio in linea
Il principale punto debole di un rootkit a livello di utente è che manca l’accesso diretto al kernel del sistema operativo. Quindi usano API che aggancia un exploit. Ci sono due diverse tecniche spesso utilizzate qui: l’aggancio IAT e l’aggancio in linea.
In Windows, una IAT (Import Address Table) viene utilizzata per semplificare l’accesso alle DLL con i loro indirizzi di funzioni variabili. Lo IAT ospita i puntatori a funzione delle DLL quando vengono caricati dal caricatore di Windows durante una chiamata API.
Utilizzando l’aggancio IAT, un rootkit può apportare modifiche all’elenco delle chiamate delle funzioni DLL, sostituendo le funzioni esistenti con il proprio indirizzo. Quando un’applicazione effettua una chiamata API per quella funzione, il codice rootkit viene caricato invece nello spazio di memoria del programma vittima.
Al contrario, l’aggancio in linea modifica direttamente i codici funzione di programmi specifici. Questo è un approccio più mirato e ristretto rispetto all’aggancio IAT. Ma come l’aggancio IAT, l’obiettivo qui è quello di far caricare le chiamate API del programma dal codice dannoso dall’indirizzo rootkit.
Rootkit in modalità kernel e tecniche di aggancio
L’uso dell’iniezione DLL rende relativamente più facile rilevare un’infezione da rootkit in modalità utente. Ma i rootkit in modalità kernel sono del tutto diversi. Si trova allo stesso livello della maggior parte dei software di rilevamento malware e può eludere il rilevamento alterando parti del codice del kernel stesso.
Un rootkit in modalità kernel può apportare modifiche al sistema usando diverse tecniche di aggancio. Questi includono:
Aggancio SSDT
In Windows, le chiamate di sistema al kernel sono gestite secondo la tabella di invio del servizio di sistema o SSDT. Questa tabella contiene gli indirizzi di memoria importanti delle funzioni principali chiamate. Se un rootkit ottiene l’accesso al kernel, può apportare modifiche all’SSDT, con risultati simili a quelli dell’aggancio IAT.
Aggancio IDT
La modalità kernel di Windows contiene anche una tabella descrittore di interrupt (IDT) per gestire eventuali interruzioni causate da un software o hardware. Un semplice esempio potrebbe essere un interrupt di processo causato dalla tastiera. Un rootkit può utilizzare l’hook IDT per raccogliere informazioni importanti, compresi i dati della tastiera.
Aggancio della funzione in linea
I rootkit del kernel possono anche usare hook non correlati alle tabelle di sistema. Nell’aggancio in linea, il codice dannoso attacca parti specifiche di una funzione di destinazione nel kernel, costringendolo a passare a un’area specifica nella memoria di sistema contenente il codice rootkit.
Key takeaway
- I rootkit usano molti diversi vettori e tecniche di attacco per compromettere la sicurezza di un sistema e infettarlo
- I rootkit funzionano dirottando o collegando le chiamate di funzione API in un sistema operativo
- In Windows, possono farlo a Ring-3 (livello utente) e Ring-0 (livello kernel)
- I rootkit a livello di utente spesso usano l’iniezione DLL per aggiungere codice dannoso alle applicazioni
- A livello di kernel, abusano delle chiamate di funzione SSDT e IDT per apportare modifiche
Meccanismi di rilevazione
Il rilevamento di rootkit è considerato un problema complicato nella sicurezza dei computer, ma dipende anche dal livello di programmazione in ciascun caso particolare. Come in altri meccanismi di rilevamento del malware, vengono utilizzate tecniche basate su firma e comportamento. Altre tecniche utilizzate per il rilevamento dei rootkit sono l’analisi basata sulla diff e i controlli di integrità. Non esiste un’unica applicazione in grado di rilevare e rimuovere tutti i tipi di rootkit in quanto l’area in cui potrebbero risiedere potrebbe essere completamente diversa, software o hardware. Nella maggior parte dei casi, un rootkit può essere rimosso solo ricostruendo il sistema compromesso.
• Basato su firma
Questa è la tecnica più comune per il rilevamento di malware. Tuttavia, è il meno efficiente in quanto è efficace solo per rootkit già rilevati e diffusi. Le firme dei rootkit noti vengono utilizzate per rilevare se ne esiste una su un sistema.
• Basato sul comportamento
Questi rilevatori identificano un comportamento anomalo su un sistema informatico basato su euristica e schemi comportamentali. Questi schemi sono derivati da alcune attività che si trovano tipicamente nei rootkit. Il vantaggio della tecnica basata sul comportamento rispetto alla precedente è che può rilevare rootkit precedentemente sconosciuti.
• Visualizzazione basata su diff / croce
L’approccio Diff-Based o Cross view viene utilizzato principalmente per rilevare rootkit in modalità kernel confrontando due diverse visualizzazioni del sistema per le stesse informazioni attraversando le strutture di dati. In questo caso, il rilevatore di rootkit otterrà una vista del sistema e una vista ottenuta dalle utilità di sistema e quindi li confronterà. Una differenza nei risultati restituiti dai due approcci segnala la presenza di un rootkit.
• Verifica dell’integrità
I controlli di integrità possono essere eseguiti in un sistema per verificare l’alterazione del codice non autorizzata nei file di sistema. Innanzitutto, è necessario eseguire una funzione unidirezionale per calcolare un hash per ogni file di sistema quando il sistema è ancora pulito e quindi utilizzarlo come base. Quando sorge la necessità, viene eseguito un confronto hash tra gli hash di base e gli hash della versione corrente.