Bagaimana saya bisa membalik sedikit pun dalam file?

35

Saya ingin sengaja merusak file untuk menguji klaim bahwa btrf dapat menyembuhkan dirinya sendiri . Artikel tersebut berbicara tentang melepas sistem file, merusak foto dengan "membalik" sedikit saja dan kemudian memasang kembali. Dalam sistem file yang lebih lama ini hanya akan rusak tetapi seharusnya memperbaiki dirinya sendiri di btrfs. Secara teori, ini masuk akal tetapi saya benar-benar ingin mengujinya.

Masalahnya adalah artikel itu tidak menjelaskan bagaimana melakukan semua itu.
Bagaimana saya akan mengubah bit tunggal di bagian yang sangat spesifik dari sistem file?

Saya juga harus menunjukkan bahwa ini harus dilakukan pada sistem file offline sehingga btrfs tidak melihat tulisan saya sebagai disengaja.

Sunting: Sementara pertanyaan (dan diskusi) berbicara banyak tentang btrfs, saya ingin tahu apakah ada metode independen filesystem menerapkan jenis korupsi ini (sehingga dapat dibandingkan di berbagai jenis RAID / pengontrol / dll).

Oli
sumber
@Dan saya maksudkan bahwa jika saya mengedit file secara langsung, btrfs (atau sistem file apa pun dalam hal ini) akan menghitungnya sebagai penulisan yang valid. Itu tidak akan memberikan korupsi yang saya cari.
Oli
Apakah ini sistem file uji (Yaitu, Anda tidak peduli dengan isinya, atau tidak apa-apa dengan memulihkan dari cadangan? Juga, apakah Anda menggunakan partisi btrf tunggal pada drive tunggal, atau satu partisi tunggal di atas array RAID , atau konfigurasi lainnya?
Darth Android
1
Jika btrfs mendukung ioctls kanan (tidak yakin apakah itu benar), Anda dapat menggunakan filefrag -vuntuk mencari tahu di mana tepatnya sebuah file berada.
derobert
3
@Oli Saya menduga Anda akan menemukan audiens yang lebih tertarik pada U&L, baik dalam hal suara maupun dalam hal jawaban. plus, ini .
strugee
1
Tembak sinar kosmik di tempat yang tepat.
smcg

Jawaban:

20

Saya bukan ahli, tetapi btrfs-progspaket itu sebenarnya termasuk alat khusus untuk melakukan ini, meskipun Anda mungkin harus membangun dari sumber. Bagaimanapun, setelah Anda menginstal atau membangun btrfs-progs, Anda harus dapat menggunakan alat btrfs-corrupt-block, yang digunakan oleh pengembang btrf untuk menguji sistem file.

Sekarang, seperti yang saya katakan, saya belum punya banyak waktu untuk bermain-main dengan btrf, jadi saya tidak tahu persis penggunaan alat ini. Tetapi dengan itu, Anda harus dapat merusak sistem file offline, yang akan diperbaiki ketika file yang rusak dibaca (dengan asumsi bahwa Anda telah menyiapkan RAID atau sesuatu sehingga ada salinan lain untuk digunakan).

strugee
sumber
2
Temuan yang luar biasa! Dengan asumsi bahwa btrfs-corrupt-blocksebenarnya ditulis sebagai tes asli dan bukan "trik" oleh pengembang btrfs, ini harus sesuai dengan tagihan.
allquixotic
@allquixotic jika Anda ingin mempelajari lebih lanjut tentang btrfs, ada pembicaraan hebat dari linux.conf.au 2012 . seperti yang saya katakan, btrfs-corrupt-blockdigunakan oleh pengembang, jadi itu tidak akan sangat berguna jika itu tipuan :)
strugee
3
@allquixotic Itulah keindahan open source: Anda dapat melihat kode sumber btrfs dan memeriksanya! Tentu, ini tidak akan menjadi tugas yang mudah, tetapi jika Anda benar-benar ingin, Anda bisa melakukannya.
Bakuriu
@ Bakuriu, saya sepenuhnya sadar akan hal itu. Saya tidak pernah benar-benar meragukan bahwa btrfs-corrupt-blockitu bukan tes yang tulus, karena itu akan ditemukan dengan sangat cepat oleh seseorang yang menusuk sumbernya, dan digunakan sebagai PR negatif terhadap Oracle (setidaknya; serta pengembang / kontributor btrf lainnya). Itu hanya komentar spontan.
allquixotic
Saya ingin tahu apakah OP (@Oli) ingin merusak blok (yaitu, struktur sistem file) atau file (yaitu, isi file ??) ... Dan saya percaya klaim btrf tentang penyembuhan diri adalah tentang yang pertama, bukan yang terakhir? [bagaimana sistem file mengetahui bit mana yang dibalik dalam file? semacam CRC?]. Namun, jawaban ini mungkin benar, jadi +1. [tapi itu bisa berubah lebih dari "satu bit"? atau mengubah sesuatu yang dapat disembuhkan dengan lebih mudah daripada kejadian acak yang terjadi "di mana saja"?]
Olivier Dulac
16
  1. Dapatkan nilai satu sektor pada perangkat blok (mis. /dev/sda1) Dengan offset 1 juta sektor offset (hanya sebuah contoh):

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

    Offset 1M * 512 byte yang dipilih secara acak ini hanya untuk memastikan Anda keluar dari bagian metadata dari sistem file dan sebenarnya pada sektor yang berisi data.

  2. Edit data sektor mentah dengan mengubah konten dengan hex editor. Lihat misalnya Perlu editor hex yang baik untuk Linux .

  3. Pasang kembali sektor pada drive dengan ifdan ofargumen terbalik:

    sudo dd if=/root/mysector of=/dev/sda1 bs=512 count=1 seek=1M
    
