Ormai nella cyber security e nella digital forensics, ossia la disciplina che regola le attività di indagine informatica a fini forensi, quindi giudiziari, si affrontano spesso problemi connessi a file illeciti, che vanno dal materiale audio/video ai malware o altre azioni malevole per il sabotaggio, esfiltrazione e spionaggio dei dati: in questi casi, un valido aiuto per l’identificazione dei file sospetti può giungere dal machine learning.
Durante un’analisi di incident response o digital forensics, infatti, si cercano le tracce dei file che hanno causato qualcosa oppure che non dovrebbero risiedere sul computer, perché illegali o dannosi: per far questo serve molto tempo e attenzione, bisogna ricercare nei registri, nelle timeline, a volte anche aprire manualmente i file o eseguirli in sandbox, laddove è possibile, anche se spesso molti malware sono equipaggiati con tecniche di evasion che permettono loro di non farsi identificare nelle virtual machine o nelle sandbox.
Le tecniche più comuni di ricerca sono basate sulla ricerca per keywords e sulla comparazione dei codici hash, ossia si utilizzano dei grandi database contenenti codici hash di file noti e se sul device oggetto d’indagine vi sono file che hanno quei codici allora vengono marcati come sospetti.
Ad esempio, se sul computer è presente un file XYZ.exe col codice hash:
644C8BB3CB5C73A89A128855E58EC32D
e questo codice è presente nel database dei file “cattivi” allora il file XYZ.exe sarà marcato come sospetto, chiaramente quel codice hash potrebbe appartenere ad un malware noto che può assumere vari nomi di file; quindi, solo il nome non sarebbe bastato.
Il database di file noti più famoso è NSRL progetto sostenuto dal Dipartimento per la sicurezza interna degli Stati Uniti, dalle forze dell’ordine federali, statali e locali e dal National Institute of Standards and Technology (NIST): la National Software Reference Library (NSRL) è progettata per raccogliere software da varie fonti e incorporare profili di file calcolati da questo software in un Reference Data Set (RDS).
L’RDS è una raccolta di codici hash di applicazioni software note e tracciabili. Ci sono valori hash dell’applicazione nel set di hash che possono essere considerati dannosi, ad esempio strumenti di steganografia e script di hacking. Non sono presenti valori hash di dati illeciti, ad esempio immagini di abusi sui minori.
Stessa cosa dicasi per la ricerca per keyword, magari un malware noto ha al suo interno la stringa “EVILcorp”, quindi cercando per quella stringa possiamo trovarlo.
Il problema più grosso è quello che spesso i file dannosi sono leggermente diversi tra loro, basta che in una versione del file sia cambiato un bit, che il codice hash cambia; quindi, non fa il match con quello presente nel database.
Per questo motivo, si può pensare a riconoscere la tipologia di file, quindi classificarlo tramite i suoi metadati, ossia quei dati oltre i dati stessi del file, come nome, percorso, dimensione, timestamps, autore, occorrenze e via dicendo.
Algoritmi genetici e machine learning nella digital forensics: applicazioni pratiche
Indice degli argomenti
Il ruolo della digital forensics
La digital forensics comporta una serie di regole per l’acquisizione, preservazione ed analisi dell’evidenza digitale, si deve cercare di alterare il meno possibile il reperto da analizzare effettuandone una copia forense, poi vi è la fase di analisi e ricerca di quello che potrebbe servire all’oggetto d’indagine, tutto questo va fatto in modo tale da essere resistente in Giudizio.
Il ruolo del machine learning
Il machine learning, come sappiamo, è una branca dell’Intelligenza Artificiale: sono algoritmi che permettono al programma di addestrarsi su degli insiemi di dati (dataset), al fine di poter riconoscere, classificare o predire qualcosa.
Il machine learning (ML) può essere supervisionato o non supervisionato, a seconda di come è costruito il dataset.
Un ML supervisionato è composto da una tabella con una serie di valori, in genere numerici, chiamati features ed una label ossia un’etichetta che identifica il record della tabella, ad esempio:
Peso | Altezza | Label |
10 | 5 | X |
2 | 4 | Y |
Il machine learning e la digital forensics
In questo articolo (qui gli altri miei articoli per chi intenda approfondire), ispirato a un paper del 2019 ad opera di Xiaoyu Du e Mark Scanlon, “Methodology for the Automated Metadata-Based Classification of Incriminating Digital Forensic Artefacts”, cercherò di rendere più “tangibile” e visuale il concetto espresso nel paper e nella premessa dell’articolo, ossia quello di classificare/identificare un file dannoso tramite lo studio dei metadati ed artefatti, in modo che anche se un file ha cambiato nome, ha un contenuto leggermente differente da quello già noto e presente nei database, lo possiamo trovare addestrando un machine learning a capire dai metadati se quel file è vicino ai metadati di qualcuno già noto e sospetto.
Insomma, una specie di “profiling” del file, si osservano molti profili, chiaramente non psicologici, ma tecnici e quando ci si trova di fronte a qualcosa di nuovo, ma che ha un “comportamento” e delle caratteristiche simili ai “bad files”, la macchina dovrebbe segnalarlo.
Chiaramente l’esempio ed il codice qui riportato è rudimentale ed a scopo didattico, ma può servire a comprendere meglio lo schema:
I passaggi sono i seguenti:
- estrazione dei metadati dei file dal file immagine (copia forense) di un disco dove si è simulata tanta attività normale e legale, si possono utilizzare vari tools da Plaso a pyTSK;
- si trasformano i metadati in valori numerici e si crea una tabella dove le features sono i metadati e la label è “clean”;
- si aggiunge il dataset dei file cattivi al dataset dei “clean”, la label dei cattivi sarà “suspect”;
- si addestra il modello sul database complessivo;
- si dà in pasto all’algoritmo un dataset estratto da un disco sottoposto ad indagine;
- l’algoritmo effettua la sua predizione/classificazione.
Generazione del dataset
Al fine di questo articolo ho preferito generare un dataset casuale, per evitare tutta la parte di raccolta dei metadati e trasformazione numerica (il file metadata.csv può essere scaricato da qui).
import random import csv header = [‘file_type’, ‘path_depth’, ‘size’, ‘namefile_lenght’,’occurences’] with open(‘metadata.csv’, ‘w’, encoding=’UTF8′, newline=”) as f: writer = csv.writer(f) writer.writerow(header) i=0 s=0 while i<3000: i=i+1 type_f=random.randint(1, 6) depth=random.randint(1,10) size=random.randint(0,10000) lenght_nf= random.randint(1,20) occurences=random.randint(0,200) if ((type_f==2) or (type_f==3) or (type_f==4)) and (depth>3) and (size>1024 and size<8048) and (lenght_nf>2 and lenght_nf<15) and (occurences>10): label=”suspect” s=s+1 else: label=”clean” #print(type_f,”,”,depth,”,”,size,”,”,lenght_nf,”,”,occurences,”,”,label) #print (s) data=[type_f,depth,size,lenght_nf,occurences,label] with open(‘metadata.csv’, ‘a’, encoding=’UTF8′, newline=”) as f: writer = csv.writer(f) writer.writerow(data) random.seed() |
Questo programma in Python genera 3000 records dove le features sono:
[‘file_type’, ‘path_depth’, ‘size’, ‘namefile_lenght’,’occurences’]
Ossia:
- il tipo di file (1 jpg, 2 exe, 3 docx, 4 jpg);
- il path_depth, ossia quante directory sono sotto la principale (es. c:usersxxxfile.exe è due directory sotto);
- la dimensione (size), la lunghezza del nome del file e il numero di volte che appare nel file system (occurences).
Impostando alcuni criteri arbitrari dico che se il file è di tipo 2 o 3 o 4 ed è almeno sotto 3 directory dalla principale e la dimensione è compresa tra 1024 Kb e 8048Kb ed il nome del file è lungo tra i 3 ed i 14 caratteri ed occorre almeno 11 volte, allora sarà marcato come “suspect”, altrimenti è “clean”.
Questo è un sample del dataset:
Machine learning e digital forensics: accendiamo i motori
Di seguito il file in Python, che implementa un machine learning utilizzando kNN (K-Nearest Neighbors) modello di classificatore della libreria SKLEARN.
from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score import pandas as pd from sklearn.neighbors import KNeighborsClassifier # Load dataset url = “metadata.csv” names = [‘file_type’,’path_depth’,’size’,’namefile_lenght’,’occurences’,’label’] dataset = pd.read_csv(url, names=names,header=0) # Split-out validation dataset dataset= pd.DataFrame(dataset) array = dataset.values X = array[:,0:5] y = array[:,5] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) model = KNeighborsClassifier(n_neighbors=3) model.fit(X_train, y_train) pred_train = model.predict(X_train) pred_test = model.predict(X_test) acctest=accuracy_score(y_test,pred_test) acctrain=accuracy_score(y_train,pred_train) valori=[3,6,3131,13,40] prediction = model.predict([valori]) print(“Accuracy Train:”,round(acctrain*100,2),”% Accuracy Test: “,round(acctest*100,2),”%”) print(“Predicted target name: {}”.format(prediction),” n”,names,” n”,valori,” “,prediction) |
Il programma inserisce nella variabile X le features, nella Y le labels, poi esegue il training utilizzando il 30% del dataset per il testing, infine prende dei valori nuovi nella variabile “valori”:
valori=[3,6,3131,13,40]
dove abbiamo file di tipo 3, quindi DOCX, una profondità di directory di 6, una dimensione di 131 Kb, un nome file lungo 13 caratteri ed occorre 40 volte.
Il risultato è:
Accuracy Train: 88.95 % Accuracy Test: 82.67 % Predicted target name: [‘suspect’] [‘file_type’, ‘path_depth’, ‘size’, ‘namefile_lenght’, ‘occurences’, ‘label’] [3, 6, 3131, 13, 40] [‘suspect’] |
Conclusioni
Quanto descritto in questo articolo è un modo per approcciarsi ad un nuovo concetto per il riconoscimento dei file malevoli: sicuramente va implementato in maniera precisa ed affidabile, anche cambiando il classificatore, magari con altri tipi avrebbe dei risultati più precisi, bilanciando bene il dataset tra i “clean” ed i “suspect” e tanto altro ancora.
Lo scopo principale dell’articolo è dare un’ispirazione al possibile matrimonio tra la digital forensics e l’intelligenza artificiale e anche fornire un’idea di quali sono le potenzialità e criticità di queste due discipline molto affascinanti ma anche molto complesse.