Preorder drugiego tomu książki sekuraka: Wprowadzenie do bezpieczeństwa IT. -15% z kodem: sekurak-book
Jak zasymulować bad sectory na dysku?
Jakiś czas temu na jednym szkoleniu miałem potrzebę zapewnienia uczestnikom możliwości pracy na uszkodzonych dyskach (np. w grę wchodziła realizacja obrazu posektorowego tego typu dysków). Z różnych powodów nie chciałem używać realnie uszkodzonego sprzętu – choćby ze względu na słabą powtarzalność. Z pomocą przyszedł „The Device Mapper”.
Czym jest ten mechanizm? Zobaczmy na jeden z bardziej rozbudowanych opisów:
The Device Mapper is a kernel driver that provides a framework for volume management. It provides a generic way of creating mapped devices, which may be used as logical volumes. It does not specifically know about volume groups or metadata formats.
Dalej w sekcji „The error Mapping Target” czytamy:
An error mapping target can be used for testing. To test how a device behaves in failure, you can create a device mapping with a bad sector in the middle of a device (…)
Wygląda obiecująco, szczególnie że ktoś już próbował tego wcześniej. Czas zakasać rękawy:
1. Przygotowanie pustego pliku bazowego na naszą symulację dysku.
root@securitum-tst:~# dd if=/dev/zero of=disk.img bs=1024 count=10000 10000+0 records in 10000+0 records out 10240000 bytes (10 MB) copied, 0.0228352 s, 448 MB/s
2. Stworzenie filesystemu na pliku.
root@securitum-tst:~# mkfs -t ext3 disk.img mke2fs 1.41.12 (17-May-2010) disk.img is not a block special device. Proceed anyway? (y,n) y Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) Stride=0 blocks, Stripe width=0 blocks 2512 inodes, 10000 blocks 500 blocks (5.00%) reserved for the super user First data block=1 Maximum filesystem blocks=10485760 2 block groups 8192 blocks per group, 8192 fragments per group 1256 inodes per group Superblock backups stored on blocks: 8193 Writing inode tables: done Creating journal (1024 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 23 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
3. Umożliwienie wykorzystania naszego pliku jako 'realnego urządzenia’.
root@securitum-tst:~# losetup /dev/loop0 disk.img
4. Stworzenie dysku z wirtualnym jednym bad sectorem.
root@securitum-tst:~# dmsetup create bad_disk << EOF 0 8 linear /dev/loop0 0 8 1 error 9 2000 linear /dev/loop0 9 EOF
5. Zamontowanie dysku.
mount /dev/mapper/bad_disk /mnt/bad/
W porządku. Spróbujmy teraz wykonać kopię posektorową tego dysku, z wykorzystaniem narzędzia dd:
root@securitum-tst:~# dd if=/dev/mapper/bad_disk of=x.img dd: reading `/dev/mapper/bad_disk': Input/output error 8+0 records in 8+0 records out 4096 bytes (4.1 kB) copied, 0.000551803 s, 7.4 MB/s
Wygląda na to, że całość działa poprawnie (to znaczy niepoprawnie działa nasz dysk ;-) ). Widać też pewne charakterystyczne zachowanie narzędzia dd – tj. zatrzymanie działania po napotkaniu błędu. Obraz x.img ma tylko 4096 bajtów!
root@securitum-tst:~# ls -l x.img -rw-r--r-- 1 root root 4096 May 24 19:46 x.img
Teraz do gry można włączyć narzędzia typu ddrescue czy dd_rescue, ale to już temat na osobny wpis. Miłego odzyskiwania danych z uszkodzonych dysków! :-)
— michal.sajdak<at>securitum.pl
Wystarczy właściwie parametr conv=noerror zamiast używać od razu ddrescue ;)
@soal – słuszna uwaga, tej opcji nie znałem :-)
Choć ddrescue ma prawdopodobnie trochę bardziej złożone możliwości. Np. dzielenie sektora aby odzyskać dane z jego części, powtarzanie odczytu (może za którymś razem się uda? ;) itd.
Więcej info np. tutaj: http://www.forensicswiki.org/wiki/Ddrescue
–ms
Także program MHDD ma możliwość tworzenia bad sectorów na dysku. MHDD to znakomity program do diagnostyki i wykonywania niskopoziomowych operacji na dyskach twardych.
Bardzo fajnie. Mało takich postów… producenci dysków zapewne uzywają podobnych narzędzi do testowania zachowania dysków na ich prace.
@Damian
No…choć bardziej do przydatne jest w temacie testowania narzędzi do odzyskiwania danych. Do parametrów dysku polecam za to np. hdparm.
Świetny artykuł, choć chciałbym uzupełnienia odnośnie tego, co się dzieje w czwartym punkcie. Leniwy jestem, nie chce mi się zerkać do manuala dm_setup ;-)
@Mateusz – tam jest definicja nowego „dysku”. Tj kopiowane jest (mapowane) kilka pierwszych sektorów z oryginalnego hdd – później wstawiany jeden bad sector i później znowu liniowo kopia z oryginalnego hdd. Tj. w zasadzie ten nowy dysk jest starym z tym że posiada jeden wprowadzony bad sector.
–ms
@sekurak: Tak, zgadza się, ale do takich prostych testów taka opcja idealnie się nadaje. A oczywiście ddrescue przyda się do działania w przypadku ważniejszych danych ;) (chociaż backupy też b. ważna rzecz)
# hdparm –help
[…]
–make-bad-sector Deliberately corrupt a sector directly on the media (VERY DANGEROUS)
a potem
–write-sector Repair/overwrite a (possibly bad) sector directly on the media (VERY DANGEROUS)
Mógłbyś przygotować zestaw fizycznych dysków z „uszkodzonymi” tymi samymi sektorami. :)
Dobrze wiedzieć :)
Zawsze można użyć MHDD i komendy MAKEBAD albo RANDOMBAD :)
Fajny artykuł. Jest też druga metoda symulowania uszkodzonych sektorów, oparta o narzędzia badblocks i e2fsck, umożliwiająca bardziej kontrolowane nanoszenie informacji o uszkodzeniach na istniejące systemy plików.
Natomiast obie metody mają wspólną wadę: zakładają, że podczas dalszego postępowania z uszkodzonym dyskiem, dysk ten będzie z jednej strony uszkodzony, a z drugiej jednak na tyle sprawny, że próba odczytu uszkodzonego sektora nie zakończy się wywaleniem całego systemu operacyjnego.
To, co by było naprawdę ciekawe, to artykuł opisujący postępowanie z dyskami „bardziej uszkodzonymi”, gdzie już nie mówimy o wadliwych pojedynczych sektorach, ale właśnie o uszkodzonej elektronice dysku, odbitym talerzu, uszkodzonej głowicy itd. – innymi słowy postępowanie w sytuacjach, gdzie:
a) zwykły system operacyjny nie daje rady
b) podejrzewamy, że każda próba operacji na dysku wprowadzi nieodwracalne uszkodzenia i musimy wymyślić strategię odczytania jak największej liczby danych, bądź konkretnych danych na zasadzie „po nitce do kłębka”
Symulacja fajna, ale przy prawdziwym dysku może się trochę inaczej wszystko zachowywać. Dawno temu miałem uszkodzony dysk i próbowałem odzyskać dane właśnie korzystając z opcji conv=noerror w dd, jednak firmware dysku okazał się być przeszkodą. Po natrafieniu na uszkodzony sektor firmware automatycznie zapamiętywał ten sektor jako uszodzony, ale dodatkowo uznawał kolejnych bodajże 15 sektorów za uszkodzone, a tak naprawdę uszkodzone były tylko 4 sektory. Po restarcie sprzętu do pozostałych 12 sektorów dobrałem się zgrywając dane sektor po sektorze, ale lecąc od ostatniego.