ADS di NTFS: se il file è uno, nessuno o centomila

Così come altre feature che esistono da molti anni e sono poco conosciute, la possibilità di creare dei veri e propri fork o versioni alternative dei nostri file è con noi anche sul filesystem NTFS fin dai tempi di Windows NT 3.1 ed il concetto, sotto altri nomi, è presente in vari sistemi operativi, non ultimi Apple e Solaris. Non è difficile immaginare che, anche in questo caso, ciò possa rappresentare un rischio per la sicurezza e un posto in più in cui possono trovarsi malware di vario genere, ma andiamo per gradi.

Sebbene i concetti siano estremamente simili tra vari filesystem, ci concentreremo, per adesso, sull’implementazione Windows su NTFS, chiamata Alternate Data Streams.

S’immagini di avere un file di testo. Ciò che vedremo aprendolo normalmente sarà ciò che è memorizzato dentro il nostro data stream principale, conosciuto con etichetta “” (una stringa vuota) e il cui attributo principale è $DATA.

Se volessimo, però, fare un piccolo esperimento, ci basterà aprire una shell normale cmd.exe e una PowerShell:

Da shell normale cmd.exe, potremmo creare un file con:

PS C:\Users\mrossi> echo "questo è il contenuto del file che appare normalmente" > file.txt

Verifichiamo l’hash del file:

PS C:\Users\mrossi> Get-Filehash file.txt
 
Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA256          46249647833B53707B527CC90DDFE92AFAFA6BDF4F229987DBD34333E18E731D       C:\Users\mrossi\file.txt
 

Creiamo ora due data stream alternativi con:

PS C:\Users\mrossi> echo "questo è un contenuto nascosto" > file.txt:alternativo1

PS C:\Users\mrossi> echo "questo è un ulteriore contenuto nascosto" > file.txt:alternativo2

Così facendo, il nostro file avrà come contenuto due stringhe diverse a seconda del data stream a cui si accede e, in caso lo si apra normalmente, esso mostrerà il contenuto del data stream di default. Vediamo degli esempi:

Da Powershell, potremo verificare che esistono diversi stream del file appena creato:

PS C:\Users\mrossi> Get-Item -path file.txt -stream *
 
 
PSPath        : Microsoft.PowerShell.Core\FileSystem::C:\Users\mrossi\file.txt::$DATA
PSParentPath  : Microsoft.PowerShell.Core\FileSystem::C:\Users\mrossi
PSChildName   : file.txt::$DATA
PSDrive       : C
PSProvider    : Microsoft.PowerShell.Core\FileSystem
PSIsContainer : False
FileName      : C:\Users\mrossi\file.txt
Stream        : :$DATA
Length        : 21
 
PSPath        : Microsoft.PowerShell.Core\FileSystem::C:\Users\mrossi\file.txt:alternativo1
PSParentPath  : Microsoft.PowerShell.Core\FileSystem::C:\Users\mrossi
PSChildName   : file.txt:alternativo1
PSDrive       : C
PSProvider    : Microsoft.PowerShell.Core\FileSystem
PSIsContainer : False
FileName      : C:\Users\mrossi\file.txt
Stream        : alternativo1
Length        : 39

PSPath        : Microsoft.PowerShell.Core\FileSystem::C:\Users\mrossi\file.txt:alternativo2
PSParentPath  : Microsoft.PowerShell.Core\FileSystem::C:\Users\mrossi
PSChildName   : file.txt:alternativo2
PSDrive       : C
PSProvider    : Microsoft.PowerShell.Core\FileSystem
PSIsContainer : False
FileName      : C:\Users\mrossi\file.txt
Stream        : alternativo2
Length        : 45

E, per vederne il contenuto:

PS C:\Users\mrossi> Get-Content -path file.txt
"questo è il contenuto del file che appare normalmente"

PS C:\Users\mrossi> Get-Content -path file.txt -stream ""
"questo è il contenuto del file che appare normalmente"

PS C:\Users\mrossi> Get-Content -path file.txt -stream alternativo1
"questo è un contenuto nascosto"

PS C:\Users\mrossi> Get-Content -path file.txt -stream alternativo2
"questo è un ulteriore contenuto nascosto"

Come si può notare, lo stream “” fa riferimento a quello di default, che è quello a cui si accede se non ne viene specificato uno in particolare.

Il limite, qui, è in gran parte costituito dalla vostra immaginazione, visto che è possibile creare fino a 256mila stream alternativi per ogni file.

Tutto ciò sembra essere innocuo ma la vostra prospettiva cambierà sicuramente se si aggiunge il fatto che dentro un data stream alternativo può esserci anche del codice eseguibile in più o totalmente diverso da quello del file principale e che l’hash del file non cambia quando si aggiungono data stream o se ne modifica il contenuto.

Potete verificare voi stessi, sempre da Powershell, con:

PS C:\Users\mrossi> Get-Filehash file.txt
 
Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA256          46249647833B53707B527CC90DDFE92AFAFA6BDF4F229987DBD34333E18E731D       C:\Users\mrossi\file.txt
 

L’hash del file, come notiamo, non è cambiato.

I più curiosi potranno continuare a sperimentare, provando ad esempio a includere un file .exe nel nostro file di testo, o a controllare ricorsivamente tutti i data stream dentro una folder, ma veniamo a noi.

Vi starete a questo punto domandando se gli antivirus tengono conto degli ADS e la risposta è, almeno per quelli degni di questo nome, affermativa. Si tratta, del resto, di una feature presente in NTFS da due decenni.

Non mancano, però, esempi anche relativamente recenti di ransomware che ne fa uso e, se l’azienda usa altri tool interni per la sicurezza, deve tenere conto anche degli stream dati alternativi, pena il rischio di lasciarsi sfuggire elementi chiave della catena di cybersecurity, non ultima la possibilità che questo meccanismo venga usato come via d’uscita (data exfiltration).

E’ importante, infatti, ricordarsi che la sicurezza non consiste solo in impedire che qualcosa di malevolo entri e impedisca di fare danni (non tutti gli attacchi sono finalizzati a interferire col normale funzionamento dell’infrastruttura), ma anche che dati riservati riescano a uscire passando del tutto inosservati.

Tags: , ,