Как я могу перевернуть один бит в файле?

35

Я хочу преднамеренно повредить файл, чтобы проверить утверждения о том, что btrfs может излечить себя . В статье рассказывается о том, как отключить файловую систему, повредить фотографию, «перевернув» один бит, а затем перемонтировав ее. В старых файловых системах это было бы просто повреждено, но это должно исправить себя в btrfs. В теории это имеет смысл, но я действительно хочу это проверить.

Проблема в том, что статья не объясняет, как это сделать.
Как бы я изменил один бит в очень специфической части файловой системы?

Я также должен отметить, что это должно быть сделано в автономной файловой системе, чтобы btrfs не видел мою запись как намеренную.

Изменить: Хотя вопрос (и обсуждение) много говорит о btrfs, я хотел бы знать, существуют ли независимые от файловой системы методы реализации такого рода повреждений (чтобы их можно было сравнивать между различными типами RAID / контроллерами / и т. Д.).

Оли
источник
@ Я имею в виду, что если я отредактирую файл напрямую, btrfs (или любая файловая система в этом отношении) посчитает это допустимой записью. Это не даст коррупции, которую я ищу.
Оли
Это тестовая файловая система (т. Е. Вас не волнует содержимое, или вы прекрасно справляетесь с восстановлением из резервной копии? Кроме того, вы используете один раздел btrfs на одном диске или один раздел поверх массива RAID) или какая-то другая конфигурация?
Darth Android
1
Если btrfs поддерживает правильные ioctls (не уверен, что это так), вы можете использовать, filefrag -vчтобы точно узнать, где находится файл.
Дероберт
3
@ Оли Я подозреваю, что вы найдете более заинтересованную аудиторию на U & L, как с точки зрения голосов, так и с точки зрения ответов. плюс это .
стружка
1
Снимайте космический луч в нужном месте.
smcg

Ответы:

20

Я не эксперт, но btrfs-progsпакет на самом деле включает в себя инструмент, специально предназначенный для этого, хотя, возможно, вам придется строить из исходного кода. В любом случае, после установки или сборки btrfs-progsвы сможете использовать инструмент btrfs-corrupt-block, который используется разработчиками btrfs для тестирования файловой системы.

Теперь, как я уже сказал, у меня не было много времени, чтобы поиграться с btrfs, поэтому я не знаю точное использование этого инструмента. Но с его помощью вы сможете повредить автономную файловую систему, которая будет исправлена ​​при чтении поврежденного файла (при условии, что вы установили RAID или что-то еще, чтобы использовать другую копию).

strugee
источник
2
Потрясающая находка! Если предположить, что btrfs-corrupt-blockэто действительно настоящий тест, а не «хитрость» разработчиков btrfs, это должно соответствовать всем требованиям.
allquixotic
@allquixotic Если вы хотите узнать больше о btrfs, есть отличная беседа с linux.conf.au 2012 . как я уже сказал, btrfs-corrupt-blockиспользуется разработчиками, поэтому было бы не очень полезно, если бы это было подвохом :)
Strugee
3
@allquixotic В этом прелесть открытого исходного кода: вы можете посмотреть исходный код btrfs и проверить его! Конечно, это не будет легкой задачей, но если вы действительно хотите, вы можете это сделать.
Бакуриу
@Bakuriu Я полностью осознаю это. Я никогда серьезно не сомневался в том, что btrfs-corrupt-blockэто не искренний тест, поскольку он очень быстро обнаружит кто-то, кто ткнет в источник, и будет использован в качестве негативного пиара против Oracle (по крайней мере, как и любые другие разработчики / участники btrfs). Это был просто комментарий.
allquixotic
Интересно, хочет ли OP (@Oli) испортить блок (т. Е. Структуру файловой системы) или файл (т. Е. Содержимое файла ??) ... И я считаю, что заявление btrfs о самовосстановлении первый, а не последний? [как файловая система узнает, какой бит перевернут в файле? какой-то CRC?]. Этот ответ, вероятно, прав, так что +1. [но это может измениться больше, чем «один бит»? или изменить что-то, что можно вылечить легче, чем случайный бит, происходящий «где угодно»?]
Оливье Дюлак
16
  1. Получите значение одного сектора на блочном устройстве (например /dev/sda1) со смещением в 1 миллион секторов (просто пример):

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

    Это произвольно выбранное смещение 1M * 512 байт просто для того, чтобы убедиться, что вы находитесь вне части метаданных файловой системы и действительно в секторе, который содержит данные.

  2. Отредактируйте необработанные данные сектора, изменив содержимое с помощью шестнадцатеричного редактора. Смотрите, например, Нужен хороший шестнадцатеричный редактор для Linux .

  3. Поместите сектор на диск с обратными аргументами ifи of:

    sudo dd if=/root/mysector of=/dev/sda1 bs=512 count=1 seek=1M
    
