Comment puis-je retourner un seul bit dans un fichier?

34

Je veux endommager intentionnellement un fichier afin de tester les affirmations selon lesquelles btrfs peut se soigner L'article parle de retirer le système de fichiers, endommageant une photo en "retournant" un seul bit puis en le remontant. Dans les systèmes de fichiers plus anciens, cela ne serait que corrompu, mais il est censé se réparer dans btrfs. En théorie, cela a du sens mais je veux vraiment le tester.

Le problème est que l'article n'explique pas comment comment faire . Comment pourrais-je changer un seul bit dans une partie très spécifique d'un système de fichiers?

Je dois également souligner que cette doit être effectuée sur un système de fichiers hors ligne pour que btrfs ne voie pas mon écriture intentionnelle.

Edit: Bien que la question (et la discussion) parle beaucoup de btrfs, j'aimerais savoir s'il existe des méthodes indépendantes du système de fichiers pour implémenter ce type de corruption (afin de pouvoir la comparer sur différents types / contrôleurs RAID / etc).

    
posée Oli 16.01.2014 - 17:25
la source

5 réponses

20

Je ne suis pas un expert, mais le package btrfs-progs inclut en fait un outil spécifique à cet effet, même si vous devrez peut-être créer à partir des sources. Dans tous les cas, une fois que vous avez installé ou créé btrfs-progs , vous devriez pouvoir utiliser l'outil btrfs-corrupt-block , utilisé par les développeurs de btrfs pour tester le système de fichiers.

Maintenant, comme je l'ai dit, je n'ai pas eu beaucoup de temps pour jouer avec btrfs, donc je ne connais pas l'utilisation exacte de cet outil. Mais avec cela, vous devriez être capable de corrompre un système de fichiers hors ligne, qui sera corrigé lorsque le fichier corrompu sera lu (en supposant que vous ayez configuré un RAID ou quelque chose de différent).

    
réponse donnée strugee 16.01.2014 - 18:45
la source
15
  1. Obtenez la valeur d’un seul secteur sur le périphérique de bloc (par exemple /dev/sda1 ) avec un décalage de 1 million de secteurs décalés (juste un exemple):

    sudo dd if=/dev/sda1 of=/root/mysector bs=512 count=1 skip=1M
    

    Ce décalage arbitraire de 1M * 512 octets est juste pour vous assurer que vous êtes hors de la partie métadonnées du système de fichiers et en fait sur un secteur qui contient des données.

  2. Modifiez les données du secteur brut en modifiant le contenu avec un éditeur hexadécimal. Voir par exemple Besoin d'un bon éditeur hexadécimal pour Linux .

  3. Remettez le secteur sur le disque avec les arguments if et of inversés:

    sudo dd if=/root/mysector of=/dev/sda1 bs=512 count=1 seek=1M
    
réponse donnée gertvdijk 16.01.2014 - 17:44
la source
15

@Oli - salut, je suis Jim Salter, le gars qui a écrit cet article. Je travaillais avec une machine virtuelle, ce qui simplifiait les choses. Ce que j'ai fait est démarré avec un fichier JPEG et ouvert dans un éditeur hexadécimal. Le plus particulier que j'ai utilisé était Bless, que vous pouvez installer dans Ubuntu avec un simple apt-get install bless .

Après avoir ouvert le JPEG dans Bless, je me suis rendu plusieurs fois sur la page pour me familiariser avec le format JPEG, puis j'ai simplement mis en valeur une cinquantaine de octets de données, puis copié et collé dans un éditeur de texte. (dans mon cas, gEdit). Cela m'a donné quelque chose à rechercher.

Maintenant, j'ai enregistré le fichier JPEG dans chaque tableau de la machine virtuelle. Le stockage derrière les tableaux était une série de fichiers .qcow2. Une fois que j'ai enregistré le JPEG dans les tableaux, je pouvais charger les fichiers .qcow2 associés à chaque tableau dans Bless et les rechercher - ils n'étaient pas très volumineux, ne contenant que le JPEG et certaines métadonnées - pour ce motif de cinquante octets J'ai mis en évidence et copié du JPEG. Voila, j'avais le bloc à corrompre! À ce stade, je pouvais simplement modifier manuellement les octets du fichier JPEG stockés sur le disque virtuel de la machine virtuelle à l’aide de Bless - et, ce qui est important, le faire de la même manière sur chaque baie.

Le seul inconvénient est que dans le cas de la matrice RAID5 testée dans l'article, je devais m'assurer de modifier la copie réelle des données dans la bande, et non la parité de la bande elle-même - c'était un petit image sur un tableau par ailleurs vide, il n'y avait donc aucune donnée dans le bloc SUIVANT dans la bande, ce qui fait que le bloc de parité contient les données non modifiées du bloc de données. Si je modifiais accidentellement le bloc de parité au lieu du bloc de données, l'image aurait été inchangée.

Une dernière remarque - vous n'avez PAS BESOIN de machines virtuelles pour ce faire - vous pouvez faire la même chose de la même manière avec du métal nu; ce serait juste plus pénible parce que vous auriez besoin de travailler avec des disques durs entiers plutôt qu'avec de petits fichiers .qcow2, et que vous deviez soit retirer les disques et les placer dans un autre ordinateur, soit démarrer dans un environnement live (ou simplement alternatif) pour les manipuler. (J'ai testé la guérison des données de ZFS de cette façon, mais sur de vraies machines nues, il y a 7 ans, quand je me suis intéressé aux systèmes de fichiers next-gen.)

J'espère que ça aide!

    
réponse donnée Jim Salter 27.01.2014 - 23:17
la source
4

Vous pouvez essayer un petit programme qui effectuera FIBMAP ioctl(2) sur le fichier ouvert.

Par une recherche rapide sur le Web, j'ai trouvé cet article sur le blog lien détaillant comment faire - il vous donnera même un lien vers un exemple de programme que vous pouvez compiler et exécuter vous-même.

$ git clone git://kernel.ubuntu.com/cking/debug-code
$ cd debug-code/block-mapper-fibmap
$ make
$ sudo ./fibmap /path/to/your/image-file.jpg

C'est exactement la façon dont hdparm --fibmap (mentionné par @falconer) est implémenté.

Après avoir trouvé les numéros de bloc, vous pouvez utiliser dd gongfu pour modifier le fichier, comme @gertvdijk esquissé. Ou peut-être pourriez-vous simplement modifier le programme fibmap.c ci-dessus pour effectuer le basculement du bit pour vous, en écrivant directement dans le fichier de périphérique en contournant la couche système de fichiers (trois paramètres pour le programme: 1. le chemin du fichier, 2. fichier périphérique) contenant le système de fichiers, 3. offset et bit que vous souhaitez modifier).

( Déni de responsabilité: Je n'ai pas testé et je ne peux pas garantir que FIBMAP ioctl(2) fonctionnera pour un fichier dans un périphérique de bouclage ou un système de fichiers btrfs, mais je pense deviner hdparm vérifiera le type de périphérique avant d'effectuer ioctl(2) sur le fichier et échouera.)

    
réponse donnée FooF 17.01.2014 - 06:58
la source
3
sudo hdparm --fibmap /PATH/TO/FILE

vous donnera les LBA où se trouve le fichier. Après cela, vous pouvez utiliser la réponse de @gertvdijk.

    
réponse donnée falconer 16.01.2014 - 19:14
la source

Lire d'autres questions sur les étiquettes