ฉันจะพลิกไฟล์หนึ่งบิตได้อย่างไร?


35

ฉันต้องการทำให้ไฟล์เสียหายโดยเจตนาเพื่อทดสอบการอ้างสิทธิ์ที่ btrfs สามารถรักษาได้ บทความนี้กล่าวถึงการปิดระบบไฟล์สร้างความเสียหายให้ภาพถ่ายโดย "พลิก" เพียงเล็กน้อยแล้วทำการติดตั้งใหม่ ในระบบไฟล์ที่เก่ากว่านี้จะเสียหาย แต่มันควรจะแก้ไขตัวเองใน btrfs ในทางทฤษฎีแล้วมันสมเหตุสมผล แต่ฉันต้องการทดสอบจริงๆ

ปัญหาคือบทความไม่ได้อธิบายวิธีการใด ๆ
ฉันจะเปลี่ยนบิตเพียงเล็กน้อยในส่วนที่เฉพาะเจาะจงของระบบไฟล์ได้อย่างไร?

ฉันควรชี้ให้เห็นว่าสิ่งนี้จะต้องทำในระบบไฟล์ออฟไลน์เพื่อให้ btrfs ไม่เห็นการเขียนของฉันโดยเจตนา

แก้ไข:ในขณะที่คำถาม (และการสนทนา) พูดถึง btrfs มากมายฉันอยากรู้ว่ามีระบบไฟล์อิสระในการใช้ความเสียหายแบบนี้หรือไม่ (เพื่อเปรียบเทียบกับ RAID ประเภท / คอนโทรลเลอร์ / etc)


@Dan ฉันหมายความว่าถ้าฉันแก้ไขไฟล์โดยตรง btrfs (หรือระบบไฟล์ใด ๆ สำหรับเรื่องนั้น) จะนับว่าเป็นการเขียนที่ถูกต้อง มันจะไม่ทำให้เกิดความเสียหายที่ฉันกำลังมองหา
Oli

