Як я можу перевернути один біт у файлі?


35

Я хочу навмисно пошкодити файл, щоб перевірити твердження, що btrfs може вилікувати себе . У статті йдеться про зняття файлової системи, пошкодження фотографії, "перевернувши" один біт, а потім повторне його повторне перетворення. У старих файлових системах це було б просто пошкоджено, але він повинен виправити себе в btrfs. Теоретично це має сенс, але я дуже хочу це перевірити.

Проблема полягає в тому, що стаття не пояснює, як зробити що-небудь із цього.
Як би я міг змінити один біт у дуже конкретній частині файлової системи?

Я також повинен зазначити, що це потрібно робити в автономній файловій системі, щоб btrfs не бачив моє записування як навмисне.

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


@Dan, я маю на увазі, що якщо я редагую файл безпосередньо, btrfs (або будь-яка файлова система з цього питання) вважатиме це дійсним записом. Це не дасть корупції, яку я шукаю.
Олі

Це тестова файлова система (тобто, вам не байдуже вміст, або ви прекрасно справляєтесь із відновленням резервної копії? Також ви використовуєте один розділ btrfs на одному диску або один розділ поверх масиву RAID , або якась інша конфігурація?
Дарт Android

1
Якщо btrfs підтримує правильні ioctls (не впевнені, чи є), ви можете filefrag -vдізнатися, де саме знаходиться файл.
дероберт

3
@ Олі, я підозрюю, що ви знайдете більш зацікавлену аудиторію в галузі U&L, як з точки зору голосів, так і з точки зору відповідей. плюс, це .
strugee

1
Стріляйте космічним промінням у потрібне місце.
smcg

Відповіді:


20

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

Зараз, як я вже сказав, у мене не було багато часу, щоб пограти з btrfs, тому я не знаю точного використання цього інструменту. Але за допомогою нього ви маєте змогу пошкодити офлайн-файлову систему, яка буде виправлена ​​під час зчитування пошкодженого файлу (якщо припустити, що ви встановили RAID чи щось таке, щоб використовувати ще одну копію).


2
Дивовижна знахідка! Якщо припустити, що btrfs-corrupt-blockнасправді написано справжнім тестом, а не «трюком» розробниками btrfs, це повинно точно відповідати законопроекту.
allquixotic

@allquixotic, якщо ви хочете дізнатися більше про btrfs, ви можете розмовляти з linux.conf.au 2012 . як я вже сказав, btrfs-corrupt-blockвикористовується розробниками, тому це було б не дуже корисно, якби це була хитрість :)
strugee

3
@allquixotic У цьому полягає краса відкритого коду: ви можете подивитися вихідний код btrfs і перевірити його! Звичайно, це завдання не з легких завдань, але якщо ти дуже хочеш, ти можеш це зробити.
Бакуріу

@Bakuriu Я цілком усвідомлюю це. Я ніколи всерйоз не сумнівався в тому, що btrfs-corrupt-blockце не щире випробування, оскільки його дуже швидко знайде хтось, хто тхне на джерело, і використовуватиметься як негативний PR проти Oracle (принаймні; так само, як і будь-який інший розробник / розробник btrfs). Це був просто зауважений коментар.
allquixotic

Цікаво, чи хоче OP (@Oli) пошкодити блок (тобто структуру файлової системи) або файл (тобто вміст файлу ??) ... І я вважаю, що btrfs заявляє про самолікування перший, а не останній? [як би файлова система знала, який біт був перевернутий у файл? якась ЦРЛ?]. Ця відповідь, мабуть, вірна, хоча +1. [але це може змінитися більше, ніж "єдиний біт"? або змінити щось, що можна вилікувати легше, ніж випадковий шматочок, що відбувається "де завгодно"?]
Олів'є Дулак

16
  1. Отримайте значення одного сектора на блоковому пристрої (наприклад /dev/sda1) зі зміщенням 1 мільйона секторів зміщення (лише приклад):

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

    Це довільне вибране зміщення 1 М * 512 байтів - це лише для того, щоб переконатися, що ви поза частиною метаданих файлової системи і фактично в секторі, який містить дані.

  2. Відредагуйте необроблені дані сектора, змінивши вміст за допомогою шестигранного редактора. Дивіться, наприклад, Потрібен хороший шестигранний редактор для Linux .

  3. Поверніть сектор на диску з аргументами ifта ofзворотними аргументами:

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

