oxiddd - Forensic Disk Imager en Rust
oxiddd : Acquisition Forensic et Sécurité Mémoire
Introduction
Dans le cadre d’un cours de Forensics que j’ai eu l’idée de développé oxiddd, un outil d’imagerie disque conçu en Rust. Ce projet est né de la volonté d’explorer comment un langage moderne peut améliorer les outils traditionnels de l’investigation numérique (DFIR) comme dd ou dc3dd, en apportant à la fois une sécurité mémoire native et des optimisations pour les supports de stockage récents (NVMe).
L’objectif principal était de garantir une chaîne de possession rigoureuse tout en maximisant la vitesse de transfert des données.
Pourquoi Rust pour le Forensic ?
Le choix de Rust s’est imposé pour plusieurs raisons techniques essentielles au bas niveau :
- Sécurité Mémoire : Élimination des erreurs de segmentation et des fuites de mémoire, critiques lors de la manipulation de preuves judiciaires.
- Performance brute : Capacité à gérer des entrées/sorties (I/O) asynchrones sans le surcoût d’un garbage collector.
- Écosystème moderne : Facilitation de la gestion des dépendances pour la cryptographie et les protocoles réseau.
Architecture Technique
Pour saturer la bande passante du matériel sans saturer le processeur, le projet repose sur une architecture multi-threadée.
Points clés de l’implémentation :
- Pipeline de données : Utilisation de canaux (
crossbeam-channel) pour séparer les tâches de lecture (Reader), d’écriture (Writer) et de calcul d’empreinte (Hasher). - I/O Directes (O_DIRECT) : Interaction directe avec le contrôleur disque pour contourner le cache du noyau et éviter les copies inutiles en RAM.
- Gestion de la mémoire : Utilisation de buffers alignés (4096 octets) et de pointeurs atomiques (
Arc) pour un partage efficace des données entre les threads (Zero-copy).
Innovation : Le “Binding Hash”
La particularité d’oxiddd réside dans sa méthode de scellé numérique. Plutôt que de simplement calculer une empreinte classique, j’ai implémenté un algorithme qui lie mathématiquement trois éléments pour renforcer l’intégrité de la preuve :
- Le contenu binaire du disque source.
- Le nom du fichier cible (pour détecter les renommages accidentels ou malveillants).
- Un horodatage certifié récupéré via le protocole NTP (Google NTP), indépendant de l’heure du système local qui pourrait être altérée.
Ce mécanisme permet de s’assurer que l’image disque n’a pas été modifiée, renommée ou antidatée après son acquisition.
Résilience et Portabilité
Gestion des erreurs
Lorsqu’un secteur est illisible (bad blocks), oxiddd injecte automatiquement des blocs de zéros (0x00). Cela permet de conserver l’alignement des données et garantit que l’image reste compatible avec les logiciels d’analyse standard comme Autopsy ou EnCase.
Compilation Statique
Grâce à la compilation via musl, l’outil peut être généré sous forme de binaire statique. Il est alors utilisable sur n’importe quel système Linux sans installation préalable, ce qui est indispensable lors d’une intervention sur une machine compromise.
Guide d’Utilisation
Installation via Cargo
cargo install oxiddd |
Exemple d’Acquisition
# Acquisition avec hachage SHA-256 certifié par NTP |
Compatibilité (Syntaxe classique)
sudo ./oxiddd if=/dev/sdb of=image.dd hash=sha512 bs=8M |
Conclusion
Le développement d’oxiddd a été une étape majeure dans ma compréhension de la programmation système et des enjeux de l’investigation numérique. Il démontre que les langages de nouvelle génération ont une place de choix dans l’arsenal des outils de cybersécurité.
Compétences consolidées :
- Programmation système : Direct I/O, gestion de l’alignement mémoire et des syscalls Linux.
- Concurrence : Programmation multi-threadée et synchronisation asynchrone en Rust.
- Cryptographie appliquée : Implémentation de mécanismes de signature et d’intégrité.
- Standards DFIR : Compréhension des exigences judiciaires pour l’acquisition de preuves.
Liens du Projet
- Code Source : GitHub - oxiddd
- Portfolio : Retour à l’accueil
Allen Jolan