นี่เป็นระบบไฟล์ทดสอบ (เช่นคุณไม่สนใจเนื้อหาหรือไม่สมบูรณ์แบบด้วยการกู้คืนจากการสำรองข้อมูลหรือไม่นอกจากนี้คุณใช้พาร์ติชัน btrfs เดียวในไดรฟ์เดียวหรือพาร์ติชันเดียวด้านบนของอาร์เรย์ RAID หรือการกำหนดค่าอื่น ๆ
Darth Android

1
หาก btrfs รองรับ ioctls ที่ถูกต้อง (ไม่แน่ใจว่าเป็นเช่นนั้น) คุณสามารถใช้filefrag -vเพื่อค้นหาตำแหน่งของไฟล์
Derobert

3
@Oli ฉันสงสัยว่าคุณจะพบผู้ชมที่สนใจใน 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

@Bakuriu ฉันรู้อย่างนั้น ฉันไม่เคยสงสัยอย่างจริงจังว่าbtrfs-corrupt-blockไม่ใช่การทดสอบที่จริงใจเนื่องจากจะมีคนค้นพบอย่างรวดเร็วจากแหล่งข่าวและใช้เป็น PR เชิงลบต่อ Oracle (อย่างน้อยก็เช่นเดียวกับนักพัฒนา / ผู้สนับสนุน btrfs อื่น ๆ ) มันเป็นเพียงความคิดเห็นนอกกรอบ
allquixotic

ฉันสงสัยว่า OP (@Oli) ต้องการบล็อกเสียหาย (เช่นโครงสร้างระบบไฟล์) หรือไฟล์ (เช่นเนื้อหาของไฟล์หรือไม่?) ... และฉันเชื่อว่าการเรียกร้องการรักษาด้วยตนเองของ btrfs นั้นเกี่ยวกับ อดีตไม่ใช่ยุคสุดท้ายหรือ [ระบบไฟล์จะรู้ได้อย่างไรว่าบิตใดถูกพลิกในไฟล์? CRC บางอย่าง?] คำตอบนี้อาจจะอยู่ทางด้านขวาดังนั้น +1 [แต่อาจเปลี่ยนมากกว่า "บิตเดียว" หรือ หรือเปลี่ยนสิ่งที่สามารถรักษาได้ง่ายกว่าการสุ่มบิตที่เกิดขึ้น "ที่ใดก็ได้"?]
Olivier Dulac

16
  1. รับค่าของเซกเตอร์เดียวบนอุปกรณ์บล็อก (เช่น/dev/sda1) โดยมีออฟเซ็ต 1 ล้านเซกเตอร์ชดเชย (เพียงตัวอย่าง):

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

    อ็อฟเซ็ต 1M * 512 bytes ที่เลือกไว้โดยพลการนี้เป็นเพียงเพื่อให้แน่ใจว่าคุณไม่ได้อยู่ในส่วนของข้อมูลเมตาของระบบไฟล์และในภาคที่มีข้อมูล

  2. แก้ไขข้อมูลเซกเตอร์ดิบโดยเปลี่ยนเนื้อหาด้วยโปรแกรมแก้ไขฐานสิบหก ดูตัวอย่างต้องการแก้ไขที่ดีฐานสิบหกสำหรับลินุกซ์

  3. นำเซกเตอร์กลับคืนบนไดรฟ์โดยใช้อาร์กิวเมนต์ifและofย้อนกลับ:

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

2
สิ่งนี้จะไม่ช่วยให้เขาทดสอบเว้นเสียแต่ว่าบล็อกที่ 1 ล้านเป็นส่วนหนึ่งของไฟล์ เขาจะค้นหาไฟล์บล็อกที่จะเริ่มได้อย่างไร
Darth Android

3
นั่นคือเพื่อให้เกือบจะมี หากคุณสามารถล็อกคำสั่ง dd ไปยังตำแหน่งที่แน่นอนของไฟล์ได้นี่อาจเป็นวิธีที่ดีที่สุดในการเข้าถึง
Oli

@Oli ใช่ฉันรู้วิธีการทำเช่นนั้นสำหรับตระกูล Ext ของระบบไฟล์ แต่ฉันไม่ได้มีประสบการณ์กับ btrfs มากนัก ให้ฉันดูว่าฉันสามารถหาวิธี
gertvdijk

2
@Oli: คุณสามารถมีลูป, dd outpouting block โดย block (เช่นข้างต้น แต่ "skip = N", N อยู่ใน 1..max) จนกระทั่งคุณสามารถ grep บรรทัดจากไฟล์ที่คุณต้องการแก้ไข [พยายามสร้างบรรทัดที่จะไม่เกิดขึ้นที่อื่น ... ตัวอย่างเช่นเอามันจากเครื่องกำเนิดรหัสผ่านและนานพอไหม?] จากนั้นคุณแก้ไขบล็อกนั้น remount ทดสอบว่าการเปลี่ยนแปลงถูกเปลี่ยนกลับ (ซึ่งฉันสงสัยว่าให้ดูความคิดเห็นของฉันในคำตอบด้านบน ... ดูเหมือนว่าจะมีความสับสนระหว่างข้อมูลไฟล์ (= เนื้อหา) และโครงสร้างระบบไฟล์ของตัวเอง (= วิธีการจัดระเบียบไฟล์และเนื้อหา )?)
Olivier Dulac

16

@Oli - สวัสดีฉันชื่อ Jim Salter คนที่เขียนบทความนั้นจริง ๆ ฉันทำงานกับเครื่องเสมือนจริงซึ่งทำให้สิ่งต่าง ๆ ง่ายขึ้น สิ่งที่ฉันทำคือเริ่มต้นด้วยไฟล์ JPEG และเปิดขึ้นในตัวแก้ไขฐานสิบหก สิ่งหนึ่งที่ฉันใช้คือ Bless ซึ่งคุณสามารถติดตั้งใน Ubuntu พร้อมกับคำแนะนำในการติดตั้งapt-getง่ายๆ

หลังจากเปิด JPEG ใน Bless ฉันกดหน้าลงสองสามครั้งเพื่อให้เข้ากันกับ "เนื้อ" ของ JPEG แล้วเน้นที่ข้อมูลประมาณห้าสิบไบต์และคัดลอกและวางลงในโปรแกรมแก้ไขข้อความ (ใน กรณี gEdit) สิ่งนี้ทำให้ฉันมีสิ่งที่จะค้นหา

ตอนนี้ฉันบันทึก JPEG ลงในแต่ละอาร์เรย์บน VM ที่เก็บข้อมูลหลังอาร์เรย์เป็นชุดของไฟล์. qcow2 เมื่อฉันบันทึก JPEG ลงในอาร์เรย์ฉันสามารถโหลดไฟล์. qcow2 ที่เชื่อมโยงกับแต่ละอาร์เรย์ลงใน Bless และค้นหาได้ - มันไม่ใหญ่มากไม่มีอะไรนอกจาก JPEG และข้อมูลเมตาบางส่วน - สำหรับรูปแบบห้าสิบไบต์นั้น ฉันจะเน้นและคัดลอกออกจาก JPEG Voila ฉันมีบล็อกที่เสียหาย! ณ จุดนี้ฉันสามารถแก้ไข JPEG แต่ละไบต์ด้วยตนเองตามที่จัดเก็บไว้ในดิสก์เสมือนของ VM โดยใช้ Bless - และที่สำคัญทำเช่นเดียวกันในแต่ละอาร์เรย์

รอยย่นเพียงอย่างเดียวคือในกรณีของอาร์เรย์ RAID5 ที่ทดสอบในบทความฉันต้องทำให้แน่ใจว่าฉันแก้ไขสำเนาข้อมูลจริงในแถบนั้นและไม่ใช่ความเท่าเทียมกันสำหรับแถบนั้น - เป็นภาพเล็ก ๆ ไม่เช่นนั้นก็คืออาร์เรย์ที่ว่างเปล่าดังนั้นจึงไม่มีข้อมูลใด ๆ ในบล็อก FOLLOWING ในแถบทำให้บล็อก parity มีข้อมูลที่ไม่เปลี่ยนแปลงจากบล็อกข้อมูล หากฉันจะแก้ไข parity block โดยไม่ได้ตั้งใจแทนที่จะเป็น data block ภาพก็จะปรากฏเป็นไม่เปลี่ยนแปลง

หมายเหตุสุดท้ายสุดท้าย - คุณไม่จำเป็นต้องใช้เครื่องจักรเสมือนในการทำเช่นนี้ - คุณสามารถทำสิ่งเดียวกันด้วยวิธีเดียวกันกับโลหะเปลือย มันอาจจะเป็นความเจ็บปวดในก้นเพราะคุณจะต้องทำงานกับไดรฟ์ดิบทั้งหมดแทนที่จะเป็นไฟล์. qcow2 ขนาดเล็กที่ดีและคุณต้องดึงไดรฟ์และวางไว้ในเครื่องอื่นหรือ บูตเข้าสู่สภาพแวดล้อมแบบสด (หรือสลับกัน) เพื่อยุ่งกับพวกเขา (ฉันทดสอบการรักษาข้อมูลของ ZFS ด้วยวิธีนี้ แต่ในเครื่องโลหะเปลือยจริงเมื่อ 7-ish ปีที่แล้วเมื่อฉันสนใจระบบไฟล์รุ่นต่อไปในครั้งแรก)

หวังว่านี่จะช่วยได้!


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โปรแกรมด้านบนเพื่อทำ bit flip ให้คุณเขียนไปยังไฟล์อุปกรณ์โดยตรงโดยข้ามเลเยอร์ระบบไฟล์ (พารามิเตอร์สามตัวสำหรับโปรแกรม: 1. พา ธ ไปยังไฟล์, 2. ไฟล์อุปกรณ์ที่มีไฟล์ ระบบ 3. ออฟเซ็ตและบิตที่คุณต้องการแก้ไข)

( ข้อจำกัดความรับผิดชอบ:ฉันยังไม่ได้ทดสอบและไม่สามารถรับประกันได้ว่าFIBMAP ioctl(2)จะทำงานกับไฟล์ในอุปกรณ์ลูปแบ็คหรือระบบไฟล์ btrfs แต่ฉันคาดหวังอย่างยิ่งว่าจะเป็นเช่นนั้นฉันคาดเดาว่า hdparmจะตรวจสอบประเภทอุปกรณ์ก่อนดำเนินการioctl(2)บนไฟล์ ความล้มเหลว.)


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

จะให้ LBA แก่คุณซึ่งเป็นที่ตั้งของไฟล์ หลังจากนี้คุณสามารถใช้คำตอบของ @gertvdijk


น่าเสียดายที่นี่ไม่ได้ผล มันพ่นออกมา0,39: device not found in /devก็เพราะมันเป็น btrfs หรือ (มีแนวโน้มมากกว่า) เพราะฉันใช้มันกับไฟล์ลูปแบ็ค ฉันจะลองทำสิ่งนี้ด้วย VM ที่ "เหมาะสม"
Oli

@Oli อืม ฉันคิดว่ามันhdparmใช้ได้กับทุกระบบไฟล์ แต่อาจจะไม่เป็นเช่นนั้น
falconer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.