2
Це не допоможе йому перевірити, якщо 1-мільйонний блок насправді не є частиною файлу. Як він може шукати, з якого блоку починається певний файл?
Дарт Android

3
Ось так майже немає. Якщо ви можете заблокувати команду dd на точне розташування файлу, це, мабуть, найкращий спосіб підійти до цього.
Олі

@Oli Так, я знаю, як це зробити для сімейства файлових систем Ext, але у мене немає такого досвіду роботи з btrfs. Дозвольте мені побачити, чи зможу я знайти спосіб.
gertvdijk

2
@Oli: ви можете просто мати цикл, який виводить блок за блоком (тобто, як описано вище, але "пропустити = N", N - в 1..макс), поки ви не зможете отримати рядок з файлу, який ви хочете редагувати [спробуйте створити рядок, який не відбудеться більше ніде ... наприклад, візьміть його з генератора паролів і досить довго?]. Потім ви редагуєте цей конкретний блок. перегляньте, перевіряйте, чи зміни були повернені (що я сумніваюсь, див. мій коментар у верхній відповіді ... Здається, виникає плутанина між файловими даними (= вміст) та самою структурою файлової системи (= як організовані файли та їх вміст) )?)
Олів'є Дулак

16

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

Відкривши JPEG у Bless, я кілька разів натискав на сторінку, щоб добре проникнути у "м'ясо" JPEG, а потім лише виділив дані, що вартують приблизно п’ятдесят байтів, і скопіював і вставив його в текстовий редактор (у моєму випадок, gEdit). Це дало мені щось шукати.

Тепер я зберігав JPEG у кожному масиві VM. Зберігання за масивами містило серію файлів .qcow2. Як тільки я зберег JPEG у масив, я міг би завантажити файли .qcow2, пов’язані з кожним масивом, у Bless, і шукати їх - вони були не дуже великими, вони були нічим іншим, як JPEG та деякими метаданими - для цього п'ятдесяти байтових шаблонів Я виділив і скопіював із JPEG. Вуаля, у мене був блок корумпованості! У цей момент я міг просто вручну редагувати окремі байти JPEG, які зберігаються на віртуальному диску VM за допомогою Bless - і, що важливо, робити це точно так само на кожному масиві.

Єдина зморшка полягає в тому, що у випадку тестованого в статті масиву RAID5 я повинен був переконатися, що я редагував фактичну копію даних у смужку, а не співвідношення для самої смуги - це було невелике зображення на в іншому випадку порожній масив, тому в блоці СЛУЖБ в смузі не було жодних даних, завдяки чому блок паритету містить дані, які не змінюються від блоку даних. Якби я випадково відредагував блок парності замість блоку даних, зображення було б відображене як незмінне.

Останнє зауваження - вам не потрібні віртуальні машини для цього - ви можете робити ті самі речі тими самими способами з голим металом; це буде просто біль в області прикладу, тому що вам потрібно буде працювати з цілими сирими дисками, а не з гарними маленькими файлами .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) реалізований.

ddВиявивши номери блоків, ви можете використовувати gongfu для зміни файлу, як-от замальовано @gertvdijk. Або, можливо, ви могли просто змінити fibmap.cпрограму вище, щоб зробити біт фліп для вас, безпосередньо записавши у файл пристрою, минаючи рівень файлової системи (три параметри для програми: 1. шлях до файлу, 2. файл пристрою, що містить файл система, 3. зміщення та біт, який ви хочете змінити).

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


3
sudo hdparm --fibmap /PATH/TO/FILE

дасть вам LBA, де знаходиться файл. Після цього ви можете скористатися відповіддю @gertvdijk.


На жаль, це, здається, не працює. Він виплюнув це 0,39: device not found in /devабо тому, що це btrfs, або (що швидше), тому що я використовую його у файлах, що містяться в петлі. Я спробую зробити це з "належним" VM.
Олі

@ Олі Хм. Я думав, що це hdparmпрацює у кожній файловій системі, але, можливо, це не так.
сокольниця
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.