Reinstalacja kernela i bootloader'a

Spis treści

Wykorzystywanie pełnego szyfrowania dysku twardego ma jedną zasadniczą wadę. O ile nasze dane są należycie zabezpieczone, o tyle trzeba zwracać uwagę na to komu zezwalamy na dostęp do naszego komputera. Nie chodzi tutaj o to, kto będzie używał samego systemu operacyjnego, choć to też jest ważne, ale przede wszystkim chodzi o te osoby, które mają dostęp fizyczny do naszej maszyny. Czasem możemy nabrać podejrzenia, że ktoś mógł nam jakąś pluskwę podłożyć. Wykrycie takiego robala, np. w postaci sprzętowego keylogger'a, nie powinno sprawić problemów. Z kolei już manipulacja boot sektorem dysku twardego, lub też zmiany w initramfs, który znajduje się na niezaszyfrowanej partycji /boot/ mogą przejść niezauważone. Jak zatem odratować system, co do którego mamy jakieś zastrzeżenia?

Dostęp do zaszyfrowanego dysku z poziomu systemu live

Przede wszystkim, jeśli już mamy jakieś wątpliwości co do wiarygodności naszego sprzętu i jest on wyłączony, to nie powinniśmy go uruchamiać, a tym bardziej odblokowywać zaszyfrowanych partycji. Jest bowiem duże prawdopodobieństwo, że znaki z klawiatury, które zostaną przekazane systemowi, trafią także w niepowołane ręce. Jeśli po rozkręceniu maszyny nie dostrzegliśmy żadnych zmian w sprzęcie, możemy przejść do drugiej fazy, tj. tej programowej, gdzie będzie nam potrzebny inny system operacyjny, najlepiej ten z rodziny live. Chyba wszystkie dystrybucje linux'a mają już swój zestaw płytek live. Debian swoje obrazy live trzyma tutaj i jeśli nie mamy akurat żadnej pod ręką, to powinniśmy jakąś sobie szybko dociągnąć.

Boot sektor (MBR)

Boot sektor, to pierwszy sektor dysku twardego, w którym znajdują się informacje o położeniu kodu programu ładującego system. Ten sektor jest niezabezpieczony w żaden sposób i jest wielce podatny na zmiany. Został nawet opracowany dedykowany atak evilmaid pod kątem tego sektora rozruchowego.

Mając na uwadze powyższe, musimy wyczyścić MBR ale też nie cały. Znajdują się tam też informacje o strukturze partycji i ich nie można nam ruszyć. Obszar który musimy wyczyścić to jedynie pierwsze 446 bajtów. Odpalamy zatem system live i wpisujemy w terminalu te poniższe polecenia:

$ sudo su
# dd if=/dev/urandom of /dev/sda bs=446 count=1

Wolna przestrzeń za MBR (MBR gap)

Większość narzędzi do partycjonowania dysków, tworzy partycje z uwzględnieniem wyrównania do 1MiB. Jest to za sprawą technologi Advanced Format, którą stosują obecnie wszystkie nowsze dyski twarde. Równanie do 1MiB powoduje przesunięcie pierwszej partycji o 2047 sektorów względem MBR. Jako, że MBR znajduje się na pozycji 0, to pierwsza partycja będzie się zaczynać od sektora 2048. By dokładnie zweryfikować ustawienia partycji, trzeba zajrzeć do fdisk :

# fdisk -l
...
Device     Boot     Start       End   Sectors   Size Id Type
/dev/sda1            2048  83888127  83886080    40G  7 HPFS/NTFS/exFAT
...

Te wolne 2047 sektorów służyło kiedyś do przechowywania części kodu bootloader'a. Obecnie są one w dużej mierze nieużywane. Te wirusy, które potrafią modyfikować MBR, potrafią ulokować cześć swojego kodu właśnie w tej wolnej przestrzeni za sektorem rozruchowym. Wobec czego, przydałoby się tę przestrzeń również wyczyścić:

