Ukrywanie danych w przestrzeni HPA
Dzisiejszy blogowy wpis kieruję do przestępców i nieszczęśników chcących ukryć przed żoną „filmy przyrodnicze”. Oczywiście żartuję ponieważ opisany w dalszej części sposób jest bardzo prosty do wykrycia i niestanowi żadnej alternatywy dla znacznie bardziej obiecujących metod, takich jak umiejętne wykorzystanie strumieni w NTFS, steganografii, szyfrowania etc. Naturalnie nic nie stoi na przeszkodzie, aby różne sposoby ze sobą łączyć i pewnego dnia stracić np. portfel z bitcoinami (bo zwykle cyfrowe zabawy właśnie tak się kończą, zapominając po latach „co gdzie i jak”). ;) Trik ten jest niewiele bardziej skuteczny od zmian atrybutów fs na systemowy/ukryty, magicznej kropki, „folderów na hasło” itp. sztuczek, a przy tym wystarczająco niewygodny aby tekstu nie doczytać do końca. Więc dla kogo jest ten poradnik? Dla ludzi ciekawych binarnego świata! - jak zawsze w moich publikacjach. :)
Host Protected Area jest specjalnym, wydzielonym obszarem pamięci masowej, niewidocznym dla systemów operacyjnych (jak np. CellOS w PS3, dzięki czemu można używać HDD powyżej 1.5TiB), programów, a nawet BIOS/UEFI komputera, dzięki czemu wykonując nawet pełne formatowanie, sektory które zajmuje nie zostaną nadpisane. HPA może zająć dowolną ilość miejsca na nośniku i daje się ustawić na urządzeniach obsługujących standard ATAPI-4 (HDD/SHDD/SSD). Po odblokowaniu pełnej przestrzeni dyskowej, programy używające niskopoziomowego dostępu do urządzenia są w stanie odczytać i zapisać wydzielone do HPA miejsce, dzięki czemu możliwe jest schowanie przed użytkownikiem informacji, które przetrwają formatowanie partycji lub całego nośnika (szybkie lub pełne) i prawdopodobnie uruchomionego Trim. HPA za to nie przetrwa Secure Erase. Dawniej producenci np. laptopów używali HPA dla partycji recovery, dziś jest to już praktycznie relikt przeszłości.
Poradnik opiera się na Linuksie ponieważ to właśnie w tym środowisku obsługa będzie możliwie najwygodniejsza. Wersja hdparm na Windows bywa kapryśna, a PowerShell z WSL‑ami na czele wywołują stany depresyjne. Jeśli nie chcesz instalować „pingwina”, możesz użyć dowolnej dystrybucji typu live ponieważ wymagane narzędzia znajdują się w każdej (a już na pewno w ich repozytoriach).
1. Przygotuj dysk twardy z ilością wolnego miejsca większą
niż rozmiar przyszłej ukrytej partycji. W moim przypadku jest to
HDD z jedną partycją i ponad 512MiB nieprzydzielonego miejsca.
Jeśli już masz zajętą całą pamięć, to zmniejsz wielkość
ostatniej w kolejności partycji (uwaga: kopia tablicy partycji GPT z końca zostanie ubita, upewnij się więc że ta z początku jest nieuszkodzona jeśli nie używasz MBR).
2. Za pomocą fdisk, sprawdź na którym sektorze kończy się ostatnia widoczna partycja.
sudo fdisk -l /dev/sda
W moim przypadku jest to "sda1" i pod "End" widnieje LBA końca tejże partycji. Zapamiętaj tę wartość.
3. Teraz czas na ukrytą partycję. Nie może się ona znaleźć w tablicy partycji (inaczej trudno byłoby ją nazwać ukrytą i przysporzyłoby to dodatkowych i nierozwiązywalnych kłopotów), dlatego musisz się wpiąć „na żywca” w zakres sektorów na dysku twardym.
sudo losetup loop2 --offset 155252737 --sizelimit 536870912 /dev/sda
W moim przypadku "loop2" ponieważ "loop0" i "loop1" są już zajęte. "Offset" to LBA końca ostatniej partycji zwiększony o dwa. "Sizelimit" to 512MiB, czyli dokładnie 536870912 bajtów.
4. Skoro już wyrżnąłeś kawałek z binarnego tortu do nowego wirtualnego urządzenia, to sformatuj tę, de facto partycję, na system plików który najbardziej ci odpowiada. Ja wybrałem FAT32 ze względu na rozmiar.
sudo mkfs.vfat -n TAJNE /dev/loop2
"vfat"to właśnie FAT (dla tak małych partycji domyślnie FAT16, ale można użyć FAT32 lub dowolnie innego mkfs). Przełącznik "‑n" określa etykietę partycji.
5. Pozostaje już tylko zamontować system plików i wgrać w ten tajemniczy zakątek sekretne dane. A skoro zamontować, to trzeba jeszcze mieć gdzie – w moim przypadku jest to folder "cuda_i_dziwy" w katalogu domowym.
sudo mount /dev/loop2 /home/mint/cuda_i_dziwy
6. Po umeblowaniu, zdemontuj system plików i urządzenie.
sudo umount /home/mint/cuda_i_dziwy sudo losetup -d /dev/loop2
7. Przyszedł czas na kulminacyjny moment, czyli ukrycie ukrytej partycji poprzez ograniczenie ilości widocznych sektorów przed jej pierwszym sektorem.
sudo hdparm -N p155252736 --yes-i-know-what-i-am-doing /dev/sda
Tuż po "p", bez spacji należy wpisać LBA końcowe ostatniej widocznej partycji zwiększone o jeden.
Jeśli hdparm zgłosi błąd I/O to zahibernuj i odhibernuj komputer.
8. Od teraz twoje cenne dane są poza zasięgiem każdego oprogramowania, tak długo aż HPA nie zostanie zdjęty. Poniżej przykład z IsoBuster, który pokazuje dokładnie taką wielkość jaką ustawił hdparm:
I tutaj łyżka dziegciu: są dystrybucje Linuksa, które nie szanują HPA i podstępnie je usuwają przy starcie systemu… Można to sprawdzić np. w ten sposób:
cat /sys/module/libata/parameters/ignore_hpa
Jeśli zwrócona wartość wyniesie 1
to oznacza, że HPA nie przetrwa restartu Linuksa z tym konkretnym
kernelem. Jeśli 0, to wszystko w
porządku. Mimo swej agresywnej natury, Windows 10 (i starsze) nie usuwają HPA, DCO itp.
Są również BIOSy i UEFI, które tak samo złośliwie będą usuwać limit. I na to już nic poradzić niemożna jeśli w ustawieniach nie ma opcji wyłączenia tej funkcji.
9. Aby dostać się do ukrytych danych, trzeba proces odwrócić, czyli za pomocą hdparm, zdjąć HPA, znowu wykroić loop ze wskazanego wcześniej miejsca na HDD i zamontować system plików. Czyli powtórzyć kroki z punktów 3 i 5. Później wszystko pozdejmować jak w punkcie 6 i kolejny raz ukryć tak jak w 7.
Miłej zabawy. ;>