1 Предзагрузка
Last updated
Last updated
Работа проводится в среде виртуальной машины Preloader.
Виртуальная машина функционирует под управлением ОС Debian GNU/Linux 10 в графической среде XFCE4.
Для входа в систему необходимо использовать следующие учетные данные:
Имя пользователя: root
Пароль: P@ssw0rd
Для переноса необходимых файлов в виртуальную машину нужно создать специальный объект – Общую папку в свойствах виртуальной машины (см. рисунок).
Созданные общие папки доступны в виртуальной машине по пути /mnt/hgfs. Если папки отсутствуют по указанному пути, необходимо выполнить команду mount /mnt/hgfs.
Для проведения практического занятия на рабочей станции должно быть установлено ПО:
· VMWare Workstation (или VMware Workstation Pro);
· Редактор HxD;
· Комплект утилит plpboot.
Для проведения лабораторной работы на рабочую станцию должна быть скопирована виртуальная машина Preloader.
Для проведения лабораторной работы необходимо создать специализированную виртуальную машину для эмулятора QEMU.
Для создания виртуальной машины необходимо:
1. Создать директорию для размещения файлов виртуальной машины (например, /root/test-machine) с помощью команды mkdir.
2. Скопировать загрузочный образ дисковода для гибких магнитных дисков с ОС MS Dos (имя файла Dos6.22.img).
3. Создать файл-образ жесткого диска с помощью команды dd if=/dev/zero of=/root/test-machine/hdimage.img bs=512 count=204800. В результате выполнения команды вы получите файл размером 100 Мб, заполненный нулевыми символами.
4. Подключить созданный образ в качестве виртуального блочного устройства с помощью команды losetup –f /root/test-machine/hdimage.img. В системе создастся виртуальное устройство с именем /dev/loopX, где X – номер от 0 до 9. Чтобы узнать какое конкретно устройство соответствует файлу образа диска можно воспользоваться командой losetup –a.
5. Создать таблицу разделов на образе жесткого диска и раздел типа FAT16 с помощью утилиты fdisk, для чего запустить команду fdisk /dev/loopX, после чего использовать команды утилиты o (для создания таблицы разделов) n (для создания раздела, при этом указать тип primary), a, чтобы указать созданный раздел как загрузочный и t, чтобы указать тип раздела FAT16. Запись таблицы разделов производится командой w, сведения о текущей конфигурации таблицы разделов выводятся командой p. Команда m позволяет в любой момент вывести справку по использованию утилиты.
Запуск эмулятора qemu производится посредством команды qemu-system-i386, которая создает виртуальную машину со стандартным аппаратным обеспечением IBP-PC совместимого компьютера.
При запуске с помощью опций производится настройка аппаратного обеспечения виртуальной машины, а также параметров BIOS (см. таблицу).
Опция
Примечания
-fda <имя файла>
Использовать <имя файла> в качестве образа гибкого магнитного диска
-hda <имя файла>
Использовать <имя файла> в качестве образа жесткого магнитного диска
-net <устройство>
Использовать <устройство> в качестве сетевого интерфейса виртуальной машины. Вариант –net none указывает на отсутствие сетевого интерфейса у виртуальной машины (используется для блокирования попыток загрузки по сети)
-boot order=…
Задать порядок опроса загрузочных устройств для BIOS. Устройства задаются буквенными обозначениями:
a – первый дисковод гибких магнитных дисков
b- второй дисковод гибких магнитных дисков
c – первый жесткий диск
d – первый CD-ROM
n – сетевой адаптер
option-rom <имя файла>
Загрузить образ расширения PnP BIOS, содержащийся в <имя файла>
-chardev stdio,id=seabios –device isa-debugcon, iobase=0x402,chardev=seabios
Перенаправление специального порта отладки в экран консоли.
Произведите запуск виртуальной машины qemu с подключенным образом гибкого диска (Dos6.22.img) и жесткого диска (hdimage.img). Укажите порядок загрузки: сначала гибкие диски, затем жесткие диски.
При успешном выполнении задания запускается отдельное окно эмулятора Qemu, в котором отображается командная строка ОС MS-DOS (см. рисунок).
С помощью команды format /S c: произведите форматирование раздела жесткого диска и установку загрузчика в первый сектор раздела.
Остановите текущую виртуальную машину и запустите ее повторно, изменив порядок загрузки: в качестве первого устройства укажите жесткий диск, а гибкий диск – в качестве второго. Убедитесь, что загрузка первого раздела жесткого диска не производится (система «зависает» после вывода надписи «Booting from Hard Disk…». Остановите виртуальную машину.
Эта ситуация вызвана тем, что BIOS не поддерживает напрямую анализ таблицы разделов с выбором активного раздела для загрузки ОС – эту операцию делает специальный предзагрузчик, устанавливаемый в первый сектор жесткого диска (называемый Master Boot Record – MBR). Использованная для создания таблицы разделов утилита fdisk не производит установку этого предзагрузчика.
Скопируйте образ жесткого диска на хостовую машину и откройте его с помощью редактора HxD. Убедитесь, что в MBR отсутствует код загрузчика (сектор начинается с нулевых байт). Укажите значение двух последних байт MBR в отчете (длина сектора – 512 байт).
Поменяйте 2 последних байта MBR на любое другое значение (см. рисунок). Сохраните модифицированный образ и скопируйте его обратно на виртуальную машину Preloader.
Запустите эмулятор Qemu, указав в параметрах только образ жесткого диска и опцию –net none для отключения попыток сетевой загрузки. Обратите внимание, что BIOS не передал управление коду, размещенному в секторе MBR, так как в конце сектора отсутствовала стандартная сигнатура MBR (см. рисунок).
Подключите повторно образ жесткого диска в качестве loopback устройства (предварительно удалите старое сопоставление с помощью команды losetup –D).
Разместите в MBR стандартный предзагрузчик Windows с помощью команды ms-sys --mbr7 -f /dev/loopX
Запустите эмулятор Qemu, подключив к нему образы жесткого диска и гибкого диска и указав приоритет загрузки для жесткого диска.
Убедитесь, что произошла загрузка ОС с первого раздела жесткого диска.
Оставите эмулятор Qemu, отключите loopback устройства (командой losetup –D).
Подключите образ жесткого диска в качестве виртуального устройства с поддержкой разделов с помощью команды losetup –f –P hdimage.img. Теперь помимо устройства loopX у вас создалось устройство loopXp1, соответствующее первому разделу образа жесткого диска (может не отображаться).
Создайте точку монтирования командой mkdir (например, mkdir /mnt/hdimg).
Подмонтируйте виртуальный раздел командой mount –t vfat /dev/loopXp1 <точка монтирования>.
Создайте каталог boot в подмонтированном разделе (mkdir <точка монтирования>/boot).
Скопируйте в созданный каталог системные файлы загрузчика GRUB (cp –rp /usr/lib/grub/i386-pc/ <точка монтирования>/boot/grub)
Установите загрузчик GRUB в первый раздел жесткого диска с помощью команды grub-install --boot-directory <точка монтирования>/boot --force /dev/loopXp1
Отмонтируйте образ жесткого диска с помощью команды umount /dev/loopXp1 и отключите loopback устройство.
Запустите эмулятор Qemu, указав образы гибкого и жесткого дисков и приоритет загрузки для жесткого диска, затем для гибкого диска. Убедитесь, что у вас успешно запустился загрузчик GRUB (см. рисунок).
Приоритеты загрузки сохраняются BIOS в специальной энергонезависимой памяти (NVRAM), в роли которой выступает Flash память на современных системах и КМОП (CMOS) память на более старых системах. По умолчанию Qemu эмулирует работу CMOS памяти, при этом значения CMOS памяти между запусками не сохраняются (по этой причине мы каждый раз указываем параметры приоритета загрузки). В реальной системе параметры в CMOS памяти сохраняются после выключения компьютера.
Доступ к ПО BIOS, позволяющему менять параметры BIOS (в том числе, параметры загрузки) может быть защищен с помощью пароля, так как параметры BIOS критичны с точки зрения безопасности работы системы в целом. В частности, загрузка с альтернативного носителя позволяет злоумышленнику получить доступ к данным компьютера в обход механизмов безопасности ОС.
При этом любое ПО, функционирующее в среде BIOS (например, загрузчик ОС) имеет те же возможности по чтению и записи CMOS памяти, что и основная программа BIOS. Соответственно, приоритет загрузки может быть изменен в обход парольной защиты утилиты настройки параметров BIOS.
Порядок загрузки BIOS эмулятора Qemu сохранен в двух байтах памяти CMOS, расположенных по адресам 0x38 и 0x3D.
Загрузчик GRUB позволяет просматривать и изменять память CMOS при помощи встроенных команд: cmosdump, cmosset и cmosclean.
Команда cmosdump не имеет параметров и выводит текущее содержимое памяти CMOS (см. рисунок).
Команды cmosset и cmosclean позволяют модифицировать отдельные биты ячеек памяти CMOS. Обе команды принимают аргумент вида: <адрес ячейки>:<номер бита>, где:
<адрес ячейки> – адрес в памяти CMOS, записанный в десятичном виде (в отличие от cmosdump, выводящей адреса в 16-тиричном виде).
<номер бита> – порядковый номер бита в указанной ячейке CMOS, начиная с 0 (младший бит) и до 7 (старший бит).
Команда cmosset присваивает указанному в параметре биту значение 1, а команда cmosclean присваивает указанному в параметре биту значение 0 (см. рисунок).
С помощью команд манипуляции CMOS памятью загрузчика GRUB выполните:
1. Измените приоритет загрузки на «гибкий диск – жесткий диск» с помощью команд GRUB (заменить значение байта 0x3D с 12 на 21).
2. Перезагрузите эмулятор (посредством меню Machine в окне эмулятора).
3. Убедитесь, что произошла загрузка MS-DOS с гибкого диска вместо загрузчика GRUB с жесткого диска.
Расширение PnP BIOS – специальное встроенное ПО, как правило, физически размещенное на платах расширения. Расширения PnP BIOS должны иметь стандартную структуру заголовка, посредством которой BIOS обнаруживает код расширения и инициализирует его.
Расширение содержит 2 заголовка:
1. Заголовок Option ROM (этот тип расширения использовался до спецификации Plug & Play платами, подключаемыми к шине ISA)
2. Заголовок PnP Expansion Header, содержащий дополнительные данные, предусмотренные спецификацией Plug & Play BIOS.
Структура заголовков PnP Option ROM и Expansion Header представлена на рисунке.
При загрузке Optional ROM BIOS передает управление дальним переходом по адресу, указанному в поле Initialization Entry Point заголовка Optional ROM.
По стандарту, встроенный код Optional ROM должен произвести необходимые манипуляции для инициализации устройства, после чего вернуть управление BIOS (опять-таки, в силу работы системы в реальном режиме, это действие не может быть проконтролировано со стороны кода BIOS и остается исключительно на совести разработчика Optional ROM).
Далее BIOS передаст управление коду Optional ROM только при поиске загрузчика ОС (по аналогии с загрузкой с других носителей). Передача управления производится переходом по вектору BCV или BEV (в зависимости от типа устройства). Управление, полученное после перехода по векторам BCV или BEV может не возвращаться BIOS (возврат происходит только, если не удается произвести дальнейший процесс загрузки).
Таким образом, любая плата расширения имеет возможность полного перехвата управления над компьютером на начальной фазе загрузки.
Выполните подготовку образа Optional ROM для инъекции в процесс загрузки:
1. В каталоге утилит plpboot перейдите в подкаталог plpbtrom-0.6
2. Выполните команду plpbtrom.exe plpbt.bin plpbtrom.rom
3. Скопируйте файл plpbtrom.rom на виртуальную машину Preloader.
Запустите эмулятор Qemu, указав в опции option-rom файл plpbtrom.rom (например, qemu-system-i386 –net none –option-rom plpbtrom.rom). После появления надписи «Booting from ROM…» нажмите клавишу Esc и убедитесь, что вы попали в интерфейс загрузчика PLP Boot Manager (см. рисунок).
Выключите эмулятор и запустите его повторно, указав в качестве жесткого диска файл образа hdimage.img (с установленным загрузчиком GRUB) и в качестве приоритетного устройства загрузки жесткий диск. Убедитесь, что произошел запуск загрузчика GRUB и PLP Boot Manager больше не появляется при нажатии клавиши Esc. Это произошло потому, что GRUB перехватил прерывание клавиатуры и заблокировал передачу управления другим сервисам.
Модифицируйте образ plpbtrom с помощью команды plpbtrom.exe -forceINT plpbt.bin plpbtrom.rom. Не забудьте перенести обновленный файл на виртуальную машину.
Повторно запустите эмуляцию Qemu с подключенными образами Optional ROM и жесткого диска (с приоритетом загрузки, установленным на жесткий диск). Убедитесь, что теперь PLP Boot Manager заблокировал нормальный ход загрузки компьютера, перехватив управление на себя.
Вновь создайте ROM файл без перехвата управления (plpbtrom.exe plpbt.bin plpbtrom.rom). Откройте ROM файл редактором HxD. Найдите в файле текстовые строки и внесите в них изменения (например, см. рисунок). Не меняйте общий размер файла.
Сохраните файл и скопируйте его на виртуальную машину. Запустите эмулятор с модифицированным ROM файлом и добавьте опцию вывода отладочной информации в консоль (см. таблицу с параметрами Qemu). Убедитесь, что запуск загрузчика не произошел, а в журнале отладки присутствует строка вида «Found option rom with bad checksum: loc=0x000c9800 len=44544 sum=60». Запуск ROM файла заблокировался BIOS по причине некорректной контрольной суммы.
Проверка контрольной суммы Optional ROM крайне проста: побайтово суммируется все содержимое файла (включая байт контрольной суммы), при корректном значении контрольной суммы на выходе должен получиться 0. Откорректируйте поле контрольной суммы (см. рисунки выше, чтобы найти местоположение значения контрольной суммы). Для корректировки контрольной суммы используйте функцию «Контрольные суммы» редактора HxD (доступна в меню «Анализ»).
После исправления контрольной суммы убедитесь, что загрузчик вновь получает управление от BIOS.
Для проведения лабораторной работы на рабочей станции должно быть дополнительно установлено ПО Microsoft Windows SDK.
В виртуальной машине Preloader создайте каталог для test-uefi в домашнем каталоге пользователя. Скопируйте в созданный каталог образ UEFI с помощью команды cp /usr/share/ovmf/OVMF.fd ~/test-uefi/bios.bin. Создайте внутри каталога test-uefi еще один каталог hd-contents.
Запустите эмулятор qemu с помощью команды qemu-system-x86_64 –pflash bios.bin –net none –hda fat:rw:hd-contents.
После окончания загрузки откроется приложение UEFI Shell (см. рисунок).
Остановите эмуляцию.
Скопируйте приложение HelloWorld.efi в каталог hd-contents с помощью команды cp /usr/src/edk2/Build/MdeModule/DEBUG_GCC5/X64/HelloWorld.efi ~/test-uefi/hd-contents. Повторно запустите эмуляцию с помощью команды, приведенной выше.
Перейдите на виртуальный раздел жесткого диска с помощью команды fs0: и убедитесь, что приложение HelloWorld.efi присутствует на жестком диске с помощью команды dir
Запустите приложение HelloWorld.efi и убедитесь, что оно успешно отработало (выведена строка «UEFI Hello World!»).
Таким образом, UEFI позволяет запускать произвольные сторонние приложения, в том числе, непосредственно с файловых систем подключенных носителей информации. Чтобы ограничить возможности потенциальных злоумышленников по внедрению вредоносного кода на уровне UEFI необходимо применять механизм SecureBoot, ограничивающий возможности запуска приложений и драйверов UEFI посредством контроля цифровой подписи приложений.
Для того, чтобы использовать механизм SecureBoot необходимо предварительно создать ряд ключевой информации, используемой для последующего формирования электронных подписей доверенных компонент UEFI:
1. Ключевая пара и сертификат открытого ключа для Platform Key (PK). Сертификат PK создается как самоподписанный сертификат, соответственно, он является корнем цепочки доверия.
2. Ключевая пара и сертификат открытого ключа для Key Exchange Key (KEK). Сертификат KEK подписывается с помощью PK, таким образом, он является доверенным сертификатом второго уровня.
Создание ключевой информации производится с помощью утилит для подписи кода, входящих в состав Microsoft Windows SDK.
На хостовой машине создайте каталог для хранения ключевой информации, последующие действия проводите в этом каталоге.
Создайте ключевую пару и сертификат PK с помощью команды C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x64\makecert.exe -n "CN=Test_PK" -r -sv TestPK.pvk TestPK.cer. В случае, если Windows SDK установлен по другому пути, соответствующим образом откорректировать путь до утилиты makecert.
После запуска утилиты появится окно ввода пароля для защиты секретного ключа. Укажите в качестве пароля P@ssw0rd. После чего экран ввода пароля может появится еще раз – теперь уже для аутентификации при доступе к секретному ключу (при формировании электронной подписи сертификата).
В результате в каталоге должно появиться два файла: TestPK.pvk – файл секретного ключа и TestPK.cer – файл сертификата.
Создайте ключевую пару и сертификат KEK с помощью команды C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x64\makecert.exe -n "CN=Test_KEK" -iv TestPK.pvk -ic TestPK.cer -sv TestKEK.pvk TestKEK.cer. В ходе создания ключевой информации вам потребуется ввести пароль для нового секретного ключа (TestKEK.pvk), а затем сначала пароль для вновь созданного секретного ключа и для ранее созданного ключа PK. Чтобы не возникало путаницы с паролями – везде используйте пароль P@ssw0rd.
Скопируйте файлы сертификатов (файлы с расширением .cer) в каталог hd-contents виртуальной машины Preloader.
UEFI функционирует в режимах настройки или пользователя (Setup mode и User mode) в зависимости от наличия в системе установленного PK. Текущий режим может быть определен по переменной UEFI SetupMode. Если значение переменной равно 1, то система находится в режиме настройки, если 0 – то в режиме пользователя.
Просмотрите текущий режим UEFI с помощью команды setvar SetupMode.
Выйдете из приложения UEFI Shell с помощью команды exit, после чего вы должны попасть в утилиту настройки UEFI (см. рисунок).
Выберите в меню пункт «Device Manager», после чего «Secure Boot Configuration».
Выберите пункт «Secure Boot Mode» и переведите UEFI в режим «Custom mode». После чего перейдите в меню «Custom Secure Boot Options». Далее повторите действия для пунктов «PK Options» и «KEK Options»: выберите пункт «Enroll …», «Enroll … from file», выберите соответствующий .cer файл и сохраните изменения. После внесения в систему ключей выйдете из утилиты настройки и перезагрузите эмуляцию.
Попробуйте снова запустить приложение HelloWorld.efi. На этот раз должно появиться сообщение о нарушении политики безопасности (см. рисунок).
Остановите эмуляцию.
Сконвертируйте ключ KEK из формата pvk в формат pfx с помощью команды C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x64\pvk2pfx.exe -pvk TestKEK.pvk -pi P@ssw0rd -spc TestKEK.cer -pfx TestKEK.pfx -f
Скопируйте в каталог для хранения ключевой информации приложение HelloWorld.efi и сформируйте для него электронную подпись с помощью команды C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x64\signtool.exe sign /ac TestKEK.cer /f TestKEK.pfx /p P@ssw0rd /fd sha256 HelloWorld.efi. В проводнике откройте свойства файла HelloWorld.efi и проверьте отображение электронной подписи на вкладке «Цифровые подписи».
Скопируйте подписанное приложение в каталог hd-contents виртуальной машины.
Запустите эмуляцию и попытайтесь запустить приложение HelloWorld.efi. Попытка запуска вновь должна окончиться неуспешно, так как в параметрах Secure Boot не настроены разрешенные сигнатуры (переменная db). Снова запустите приложение настроек UEFI, где перейдите к настройке Custom Secure Boot Options.
Выберите блок DB options и попеременно добавьте сигнатуры:
1. Сертификата TestKEK.cer
2. Файла HelloWorld.efi
Убедитесь, что в обоих случаях файл HelloWorld.efi стал успешно запускаться. Отличие этих вариантов состоит в том, что при добавлении сигнатуры сертификата Secure Boot будет доверять всем приложениям, подписанным с помощью этого сертификата, а при добавлении подписи конкретного приложения – только этому приложению. Возможность вносить записи в DB и DBX в реальных системах требует наличия секретного ключа KEK или PK, но в эмуляции OVMF такое ограничение отсутствует.
Откройте подписанное приложение HelloWorld.efi редактором HxD. Измените строку «UEFI Hello World!», например, как показано на рисунке (замечание: строку можно найти поиском в редакторе, но необходимо выбрать кодировку UTF-16).
Скопируйте модифицированный файл обратно в каталог hd-contents и попытайтесь запустить его в оболочке UEFI.
После чего перейдите в настройки UEFI и снимите опцию «Attempt Secure Boot» в разделе меню «Secure Boot Configuration», сохраните изменения и перезапустите эмуляцию. Снова попробуйте запустить модифицированное приложение – на этот раз приложение запустится и выведет измененную строку приветствия (см. рисунок).
Таким образом, механизм Secure Boot надежно защищает окружение предзагрузки и гарантирует запуск ОС в доверенной среде, где отсутствуют внедренные вредоносные компоненты.