Utilitaire de sanitization des disques durs/fichiers (suppression de données confidentielles)

Description

Salut,

Voici un code VB.Net pour effectuer la sanitization de disques dur et/ou fichiers.

/!\ ATTENTION /!\
La sanitization d'un disque/fichier supprime irrémédiablement toutes les données. Ceci étant irréversible, faites attention en utilisant ce code. Je ne suis responsable de rien, cf. le disclaimer de la licence.
/!\ FIN ATTENTION /!\

Note aux admins : ce serait surement bien de mettre un warning ("code louche") ?

0) A quoi çà sert ?
Ce programme a pour but d'effectuer une "sanitization" d'un disque dur, lecteur logique ou d'un ensemble de fichiers.

1) Qu'est ce qu'une sanitization ?
Une sanitization est une suppression définitive des données. On l'utilise pour effacer les données sensibles d'un disque dur.

2) Pourquoi effectuer une sanitization ?
En effet, un fichier supprimé sur un PC avec Windows n'est PAS physiquement supprimé. Même s'il apparait irrécupérable après le vidage de la corbeille, il est en réalité toujours présent, seule l'entrée dans la MFT pointant vers le fichier a été supprimée...
Le fichier est de fait non récupérable uniquement quand un autre fichier est écrit à l'emplacement du premier fichier. Le premier fichier écrasé est donc irrécupérable... pour le commun des mortels. En laboratoire, il est toujours possible de récupérer des données écrasée sur un disque dur magnétique à cause d'un phénomène physique appelé hystérésis.
L'écrasement d'une donnée sur un disque dur magnétique laisse en effet des informations résiduelles sur ce qu'il y avait avant écrasement. Ceci est exploitable en laboratoire.

D'où l'intérêt d'un tel programme qui permet l'effacement définitif des données.

3) Comment sanitizer ?
La sanitization est une méthode décrite dans le standard du département de la défense américaine DoD 5220.22-M.
Dans le cas de ce programme, voici le fonctionnement, en 3 étapes :
- écriture sur le disque de valeurs 0x55 (01010101 en binaire)
- écriture sur le disque de valeurs 0xAA (10101010 en binaire, le complément de 0x55)
- écriture sur le disque d'une valeur aléatoire.

L'écriture successive de 3 informations sur chacun des octets disponibles sur le disque dur permet de s'assurer d'une suppression complète des données.

4) Est-ce efficace ?
Oui... enfin, pas totalement. En labo, il est toujours possible de récupérer des données, même après plusieurs écritures. Il conviendra donc d'effectuer plusieurs passes de sanitization sur le même disque/fichier afin de garantir un niveau de sécurité maximal.
Pour information, le document du DoD prévoit d'autres méthodes pour supprimer des données confidentielles d'un disque dur : utilisation d'un degausser (qui va démagnétiser entièrement le disque dur), ou bien pour une destruction physique : désintégration/pulvérisation/incinération du disque :-)

5) Comment marche le code ?
Et bien c'est extrêmement simple : il suffit d'obtenir un handle sur le fichier à sanitizer (je rappelle qu'un disque dur physique, un lecteur logique et un fichier texte sont tous les 3 des "fichiers" aux yeux de Windows) via la primitive CreateFile, puis d'écrire via la primitive WriteFile les données qui vont bien.
L'argument "fileName" pour CreateFile doit être
- pour un fichier de type texte par exemple : "c:\le_path\le_fichier.txt"
- pour un disque logique : "\\.\C:" (pour le lecteur C par exemple)
- pour un disque physique : "\\.\PHYSICALDRIVE0" (pour le disque dur 0 par exemple)

6) Quelques informations supplémentaires

- l'écriture sur un disque dur doit se faire avec une taille à écrire qui est un multiple de la taille d'un secteur physique sur le disque. Si vos secteurs ont une taille de 512 octets par exemple, on ne peut écrire que 512, 1024...etc. octets, il est par exemple impossible d'écrire juste un seul octet.

