ARTICLES
Récupérez vos fichiers supprimés avec foremost
By Valentin Bremond
Comment ça “récupérer des fichiers supprimés” ?
Vous allez me dire “ben enfin ! Si j’ai supprimé mes fichiers, alors ils ont disparu !”.
Ben oui. Mais non.
En réalité, quand vous supprimez un fichier sur un support de stockage (clé USB, disque dur, SSD, carte SD, … - qu’on appelera “disque” dans la suite de l’article), vous ne supprimez pas réellement le fichier, vous supprimez simplement la référence aux données.
Pour faire simple, comparons un disque avec un livre.
Tout est question de sommaire
Imaginez que vous ayiez un livre de maths (un gros livre, avec énormément de notions et de chapitres). Mettons que vous vouliez apprendre les intégrales. Comment faites-vous pour aller lire le chapitre sur les intégrales ? Plusieurs options :
- lire chaque page une par une en partant de la première jusqu’à tomber sur celle qui parle des intégrales
- vous l’avez déjà lu hier, vous vous souvenez où il est, vous y allez directement
- vous ouvrez la première page qui contient le sommaire : il vous indique à quelle page vous rendre
On est d’accord pour dire que la solution 1 est relativement faisable pour un tout petit ouvrage mais devient très rapidement beaucoup trop longue avec des livres plus gros (notez que ce n’est pas impossible, juste très long). La solution 2 ne marche bien évidemment que si vous avez déjà lu le livre ; la solution 3 est donc la bonne. Si vous voulez trouver rapidement une information dans un livre, vous avez besoin d’un sommaire.
Eh bien c’est pareil avec les disques : lorsque vous installez un système de fichier sur votre disque (= vous formatez votre disque), il va créer une “table des matières” (ou index) qui sera petite, rapide à lire et qui permettra de savoir où se trouvent les données sur le disque. Quand vous aurez besoin d’ouvrir la photo de tonton Michel à la plage, cet index vous permettra de savoir très rapidement quelle portion du disque lire pour récupérer cette photo.
Quid de la suppression ?
Vous avez donc plusieurs fichiers, chacun ayant une entrée dans l’index qui pointe vers ses données :
Maintenant, mettons que vous supprimiez un fichier. Que se passe-t-il ? Votre système de fichier supprime l’entrée de l’index. Le fichier n’apparaît plus dans l’index, il n’existe donc plus.
Sauf que les données sont toujours sur le disque, rien ne les a effectivement supprimé du disque.
Et techniquement, on n’a pas besoin de les supprimer : si un jour on créé un nouveau fichier et qu’il s’avère que ce nouveau fichier est sauvegardé à la place de l’ancien, le disque va réécrire les nouvelles données par-dessus les anciennes.
Précision pour les SSD
Dans le cas particulier des SSD, il faut effectivement remettre à zéro les blocs avant de pouvoir réécrire dedans - c’est
ce que fait le TRIM. Si vous ne “trimmez” jamais votre SSD (option discard pour ext3/4 ou fstrim -av), lorsqu’il
devra réécrire dans des blocs, il devra les remettre à zéro avant d’écrire dedans, ce qui vous fera perdre en
performances.
Bref, vous voyez donc que lorsque vous supprimez un fichier, il devient “introuvable” (car sorti de l’index), mais vous
pourriez quand même retrouver ses données en faisant un scan complet du disque.
Et c’est exactement ce que fait foremost.
foremost
foremost est un outil tout bête qui va scanner un disque et reconnaître des fichiers en fonction de ses premiers bits
(chaque format de fichier a des entêtes spéciaux qui permettent aux applications de les reconnaître et les ouvrir
correctement).
Forcément, ça peut prendre un peu de temps (ou beaucoup pour des gros disques) vu qu’il va tout lire, bit par bit, mais ça a le mérite de retrouver beaucoup de choses.
En plus c’est simple à utiliser : mettons que votre disque soit monté sur /dev/sdb1 et que vous souhaitez récupérer les
données dans /tmp/recovery :
1$ sudo foremost -i /dev/sdb1 -o /tmp/recoveryVous pouvez également préciser les types de fichier que vous voulez récupérer avec -t (par exemple -t jpg,gif).
À noter : vous pouvez vous retrouver avec des moitiés d’images. Si par exemple la fin d’un fichier JPG a été écrasé avec les données d’un autre fichier plus récent, vous n’aurez que le début du fichier (en général, la partie haute de l’image).
Soit, mais alors comment réellement supprimer mes données ?
Pour être toujours sûr de supprimer totalement vos données, le plus simple est de réécrire des données aléatoires dans votre fichiers puis de le supprimer, ce qui fait qu’un scan avec foremost ne trouvera rien étant donné que le contenu du fichier est devenu une soupe de bits.
Vous pouvez par exemple utiliser shred sur un disque monté sur /dev/sdb1 :
1$ shred /dev/sdb1Vous pouvez préciser le nombre de fois que shred va passer sur le fichier pour écrire des données aléatoires avec -n
(par défaut 3) et vous pouvez lui demander de finir par une couche de 0 avec -z (si vous voulez cacher le fait que vous
avez obfusqué des fichiers). Vous pouvez aussi lui donner un fichier et rajouter -u pour qu’il supprime le fichier à la
fin.
Note sur les passes
Pourquoi shred passe plusieurs fois sur les données, et pas une seule fois me direz-vous ?
Un disque, ce n’est pas un composant parfait qui stocke la donnée parfaitement. Les anciennes données peuvent être
toujours visible malgré les nouvelles données. Par exemple, un disque dur stocke les données sous forme de dipôles
magnétiques (notez les s : ce n’est pas un dipôle par bit, mais plusieurs petits dipôles par bit). Une majorité de
dipôles orientés dans la même direction donne la valeur d’un bit. Une minorité donc peut indiquer l’ancienne valeur et
une seule passe peut ne pas suffire pour réellement supprimer les données (notez tout de même qu’on parle là de matériel
très spécial, c’est pas la peine de commencer à psychoter ; votre voisin de 12 ans qui “hacke” les réseaux Wifi et les
comptes Facebook ne pourra rien faire de votre disque si vous l’avez supprimé avec shred, même si vous n’avez fait
qu’une passe).
Précision supplémentaire pour le stockage flash (les SSD par exemple) : ils utilisent des mécanismes pour limiter
l’usure (“wear leveling”). Contrairement à un disque dur, l’OS ne peut pas savoir où sera écrit des données. Le fait de
réécrire un fichier avec shred va en réaliter écrire des données aléatoires dans un autre endroit pour limiter l’usure
d’un endroit précis du disque (c’est le disque qui gère ça tout seul). Un article de TrueCrypt explique bien ça :
http://andryou.com/truecrypt_orig/docs/wear-leveling/ (en Anglais). Pour se prémunir de ce problème, le plus simple est
de chiffrer complètement votre disque, avec LUKS par exemple.
D’ailleurs, vous devriez toujours chiffrer votre disque.