dd if=/dev/urandom of /dev/sda bs=512 count=2047 seek=1

Partycja /boot/

Na partycji /boot/ znajdują się obrazy z modułami kernela oraz szereg plików konfiguracyjnych i skryptów, które umożliwiają zamontowanie głównego systemu plików przy starcie systemu. Pliki na tej partycji, podobnie jak MBR, nie są w żaden sposób zabezpieczone. Dlatego też musimy kompletnie wyczyścić tę partycję:

# dd if=/dev/urandom of /dev/sda3

Wykorzystanie chroot

Musimy teraz przywrócić kopię MBR i stworzyć nową partycję /boot/ , np. przy użyciu gparted. Jeśli nie posiadamy kopi MBR, to jako że potrzebny nam jest tylko kod bootloader'a, będziemy musieli go przeinstalować ale po kolei. Na sam początek otwieramy szyfrowany system:

# cryptsetup luksOpen /dev/sda4 sda4_crypt
# vgscan
# vgchange nazwa_grupy -a y
# lvscan

Pamiętajmy by odpowiednio zmodyfikować parametr sda4_crypt i by ta nazwa zgadzała się z tą zdefiniowaną w pliku /etc/crypttab . Po wydaniu ostatniego polecenia powinniśmy uzyskać listę aktywnych dysków LVM. Musimy teraz zamontować wszystkie niezbędne partycje i przy pomocy chroot uzyskać dostęp do tego systemu. Pamiętajmy też by podmontować partycję /boot/ w odpowiednim miejscu.

# mount /dev/mapper/sda4_crypt-root /mnt
# mount /dev/sda3 /mnt/boot
# mount -o bind /proc /mnt/proc
# mount -o bind /sys /mnt/sys
# mount -o bind /dev /mnt/dev
# mount -o bind /dev/pts /mnt/dev/pts
# cp /etc/resolv.conf /mnt/etc/resolv.conf

Teraz już pozostało nam zrootować środowisko i zalogować się na szyfrowany system:

# chroot /mnt/ /bin/bash

Reinstalacja bootloader'a

Za pomocą menadżerów pakietów apt-get lub aptitude reinstalujemy bootloader. Ja korzystam z extlinux , także jego reinstalacja sprowadza się do wydania tych dwóch poniższych poleceń:

# dd if=/usr/lib/SYSLINUX/mbr.bin bs=440 count=1 iflag=fullblock conv=notrunc of=/dev/sda
# extlinux -i /mnt/boot/extlinux

Jako, że usunęliśmy wszystkie pliki z katalogu /boot/ , sama reinstalacja bootloader'a nam nie odpali systemu. Ptrzebujemy jeszcze plików konfiguracyjnych bootloader'a. Jeśli korzystamy z automatów, to wystarczy przeinstalować określone pakiety:

# aptitude reinstall extlinux syslinux-common syslinux-utils

Musimy także zaktualizować numerk UUID partycji /boot/ w pliku /etc/fstab , a ten z kolei możemy uzyskać przy pomocy lsblk :

# lsblk -o "NAME,SIZE,FSTYPE,TYPE,LABEL,MOUNTPOINT,UUID"
NAME                       SIZE FSTYPE      TYPE  LABEL       MOUNTPOINT   UUID
...
├─sda3                       1G ext4        part  boot        /boot        4c67dff5-3d8e-4b3f-9cf1-49b88d5f67a9
...

Reinstalacja kernela

Nieuchronna będzie także reinstalacja kernela. Sprowadza się ona do przeinstalowania pakietów, które mają w nazwie linux- . Możemy to zrobić przy pomocy poniższego polecenia:

# aptitude reinstall linux-~i

Czasem reinstalacja kernela może powodować problemy. Jeśli nie dałoby rady przeinstalować tych powyższych pakietów, trzeba będzie je usunąć (opcja purge ) i ponownie zainstalować.

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.