gertvdijk
источник
2
Это не поможет ему проверить, если 1-миллионный блок не является частью файла. Как он может посмотреть, с какого блока начинается конкретный файл?
Дарт Андроид
3
Это так почти там. Если вы можете зафиксировать команду dd для точного положения файла, это, вероятно, лучший способ приблизиться к этому.
Оли
@ Оли Да, я знаю, как это сделать для файловых систем Ext-семейства, но у меня нет особого опыта работы с btrfs. Дай мне посмотреть, смогу ли я найти способ.
gertvdijk
2
@Oli: у вас может быть просто цикл, dd outpouting block by block (то есть, как указано выше, но «skip = N», N в 1..max), пока вы не сможете извлечь строку из файла, который вы хотите редактировать попытаться сгенерировать строку, которая больше нигде не случится ... например, взять ее из генератора паролей, и достаточно долго?]. Затем вы редактируете этот конкретный блок. перемонтировать, проверить, было ли изменение отменено (в чем я сомневаюсь, см. мой комментарий в верхнем ответе ... похоже, существует путаница между данными файла (= содержимым) и самой структурой файловой системы (= как организованы файлы и их содержимое) )?)
Оливье Дюлак
16

@ Оли - привет, я Джим Солтер, парень, который действительно написал эту статью. Я работал с виртуальной машиной, которая упростила ситуацию. Я начал с файла JPEG и открыл его в шестнадцатеричном редакторе. В частности, я использовал Bless, который вы можете установить в Ubuntu с помощью простого apt-get install bless .

Открыв JPEG в Bless, я несколько раз пролистал страницу вниз, чтобы разобраться с «мясом» JPEG, а затем просто выделил данные объемом около пятидесяти байтов, скопировал и вставил их в текстовый редактор (в моем случай, gEdit). Это дало мне что-то для поиска.

Теперь я сохранил JPEG в каждом массиве на виртуальной машине. Хранилище за массивами представляло собой серию файлов .qcow2. После того, как я сохранил JPEG в массивы, я мог загрузить файлы .qcow2, связанные с каждым массивом, в Bless и искать их - они были не очень большими, они представляли собой не что иное, как JPEG и некоторые метаданные - для этого пятибайтового шаблона Я выделил и скопировал из JPEG. Вуаля, у меня был блок, чтобы развратить! На этом этапе я мог просто вручную редактировать отдельные байты JPEG, хранящиеся на виртуальном диске виртуальной машины, используя Bless, и, что важно, делать это одинаково для каждого массива.

Единственная проблема заключается в том, что в случае массива RAID5, протестированного в статье, мне нужно было убедиться, что я отредактировал фактическую копию данных в полосе, а не четность для самой полосы - это было маленькое изображение на в противном случае - пустой массив, поэтому в блоке FOLLOWING на полосе не было никаких данных, поэтому в блоке четности содержатся данные, не измененные из блока данных. Если бы я случайно отредактировал блок четности вместо блока данных, изображение появилось бы как неизменное.

И последнее замечание - вам НЕ НУЖНЫ виртуальные машины для этого - вы можете делать то же самое одинаково с голым металлом; это было бы просто болью в заднице, потому что вам нужно было бы работать с целыми необработанными дисками, а не с небольшими небольшими файлами .qcow2, и вам нужно было бы либо извлечь диски и поместить их на другой компьютер, либо загружаться в живую (или просто альтернативную) среду, чтобы связываться с ними. (Я тестировал исцеление данных в ZFS именно таким образом, но на реальных машинах с «голым железом» 7 лет назад, когда я впервые заинтересовался файловыми системами следующего поколения.)

Надеюсь это поможет!

Джим Солтер
источник
4

Вы можете попробовать небольшую программу, которая будет работать с открытым файлом.FIBMAP ioctl(2)

Благодаря быстрому поиску в Интернете я нашел этот пост в блоге http://smackerelofopinion.blogspot.tw/2009/06/fibmap-ioctl-file-system-block-number.html, в котором подробно описывается, как это сделать - он даже даст вам ссылку в пример программы, которую вы можете скомпилировать и запустить самостоятельно.

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

Это именно тот способ hdparm --fibmap(упомянутый @falconer) реализован.

После нахождения номеров блоков вы можете использовать ddgongfu для изменения файла, как набросал @gertvdijk. Или, может быть, вы можете просто изменить приведенную fibmap.cвыше программу, чтобы сделать переворот для вас, напрямую записывая файл устройства в обход уровня файловой системы (три параметра для программы: 1. путь к файлу, 2. файл устройства, содержащий файл система, 3. смещение и бит, который вы хотите изменить).

( Отказ от ответственности: я не проверял и не могу гарантировать, что FIBMAP ioctl(2)будет работать для файла в устройстве loopback или файловой системе btrfs, но я бы сильно ожидал, что это так. Я предполагаю, hdparm что проверит тип устройства перед выполнением операции ioctl(2)над файлом и, следовательно, терпит неудачу.)

FOOF
источник
3
sudo hdparm --fibmap /PATH/TO/FILE

даст вам LBA, где находится файл. После этого вы можете использовать ответ @gertvdijk.

сокольничий
источник
К сожалению, это не похоже на работу. Он либо выплевывает, 0,39: device not found in /devлибо потому, что это btrfs, либо (что более вероятно), потому что я использую его для файлов, содержащих петли. Я постараюсь сделать это с "правильной" виртуальной машиной.
Оли
@ Оли Хм. Я думал, что это hdparmработает на каждой файловой системе, но, возможно, это не так.
сокольничий