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

Soyez le premier à donner votre avis sur cette source.

Vue 7 994 fois - Téléchargée 721 fois

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

Ajouter un commentaire

Commentaires

Messages postés
5
Date d'inscription
mardi 1 février 2011
Statut
Membre
Dernière intervention
19 avril 2011

Très belle source et bien documentée. Finalement l'intégralité du code fonctionne sous un système 64 bits?
Messages postés
319
Date d'inscription
jeudi 1 avril 2010
Statut
Membre
Dernière intervention
16 mars 2011
1
Salut, merci pour ta source.
J'aurais besoin de savoir si on peut sataniser le disque C:\ ?
Merci
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Salut à tous,

BruNews --> merci beaucoup pour le zip ! Je l'ai téléchargé et j'intégrerai dès que je trouverai un peu de temps (ce Week End normalement).

Galain --> Merci pour le retour sur NTFS !
Pour ce qui est de la passe "random", c'est effectivement à cause de l'OS 64-bit que cela ne fonctionne pas, vu que l'appel à la dll de Brunews retourne une adresse mémoire de taille 4 octets sur tous les OS (vu que le 64-bit n'est pas pris en compte). Donc adresse mémoire invalide sur OS 64-bit (qui attend 8 octets) = erreur lors de l'écriture.
Pour l'effacement du fichier, il faudrait effectivement l'implémenter afin d'enlever toute trace du fichier. Je l'ai pas fait simplement pour pouvoir effectuer mes tests plus simplement (sans avoir à recréer N fois mon fichier ^^). La trace dans la MFT est problématique en effet. Il faudrait éventuellement renommer le fichier avant suppression.

gillardg --> Effectivement, en 1 passe de 3 trois écritures (ou bien 3 passes en fonction de la terminologie ?) ce n'est pas suffisant. Du coup quand je mettrai à jour le code, j'ajouterai une option pour pouvoir choisir ses passes. Cà permettra de configurer le nombre, l'ordre, mais aussi la valeur à écrire (si d'aventure 0x55 et 0xAA n'étaient pas souhaités). J'essayerai de pondre quelque chose "d'un peu ouvert" au niveau de l'architecture du code, de sorte qu'il soit possible d'ajouter très facilement de nouveaux types de passes en implémentant un quelconque algorithme autre que valeur constante ou random...

Au passage j'ai pensé à un truc en lisant le commentaire de Brunews : de mémoire j'ai mal codé le calcul de la taille du buffer pour l'écriture Random(). Il se pourrait que j'ai mis une valeur en dur qui ne fonctionne pas au top avec des disques dont la taille des secteurs n'est pas 512... J'ai pas vérifié, c'est de mémoire, je regarderai en détail ce WE si je trouve le temps !

@+
Messages postés
1263
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
Salut Violent_Ken
Ton code fonctionne correctement pour des fichiers dans une partitions NTFS : l'idéal ensuite est d'effacer purement et simplement le fichier. Il convient d'ajouter que le nom du fichier est toujours visible dans l'enregistrement NTFS associé à ce fichier sauf si cet enregistrement est réutilisé par le système ou l'utilisateur pour un autre fichier à créer. Cependant NTFS ne se soucie guère de ces enregistrements effacés et en crée des nouveaux pour ses besoins propres. Ce qui veut dire que l'on n'a plus le contenu du fichier mais on a encore son nom ce qui peut renseigner sur le contenu qu'il avait auparavant.
Je pense qu'en FAT on a la même configuration pour retrouver le nom du fichier dans le répertoire : seule la première lettre est modifiée par le caractère & ( ce caractère est le caractère d'effacement sur une entrée 32 bits de répertoire en FAT)
Mes essais sur une partition à "sanitiser" ont été faits en lockant la partition ( c'était une partition non système classique en NTFS avec une centaine de fichiers ). J'ai retrouvé une partition RAW sans aucun système de fichiers.
Evidemment étant moi-même en 64 bits la passe aléatoire me causait une erreur et je l'ai supprimé pour les tests précédents
voici ci-dessus les résultats de mes tests en NTFS de ton superbe projet
Bravo
Messages postés
3275
Date d'inscription
jeudi 3 avril 2008
Statut
Membre
Dernière intervention
14 septembre 2014
3
hello ,
la NSA préconise un minimum de 5 passes pour chaque octet à "sanitizer"
il y a un vieil utilitaire (!norton(?)) qui le fait en 7 passes
Afficher les 8 commentaires

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.