
Détection des activités de dissimulation de fichiers par rootkits via l'analyse des décalages dans les temps d'exécution des fonctions du noyau.
Ce dépôt contient du code pour collecter des mesures de temps des fonctions du noyau qui sont manipulées par les rootkits lorsqu'ils masquent des fichiers, ainsi qu'une méthode de détection semi-supervisée qui analyse les décalages des temps d'exécution des fonctions du noyau. Cette implémentation repose sur le rootkit open source CARAXES, qui enveloppe la fonction filldir pour manipuler les résultats des énumérations de fichiers, par exemple lors de l'exécution de la commande ls. Les mesures de temps sont effectuées sur plusieurs fonctions de l'appel système getdents (y compris filldir) à l'aide de sondes eBPF. Pour la détection, nous appliquons un modèle d'apprentissage automatique simple basé sur des tests statistiques. Nous renvoyons à la publication suivante pour des explications détaillées sur la collecte de données et les mécanismes de détection d'anomalies. Si vous utilisez l'une des ressources fournies dans ce dépôt, veuillez citer la publication suivante :
Les étapes suivantes configurent le rootkit et expliquent comment collecter des mesures de temps à partir des fonctions du noyau. Si vous n'êtes intéressé que par la détection d'anomalies et que vous souhaitez utiliser nos ensembles de données publics, vous pouvez ignorer cette section.
Le rootkit et le mécanisme de sondage ont été testés sur les noyaux Linux 5.15-6.11 et Python 3.10. Pour exécuter les outils, téléchargez ce dépôt et installez les dépendances suivantes requises pour exécuter le rootkit et le mécanisme de sondage.
ubuntu@ubuntu:~$ git clone https://github.com/ait-aecid/rootkit-detection-ebpf-time-trace.git
ubuntu@ubuntu:~$ cd rootkit-detection-ebpf-time-trace
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ sudo apt update
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ sudo apt install python3-bpfcc make gcc flex bison python3-pip linux-headers-$(uname -r)
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ pip install -r requirements.txt
Certains scénarios nécessitent des ressources supplémentaires. Plus précisément, le scénario ls-basic nécessite de compiler le script ls-basic et le scénario system load nécessite d'installer stress-ng. Si vous ne souhaitez pas utiliser ces scénarios, vous pouvez ignorer les dépendances suivantes.
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ gcc -o ls-basic ls-basic.c
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ sudo apt install stress-ng
Les commandes suivantes sont obligatoires, car le rootkit manipule l'appel système getdents par défaut ; toutefois, seule la manipulation de filldir est actuellement prise en charge pour le sondage. Téléchargez le rootkit, remplacez hooks.h par le fichier fourni dans ce dépôt (cela garantit que filldir est interceptée plutôt que getdents), puis compilez le rootkit.
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ cd ..
ubuntu@ubuntu:~$ git clone https://github.com/ait-aecid/caraxes.git
ubuntu@ubuntu:~$ cd caraxes/
ubuntu@ubuntu:~/caraxes$ cp ../rootkit-detection-ebpf-time-trace/hooks.h .
ubuntu@ubuntu:~/caraxes$ sudo make
Si vous rencontrez des difficultés pour installer le rootkit ou si vous souhaitez tester son bon fonctionnement, consultez le ReadMe sur la page GitHub CARAXES.
Ensuite, revenez à ce dépôt et ouvrez linux.py pour modifier la variable KERNEL_OBJECT_PATH afin qu'elle pointe vers le dossier caraxes que vous venez de cloner ; le chemin par défaut est "/home/ubuntu/caraxes/".
ubuntu@ubuntu:~/caraxes$ cd ../rootkit-detection-ebpf-time-trace
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ vim linux.py
Vous êtes maintenant prêt à exécuter le mécanisme de sondage qui injectera automatiquement des sondes dans le noyau, démarrera le rootkit, stockera les mesures de temps dans un fichier, puis arrêtera le rootkit. Pour déclencher les appels système, le script crée un répertoire contenant des fichiers à masquer et exécute ls 100 fois (modifiable avec l'option -i) tout en interrogeant les sondes. Le script permet de collecter des mesures avec le rootkit (option --rootkit), sans le rootkit (option --normal), ou les deux, et prend en charge plusieurs scénarios. Exécutez le scénario par défaut avec la commande suivante :
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ sudo python3 probing.py --normal --rootkit
compiling eBPF probes...
probes compiled!
attached bpf probes:
iterate_dir-enter
iterate_dir-return
dcache_readdir-enter
dcache_readdir-return
filldir64-enter
filldir64-return
verify_dirent_name-enter
verify_dirent_name-return
touch_atime-enter
touch_atime-return
Running experiment with ls for 100 times.
Iteration 0...
detection_PID: 70133
Iteration 1...
detection_PID: 70134
...
Iteration 99...
detection_PID: 70338
polled 40 times!
done with the "rootkit version"
Experiment finished, saving output.
Saved data to events/events_2025-01-17T09:59:52.183801_rootkit.json.gz
412K events/events_2025-01-17T09:59:52.183801_rootkit.json.gz
Les mesures sont stockées dans le répertoire events. Consultez la page d'aide avec python3 probing.py -h pour en savoir plus sur les autres paramètres permettant de configurer la collecte de données dans d'autres scénarios (par exemple, utiliser ls-basic au lieu de ls ou simuler une charge système) et d'attribuer des noms aux différentes exécutions (--description). Consultez repeat_seq.sh pour quelques commandes paramétrées ; en fait, nous avons utilisé ce script pour collecter nos ensembles de données publics. Notez que nous ne considérons que certaines fonctions du noyau disponibles dans l'appel système getdents. Pour spécifier les fonctions auxquelles le mécanisme de sondage doit attacher des sondes, ouvrez probing.py et ajoutez ou supprimez des noms de fonctions dans la liste probe_points au début du fichier.
L'exécution de l'algorithme de détection d'anomalies nécessite uniquement d'installer les dépendances Python. Si vous ne l'avez pas déjà fait à l'étape précédente, exécutez la commande suivante pour installer les dépendances avec pip.
ubuntu@ubuntu:~$ git clone https://github.com/ait-aecid/rootkit-detection-ebpf-time-trace.git
ubuntu@ubuntu:~$ cd rootkit-detection-ebpf-time-trace
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ pip install -r requirements.txt
Ensuite, téléchargez et extrayez l'ensemble de données que nous fournissons sur Zenodo. Si vous avez généré vos propres données à l'étape précédente et souhaitez les utiliser, ignorez cette étape.
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ wget https://zenodo.org/records/14679675/files/events.zip
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ unzip events.zip
Vous êtes maintenant prêt à exécuter la détection d'anomalies comme suit. Spécifiez le répertoire contenant les données de mesure (-d), la fraction de données normales utilisées pour l'entraînement (-t), le mode de fonctionnement (-m) et la fonction de regroupement (-g). Le script chargera tous les fichiers du répertoire spécifié, les répartira en données d'entraînement et de test (résumé dans la sortie), calculera et affichera les métriques de détection, et tracera une matrice de confusion.
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ python3 evaluate.py -d events -t 0.333 -m offline -g fun
100%|█████████████████████████████████████████████| 1250/1250 [02:47<00:00, 7.45it/s]
Processed all files from events
Normal batches: 750
Normal batches for training: 250
default: 50
file_count: 50
system_load: 50
ls_basic: 50
filename_length: 50
Normal batches for testing: 500
default: 100
file_count: 100
system_load: 100
ls_basic: 100
filename_length: 100
Anomalous batches: 500
default: 100
file_count: 100
system_load: 100
ls_basic: 100
filename_length: 100
Results (Run 1)
Threshold=3.5111917342151415e-16
Time=0.0027740001678466797
TP=499
FP=9
TN=491
FN=1
TPR=R=0.998
FPR=0.018
TNR=0.982
P=0.9822834645669292
F1=0.9900793650793651
ACC=0.99
MCC=0.9801254640896192
Confusion Matrix (Run 1)
Predicted
default file_count system_load ls_basic filename_length
Pos Neg Pos Neg Pos Neg Pos Neg Pos Neg
100 0 100 0 100 0 100 0 100 0 Pos - Actual default
3 97 100 0 99 1 100 0 2 98 Neg - Actual default
100 0 100 0 100 0 100 0 100 0 Pos - Actual file_count
100 0 0 100 100 0 100 0 100 0 Neg - Actual file_count
100 0 100 0 100 0 100 0 100 0 Pos - Actual system_load
100 0 100 0 4 96 100 0 100 0 Neg - Actual system_load
100 0 100 0 100 0 99 1 100 0 Pos - Actual ls_basic
100 0 100 0 100 0 2 98 100 0 Neg - Actual ls_basic
99 1 100 0 100 0 100 0 100 0 Pos - Actual filename_length
3 97 100 0 99 1 100 0 0 100 Neg - Actual filename_length
Consultez le manuel avec python3 evaluate.py -h pour en savoir plus sur les paramètres disponibles de ce script. Jetez également un œil à demo.sh pour voir les commandes paramétrées que nous avons utilisées pour l'évaluation dans notre article.
Si vous utilisez l'une des ressources fournies dans ce dépôt, veuillez citer la publication suivante :