- WriteFile fonctionne sans problèmes pour un disque dur sous Windows XP... mais j'ai découvert que depuis Windows Vista, des modifications majeures ont été apportées (en plus de la nécessité d'avoir son programme élevé pour toucher aux disques durs)...
En effet :
a) pour un disque logique :
Une écriture ne fonctionne QUE si le disque ne possède pas de système de fichier monté, ou bien si l'une des conditions suivantes est vraie :
- les secteurs à écrire sont les secteurs de boot
- les secteurs à écrire sont hors de l'espace du système de fichier
- le disque logique à été lockée via FSCTL_LOCK_VOLUME
- le disque logique a un système de fichier de type RAW monté (c'est à dire pas de filesystem en fait).
b) pour un disque physique :
Une écriture ne fonctionne QUE si l'une des conditions suivantes est vraie :
- les secteurs à écrire ne tombent pas dans un des extents des disque logiques montés sur le disque physique
- les secteurs à écrire tombent dans les données d'un disque logique monté, mais celui-ci est locké via FSCTL_LOCK_VOLUME
- les secteurs à écrire tombent dans les données d'un disque logique sans système de fichier (c'est à dire de type RAW)

Que conclure ? Que l'écriture sur un disque n'est possible que si les volumes associés sont lockés. Il n'est possible de locker un disque logique que dans le cas où aucun fichier de ce disque n'est ouvert par un autre programme... Cà fait un sacré requirement en plus pour le fonctionnement du programme.... -___- D'autant que pour locker un drive :"If the specified volume is a system volume or contains a page file, the operation fails" -> impossible de locker un volume système (celui de Windows) ou bien un volume avec un fichier de pagination !! Normal en fait, vu qu'il est obligatoire d'avoir un handle ouvert sur le fichier de pagination, et il est normal qu'au moins un des process Windos ouvre au moins un handle sur le volume système...
Mais j'ai trouvé un moyen détourné pour sanitizer un disque logique sans le locker :-) Pour FAT32 en tout cas (pas testé NTFS).
- sanitizer le disque sans lock : ceci échouera... SAUF pour les premiers secteurs (cf. conditions ci-dessus). Et une fois les premiers secteurs détruits, ben il n'y a plus de système de fichier... ^^
- sanitizer une seconde fois sans lock : ceci fonctionnera... car il n'y a plus de système de fichier monté (type RAW) vu qu'il a été détruit lors du premier essai sans lock ^^
Et voilà !

7) Quelques notes sur le code :

a) ceci est la conversion en .Net de mon précédent code : http://www.vbfrance.com/codes/UTILITAIRE-SANITIZATION-DISQUES-FICHIERS-SUPPRESSION-IRREMEDIABLE-DONNEES-CONFIDENTIELLES_42284.aspx
Ce nouveau code est de meilleure qualité et doit être utilisé, plutôt que l'ancien.

b) ce code utilise une dll compilée depuis du code ASM. Le code avait été écrit par Brunews (merci à lui). Cette dll sert a générer aléatoirement des données dans un espace mémoire. Je l'ai utilisée vu que c'est très très largement plus rapide qu'en VB avec des Random().

c) ce code fonctionne sur XP, Vista, Seven, mais sur Vista/Seven, faut le démarrer en mode élevé (cliquez sur le shield !). Et il faut locker les drives avant sanitization (cf. remarque au dessus).

d) ce code ne fonctionnera pas sur un OS 64-bit. Le .Net managé sera OK, le non managé aussi (j'ai fait gaffe, tous les P/Invoke sont OK pour du 64-bit), mais la dll elle n'est pas prévue pour du 64-bit...

e) sous licence Creative Commons. Cf. le header des fichiers.

8) Quelques liens très intéressants (en anglais pour la plupart) :
- http://msdn.microsoft.com/fr-fr/library/aa365747(VS.85).aspx (intéressant pour les limitations de WriteFile sur Vista+)
- http://en.wikipedia.org/wiki/Data_remanence
- http://en.wikipedia.org/wiki/Sanitization_(classified_information)
- http://en.wikipedia.org/wiki/Hysteresis
- http://www.celog.fr/sommaire.php3?page=suppression
- http://en.wikipedia.org/wiki/National_Industrial_Security_Program
- http://en.wikipedia.org/wiki/Degaussing
- http://msdn.microsoft.com/fr-fr/library/aa364575(v=VS.85).aspx (pour le lock des volumes)

@+

Source / Exemple :


' Dans le zip

Conclusion :


Cf. les remarques dans la description du code.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.