DLL hijacking

Ultimamente si parla molto di problemi di DLL hijacking (letteralmente: dirottamento delle DLL), sebbene non sia certo un problema nuovo. La fama degli ultimi giorni è causata da uno strumento in grado di analizzare i programmi per scoprire se siano attaccabili attraverso il DLL hijacking. Ma andiamo con ordine per cercare di capire come funzioni il tutto.

Per prima cosa, una DLL (dynamic-link library, libreria a collegamento dinamico) è un file presente negli ambienti Windows che contiene delle funzioni utili a uno o più programmi che vengono caricate in maniera dinamica solamente quando servono al programma stesso. La gestione delle DLL negli ambienti Windows è sempre stata problematica, al punto tale che è stato anche coniato il termine DLL hell per indicare i problemi delle DLL delle prime versioni di Windows.

Da un punto di vista operativo, quando un programma ha bisogno delle funzioni contenute in una DLL, chiede a Windows di caricare la DLL attraverso la funzione LoadLibrary() in cui può specificare solamente il nome della DLL da caricare; in questo caso è compito di Windows andare a cercare la DLL ed è proprio qui che iniziano i problemi.

Windows cerca una DLL in un gruppo di directory ben precise con un ordine definito e interrompe la ricerca quando trova la DLL che sta cercando; le DLL vengono cercate storicamente in:

  1. la directory che contiene il file eseguibile (EXE) dell’applicativo;
  2. la directory corrente;
  3. la directory di sistema, tipicamente c:\windows\system32;
  4. la directory di sistema a 16 bit, tipicamente c:\windows\system;
  5. la directory di Windows, tipicamente c:\windows;
  6. le directory elencate nella variabile di ambiente PATH.

Immaginiamo di sapere che un’applicazione per ascoltare file MP3 è vulnerabile al DLL hijacking (in un altro post vedremo come fare per scoprirlo) e immaginiamo di volerla attaccare sfruttando questa vulnerabilità. Noi sappiamo che la procedura di installazione dell’applicazione copia PIPPO.DLL in c:\windows\system32 perché quella DLL è utilizzata da altri programmi della medesima software house. Tutto quello che dobbiamo fare è creare un file PIPPO.DLL con alcune funzioni modificate ad arte per ottenere i nostri scopi e mettere quel file nella stessa directory in cui metteremo die file MP3 (un disco di rete, una chiavetta USB, un CD-ROM…). A questo punto diciamo alla vittima che utilizza l’applicazione di aprire i file MP3 dalla directory che contiene anche PIPPO.DLL modificato ad arte. L’applicazione caricherà il nostro PIPPO.DLL prima di andarlo a prendere in c:\windows\system32 in quanto lo trova nella directory corrente. Il gioco è fatto.

Microsoft ha risolto questo problema introducendo la chiave di registro HKLM\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode; quando questa chiave assume il valore 1, l’ordine di ricerca diventa:

  1. la directory che contiene il file eseguibile (EXE) dell’applicativo;
  2. la directory di sistema, tipicamente c:\windows\system32;
  3. la directory di sistema a 16 bit, tipicamente c:\windows\system;
  4. la directory di Windows, tipicamente c:\windows;
  5. la directory corrente
  6. le directory elencate nella variabile di ambiente PATH.

SafeDllSearchMode è supportato a partire da Windows 2000 SP4 e Windows XP SP1 e viene messo per default a 1 a partire da Windows XP SP2. Ulteriori informazioni nell’articolo Dynamic-Link Library Search Order.

Dal momento che le funzioni di sistema per gestire le DLL sono molteplici, un’applicazione che non viene scritta secondo le linee guida e che ignora una nota di sicurezza specifica potrebbe essere ancora oggi suscettibile di  DLL hijacking.

Nel prossimo articolo vedremo come scoprire quali siano i programmi vulnerabili a questo tipo di attacco.

Aggiornamento del 10 settembre 2010: è disponibile un video in cui viene mostrata il DLL hijacking in azione, i dettagli in questo articolo.

Autore: Luigi Rosa

Consulente IT, sviluppatore, SysAdmin, cazzaro, e, ovviamente, geek.

Spazio per un commento