gertvdijk
sumber
2
Ini tidak akan membantunya menguji kecuali blok 1 juta sebenarnya merupakan bagian dari file. Bagaimana dia bisa mencari di mana blok file tertentu dimulai?
Darth Android
3
Itu jadi hampir ada. Jika Anda dapat mengunci perintah dd ke posisi tepat file, ini mungkin cara terbaik untuk mendekati ini.
Oli
@Oli Ya, saya tahu bagaimana melakukan itu untuk keluarga Ext-filesystems, tapi saya tidak punya banyak pengalaman dengan btrfs. Biarkan saya melihat apakah saya dapat menemukan cara.
gertvdijk
2
@ Oli: Anda cukup memiliki satu lingkaran, keluar melebihi blok per blok (yaitu, seperti di atas, tetapi "lewati = N", N berada di 1..max) sampai Anda dapat mengambil satu baris dari file yang ingin Anda edit. [mencoba membuat garis yang tidak akan terjadi di tempat lain ... misalnya mengambilnya dari pembuat kata sandi, dan cukup lama?]. Kemudian Anda mengedit blok itu. remount, uji apakah perubahan dikembalikan (yang saya ragu, lihat komentar saya di jawaban atas ... tampaknya ada kebingungan antara data file (= konten) dan struktur sistem file itu sendiri (= bagaimana file dan kontennya disusun) )?)
Olivier Dulac
16

@Oli - hai, saya Jim Salter, pria yang benar-benar menulis artikel itu. Saya bekerja dengan mesin virtual, yang membuat semuanya lebih sederhana. Apa yang saya lakukan dimulai dengan file JPEG, dan membukanya di hex editor. Yang khusus saya gunakan adalah Bless, yang dapat Anda instal di Ubuntu dengan apt-get install bless sederhana .

Setelah membuka JPEG di Bless, saya menekan halaman ke bawah beberapa kali untuk masuk ke dalam "daging" dari JPEG, dan kemudian hanya menyoroti data bernilai sekitar lima puluh byte, dan menyalin dan menempelkannya ke editor teks (di saya kasus, gEdit). Ini memberi saya sesuatu untuk dicari.

Sekarang saya menyimpan JPEG ke setiap array di VM. Penyimpanan di belakang array adalah serangkaian file .qcow2. Setelah saya menyimpan JPEG ke dalam array, saya dapat memuat file .qcow2 yang terkait dengan masing-masing array ke Bless, dan mencari mereka - mereka tidak terlalu besar, hanya JPEG dan beberapa metadata - untuk pola lima puluh byte itu Saya telah menyorot dan menyalin dari JPEG. Voila, saya punya blok untuk korup! Pada titik ini, saya hanya bisa mengedit byte individual dari JPEG yang disimpan di disk virtual VM menggunakan Bless - dan, yang penting, melakukannya dengan cara yang persis sama pada setiap array.

Satu-satunya kerutan adalah bahwa dalam kasus array RAID5 diuji dalam artikel, saya harus memastikan saya mengedit salinan data yang sebenarnya dalam strip, dan bukan paritas untuk strip itu sendiri - itu adalah gambar kecil pada sebuah jika tidak array kosong, jadi tidak ada data di blok BERIKUT di strip, membuat blok paritas berisi data tidak diubah dari blok data. Jika saya secara tidak sengaja mengedit blok paritas alih-alih blok data, gambar akan ditampilkan sebagai tidak berubah.

Satu catatan terakhir - Anda tidak PERLU mesin virtual untuk melakukan ini - Anda bisa melakukan hal yang sama dengan cara yang sama dengan bare metal; itu hanya akan lebih menyusahkan di pantat karena Anda harus bekerja dengan seluruh drive mentah alih-alih dengan file .qcow2 kecil yang bagus, dan Anda harus menarik drive dan meletakkannya di mesin yang berbeda, atau boot ke lingkungan langsung (atau hanya bergantian) untuk mengacaukannya. (Saya menguji penyembuhan data ZFS persis seperti ini, tetapi pada mesin logam telanjang nyata, 7-tahun lalu ketika saya pertama kali tertarik pada filesystem next-gen.)

Semoga ini membantu!

Jim Salter
sumber
4

Anda dapat mencoba program kecil yang akan melakukan pada file yang dibuka.FIBMAP ioctl(2)

Dengan pencarian web cepat, saya menemukan posting blog ini http://smackerelofopinion.blogspot.tw/2009/06/fibmap-ioctl-file-system-block-number.html merinci cara melakukan ini - itu bahkan akan memberi Anda tautan ke program sampel yang dapat Anda kompilasi dan jalankan sendiri.

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

Ini persis cara hdparm --fibmap(disebutkan oleh @falconer) diimplementasikan.

Setelah menemukan nomor blok, Anda bisa menggunakan ddgongfu untuk memodifikasi file, seperti @gertvdijk dibuat sketsa. Atau mungkin Anda bisa memodifikasi fibmap.cprogram di atas untuk melakukan flip bit untuk Anda, langsung menulis ke file perangkat melewati lapisan sistem file (tiga parameter untuk program: 1. path ke file, 2. file perangkat yang berisi file sistem, 3. offset dan bit yang ingin Anda modifikasi).

( Disclaimer: saya belum diuji dan tidak bisa menjamin bahwa FIBMAP ioctl(2)akan bekerja untuk file di perangkat loopback atau btrfs sistem file, tapi saya akan sangat berharap itu tidak saya. Menebak hdparm akan memeriksa jenis perangkat sebelum melakukan ioctl(2)pada file dan karenanya kegagalan.)

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

akan memberi Anda BBA di mana file tersebut berada. Setelah ini, Anda dapat menggunakan jawaban @gertvdijk.

elang
sumber
Sayangnya ini sepertinya tidak berhasil. Itu meludahkan a 0,39: device not found in /devItu karena btrfs atau (lebih mungkin) karena saya menggunakannya pada file yang dipegang loopback. Saya akan mencoba dan menyelesaikan ini dengan VM yang "tepat".
Oli
@Oli Hmm. Saya pikir itu hdparmbekerja pada setiap sistem file tetapi mungkin tidak demikian.
Falcon