Копаем глубже. Как работают механизмы прошивки, рутинга и восстановления Android — Хакер

android skeleton Прошивки
Содержание
  1. Что это всё означает?
  2. Как ubuntu реализует загрузку в secure boot с шифрованием всего диска и что с этим не так?
  3. Основные разделы
  4. Aboot, fastboot и tamper-бит
  5. Recovery, edify и aroma installer
  6. Root insecure adb
  7. Secure boot на ноутбуках леново и тошиба
  8. Бонус: возвращение гибернации
  9. Загрузчики
  10. Как отключить secure boot и uefi на ноутбуке acer aspire?
  11. Как отключить secure boot на материнской плате gigabyte?
  12. Как отключить защиту secure boot в биосе?
  13. Как узнать активирована ли функция secure boot на windows?
  14. Компиляция
  15. Материнские платы и ноутбуки асус
  16. Настройка
  17. Настройка crypttab, fstab и resume
  18. Настройка secure boot
  19. Ограничения решений «из коробки»
  20. Отключение secure boot на ноутбуках pavilion и других моделях hp?
  21. Отключения secure boot на материнских платах
  22. Очевидные советы
  23. Подписывание драйверов и модулей ядра
  24. Примеры отключения secure boot на разных ноутбуках и материнских платах
  25. Примечания
  26. Раздел boot и ядро
  27. Разметка и шифрование
  28. Создание загрузчика
  29. Способ 3. скомпилировать своё ядро
  30. Получение исходного кода
  31. Настройка
  32. Компиляция
  33. Способ 4. отказ от гибернации и использование виртуализации
  34. Установка
  35. Установка ubuntu с шифрованием всего диска с помощью luks и lvm
  36. Заключение
  37. Выводы
  38. Узнайте больше о Huawei

Что это всё означает?

Если в вашей системе есть ключ Microsoft3, то кто угодно может загрузиться с внешнего устройства, установить буткит и получить полный контроль над вашим устройством. Нет небходимости отключать Secure Boot: он уже не работает.

Копаем глубже. Как работают механизмы прошивки, рутинга и восстановления Android — Хакер

Согласно политике Microsoft о подписывании UEFI-приложений, все подписанные загрузчики GRUB и shim, используемые для загрузки GRUB, уже должны быть занесены в чёрный список.

Говорите, нужно просто отключить загрузку с внешних устройств? Это борьба с симптомами. Если у вас установлен незащищённый GRUB, то вас это не спасёт. Если на вашем устройстве стоит Windows, то вы можете выбрать из неё устройство для загрузки, и есть вероятность, что ваша прошивка это позволит4. Ещё остаётся PXE Network Boot. Поможет только пароль на включение устройства.

Как ubuntu реализует загрузку в secure boot с шифрованием всего диска и что с этим не так?

Red Hat разработали загрузчик shim, чтобы он работал на всех устройствах и служил на благо человечеству, соблюдая строгие предписания стандарта Secure Boot и загружая только доверенные UEFI-приложения. Canonical использует shim как прокси, встраивая в него свой публичный ключ и подписывая у Microsoft. Shim загружает GRUB, подписанный ключём Canonical, который затем загружает ядро, подписанное Canonical.

Основные разделы

Для начала стоит отметить, что в Интернете информация про основные разделы накопителя давно устарела: после Project Treble добавился раздел vendor, а позже была выпущена arm64_ab архитектура с принципиально новой таблицей разделов и монтированием системного раздела в корень (SAR, System As Root).

BOOT — ядро Android.

VENDOR — раздел, содержащий много бинарников и драйверов для всего и вся. Ранее все эти бинарники находились в системном разделе, с приходом Project Treble их отделили в отдельный раздел.

PRODUCT — новый раздел (его добавили в конце 2022 года), содержащий предустановленные приложения и сервисы.

SYSTEM — главный системный раздел. В нем содержатся фреймворки, множество файлов-пропов, fstab, оверлеи, RRO, ПО для работы с бинарниками из vendor. Ранее в этом разделе хранили еще и приложения (хранят и сейчас, но только самые важные).

Aboot, fastboot и tamper-бит

Если не брать в расчет небольшой код инициализации, располагающийся в ROM-памяти устройства и специфичный для каждого чипа, то загрузка Android начинается с aboot. Это стандартный загрузчик устройств на базе Android, разработкой которого занимается сама Google.

Ключевая особенность aboot в том, что это модульный загрузчик и к нему при сборке можно подключать разные сопрограммы, каждая из которых будет исполняться в отдельном потоке (что делает aboot миниатюрной ОС). Одна из таких сопрограмм — fastboot, реализация протокола и механизмов для записи разделов внутренней NAND-памяти.

В среде энтузиастов fastboot обычно используется для установки кастомного recovery. Для этого достаточно включить смартфон с зажатыми клавишами управления громкостью (на большинстве смартфонов), затем с их же помощью выбрать в меню пункт Fastboot, подключить смартфон с помощью USB-кабеля к компу и выполнить такую команду (она входит в комплект Android SDK):

$ fastboot flash recovery образ-recovery.img

Причем recovery можно даже не прошивать, а запустить прямо с компа (эту функцию, кстати, использует инструмент CF-Auto-Root, но о нем позже):

$ fastboot boot образ-recovery.img
Справка по командам fastboot
Справка по командам fastboot

Однако эти команды не сработают, если загрузчик залочен. Чтобы его разблокировать, на смартфонах линейки Nexus и OnePlus достаточно выполнить такую команду (все, что начинается с oem, — это команды, встроенные производителем смартфона):

$ fastboot oem unlock

Что делает эта команда? В нексусах она выполняет сброс до заводских настроек и записывает один бит в специальный раздел в памяти устройства, служащий индикатором разлочки для самого загрузчика. В Nexus 4 и 5 это раздел misc и адрес 16400, в других нексусах это может быть раздел param (Nexus 10) или даже aboot (Nexus 7/2022 и OnePlus One).

Начиная с Nexus 6 и 9, Google навела в этом бардаке порядок и ввела понятие Persistent-раздела для хранения не зависящих от Android настроек. Имя этого раздела хранится в системной переменной ro.frp.pst, и его в любой момент можно получить с помощью такой команды (запускать на самом устройстве):

$ getprop ro.frp.pst

Как видно, все довольно просто, и, если говорить о нексусах, здесь «залоченный загрузчик» — это просто защита от дурака (собственно, как и должно быть в референсных смартфонах). Загрузчики в обычных смартфонах разработки Samsung, HTC, LG, Motorola и других серьезных контор защищены гораздо лучше, и с помощью команды oem unlock или записи бита по определенному адресу их не вскроешь.

И в нексусах, и в смартфонах других компаний при разблокировке загрузчика всегда устанавливается так называемый tamper-бит. Сервисные центры смотрят именно на него, решая, признать ли случай гарантийным: даже если впоследствии загрузчик был заблокирован, tamper-бит однозначно свидетельствует о факте разблокировки.

Однако иногда этот бит можно сбросить. В нексусах все решается опять же простой записью бита по нужному адресу в нужный раздел, в других смартфонах это либо вообще невозможно сделать, либо приходится использовать специальные инструменты типа приложения Triangle Away (для Samsung’ов без KNOX).

Выясняем, установлен ли загрузчиком tamper-бит
Выясняем, установлен ли загрузчиком tamper-бит

Чтобы окончательно тебя запутать, скажу, что производители часто используют модульную архитектуру aboot для встраивания в него собственных средств прошивки и управления, работающих совместно с fastboot или даже вместо него. Наиболее яркий пример — это Odin в смартфонах Samsung.

Например, в чипах Allwinner опенсорсный загрузчик uboot, который принято использовать в разного рода встраиваемых системах, например для роутеров. У MTK загрузчик собственного изготовления, разделенный на два компонента: preloader.bin, с которым работают фирменные утилиты прошивки SP Tools, и lk.bin, отвечающий за инициализацию оборудования.

HTC использует загрузчик hboot, не так уж и сильно отличающийся от aboot. У Rockchip также свой собственный загрузчик, интересная особенность которого в том, что инфа о разметке NAND-памяти не вшита в него намертво, а находится в начале самой памяти. Благодаря этому изменить размеры разделов в устройствах на базе Rockchip проще простого.

Исследуем таблицу разделов планшета на базе Rockchip 3066
Исследуем таблицу разделов планшета на базе Rockchip 3066

С загрузчиками закончим и перейдем к следующему компоненту загрузки.

Recovery, edify и aroma installer

Обнаружив зажатую клавишу увеличения громкости, aboot делает почти то же самое, что и при обычной загрузке, но использует вместо boot раздел recovery. Разделы идентичны по своему формату и зачастую включают в себя одно и то же ядро, однако содержимое RAM-диска существенно отличается.

Стоковый recovery очень прост. Все, что содержит его RAM-диск, — это исполняемый файл /sbin/recovery и (не всегда) набор фоновых изображений в каталоге /res или любом другом. При загрузке ядро Linux запускает /sbin/recovery, а тот выводит на экран простенькое меню, с помощью которого можно установить прошивку, подписанную цифровым ключом производителя, или произвести сброс до заводских настроек.

Кастомные recovery намного сложнее. Это уже не просто меню с фоновым рисунком, но целая операционная система, способная устанавливать какие угодно прошивки, делать бэкап, форматировать разделы и многое другое. Современные версии TWRP так и вообще поддерживают управление с помощью тач-интерфейса, сменные шкурки, полностью изменяющие внешний вид recovery, пароль для входа и эмулятор терминала вместе с экранной клавиатурой.

Плюс ко всему кастомные recovery включают в себя BusyBox (набор утилит командной строки Linux) и сервер ADB, работающий с правами root. Так что режим recovery очень удобно использовать для отладки и таких операций, как, скажем, дамп разделов. Например, раздела boot (пример для чипов Qualcomm):

Root insecure adb

Ну и в конце пара слов о том, что такое root. Начнем со всем известных азов: в Linux root — это имя пользователя с безграничными правами в системе (типа администратора в Windows). Root может вообще все, вплоть до удаления всей системы с диска (именно это делает знаменитая команда “rm -rf /*), поэтому обычно никто не сидит, так сказать, под рутом, а использует непривилегированный аккаунт.

Чтобы иметь возможность выполнять операции с правами root (например, устанавливать софт или управлять сервисами), можно использовать разные приложения (команды), одна из которых носит имя su. Она позволяет получить права root или любого другого пользователя в системе, пароль которого тебе известен.

В Android с правами root работает исключительно сама система (и то далеко не вся), тогда как сервер ADB и приложения исполняются с правами непривилегированных пользователей (по одному пользователю Linux на каждое приложение, серьезно), а команды su нет вообще.

Поэтому единственный способ получить права root в такой ситуации — воспользоваться уязвимостью в одном из системных компонентов, работающих с правами root. Таким образом можно не просто временно заполучить права root, но и использовать их, чтобы разместить в системе бинарник su (скопировать в /system/xbin, например) и поставить на него SETUID-бит. Именно так работают все наиболее популярные инструменты рутинга, от Super One Click до framaroot.

Secure boot на ноутбуках леново и тошиба

Для входа в UEFI на этих устройствах нужно жать F12, после чего выполнять следующие действия:

  • перейдите во вкладку “Security”;
  • установите для критерия “Secure Boot” опцию “Disabled”;
  • перейдите на вкладку “Advanced”, а в ней зайдите в меню “System Configuration”;
  • установите для критерия “Boot Mode (OS Mode Selection)” опцию “CSM Boot (CMS OS), (UEFI and Legacy OS)”;
  • сохраните все нажатием на F10 => “Yes”.

Бонус: возвращение гибернации

При шифровании всего диска вместо ждущего режима для сохранения состояния и продолжения работы с места остановки обычно используется гибернация, она же спящий режим или suspend to disk.

Из соображений безопасности разработчики ядра отключили возможность гибернации при включённом верифицировании модулей ядра. Аргументируется это тем, что образ восстановления не верифицируется при пробуждении, раздел подкачки может быть подменён и тогда система проснётся с непроверенным и потенциально вредоносным кодом.

Копаем глубже. Как работают механизмы прошивки, рутинга и восстановления Android — Хакер

Это верно в том случае, если initramfs не верифицируется и/или раздел подкачки не зашифрован. Однако независимо от использования гибернации при таких условиях initramfs может быть подменён, а чувствительные данные восстановлены из раздела подкачки. В нашей конфигурации initramfs верифицируется, будучи включённым в подписанный загрузочный файл, а раздел подкачки зашифрован. Значит, данное ограничение для нас бессмысленно.

Chung-Yi Lee ещё в 2022 предложил верифицировать образ восстановления, а в 2022 представил реализующий его идею патч. Но воз и ныне там. Поэтому предположим, что мы достаточно защищены с нашим шифрованием, и вернём нам гибернацию без верификации.

Загрузчики

Загрузчик ОС предназначен для того, чтобы непосредственно загружать эту ОС. О том, как Android запускается, вы узнаете в моих следующих статьях.

Как нам известно, Android имеет несколько альтернативных режимов загрузки. Подробнее о них вы узнаете в моей следующей статье.

ABOOT (UBOOT на МТК) — первичный загрузчик. В этом разделе содержится низкоуровневое ПО для обработки нажатий кнопок питания и громкости. Каждая комбинация клавиш соответствует своему режиму загрузки.

SBL — вторичный загрузчик. Его код выполняется после aboot и в зависимости от режима загрузки загружает или ядро — boot.img, или recovery boot, или fastboot.

Как отключить secure boot и uefi на ноутбуке acer aspire?

Есть много моделей ноутбуков этого производителя, но специфика такова, что сначала требуется создать собственный пароль. Общий алгоритм действия следующий:

  • заходите в BIOS-UEFI нажатием на клавишу F2 или Delete;
  • переходите во вкладку “Security”, выбираете опцию “Set Supervisor Password”;
  • в специальном окошке 2 раза вводите пароль. Не изощряйтесь, используйте простую комбинацию;
  • успешность будет подтверждена сообщением “Changes have been saved”;
  • переходите во вкладку “Boot” и в строке “Boot Mode” указываете значение “Legacy”;
  • жмете F10 и выполняете запись модификаций установок;
  • при последующей перегрузке снова войдите в UEFI;
  • переходите во вкладку “Security”, выбираете опцию “Set Supervisor Password”, вводите ранее указанный пароль;
  • переходите во вкладку “Boot” и в строке “Secure Boot” указываете значение “Disabled”;
  • снова сохраняете изменения.

Как отключить secure boot на материнской плате gigabyte?

После входа в UEFI (нажатием на F12 перед запуском ОС) действуйте следующим образом:

  • перейдите во вкладку “BIOS Features”;
  • установите для критерия “Windows 8 Features” опцию “Other OS”;
  • для критерия “Boot Mode Selection” — “Legacy only” или “UEFI and Legacy” (между ними нет особой разницы);
  • для критерия “Other PCI Device ROM Priority” – “Legacy OpROM”.

После всего нужно выполнить запись изменений, то есть нажать F10 => “OK”.

Как отключить защиту secure boot в биосе?

Отметим, что некоторые пользователи ошибочно думают, что протокол Secure Boot отключается в BIOS. У этой достаточно примитивной прошивки нет, не было, и не может быть поддержки СекюрБут. Этот протокол безопасности работает исключительно на UEFI и отключение нужно производить именно там.

Как узнать активирована ли функция secure boot на windows?

Этот протокол несложно активировать и деактивировать, а для понимания текущего статуса есть несколько проверенных подходов:

  1. При помощи сведений о системе. Запустите утилиту “Выполнить”. Для этого необходимо зажать комбинацию клавиш Win R, в появившейся строке ввести msinfo32 и нажать на Enter. Возникнет новое окно. Убедитесь, что в его левой панели выбрана строчка “Сведения о системе”. В правой панели ищите строку “Состояние безопасной загрузки”, у которой есть только 2 значения “Включить” и “Отключить”.
  2. При помощи PowerShell. В утилите “Выполнить” запустите команду powershell. Откроется новое окно, в которое скопируйте следующее: Confirm-SecureBootUEFI. Если на этот запрос выдаст ответ “True”, то значит опция активна, а если “False”, то деактивированна. Если же появится уведомление иного характера, то значит материнка не поддерживает функцию Secure Boot.
  3. Эмпирическим путем. Создайте загрузочную флешку с Windows и попробуйте загрузиться с нее после перезагрузки компьютера. Если все получается успешно, то значит опция выключена, при иных обстоятельствах будет отображаться соответствующее сообщение о невозможности загрузки по соображениям безопасности.

Компиляция

Запустите чистку ещё раз и скомпилируйте ядро. Если вы не опытный разработчик ядра и не понимаете, как работают проверки ABI и модулей (я вот не понимаю), отключите их (skipabi=true, skipmodule=true), иначе ваша компиляция сломается на одном из последних этапов.

fakeroot debian/rules clean
skipabi=true skipmodule=true DEB_BUILD_OPTIONS=parallel=$(getconf _NPROCESSORS_ONLN) do_tools=false no_dumpfile=1 
fakeroot debianrules binary-generic

Если компиляция прошла успешно, то в вашей домашней директории появятся три пакета .deb. Необходимо установить linux-image-<version>.deb, а также желательно linux-image-extra-<version>.deb. Это можно сделать с помощью dpkg -i <путь к пакету> или через QApt, открыв пакет в файловом менеджере, если он это поддерживает. Будьте осторожны: если вы не изменяли версию ABI, то старое ядро и модули перезапишутся.

Снова соберите загрузочный файл.

Материнские платы и ноутбуки асус

Сразу отметим, что чаще всего на материнках именно этого производителя появляется ошибка при загрузке ОС: Invalid signature detected. Check Secure Boot Policy in Setup. В большинстве случаев для устранения проблемы следует выключить Secure Boot, а для этого необходимо:

Конкретно для ноутбуков Asus алгоритм будет следующим:

  • зайдите в UEFI;
  • перейдите во вкладку “Security”;
  • отыщите строчку “Secure Boot Control”, укажите в ней значение “Disabled”;
  • перейдите во вкладку “Boot”;
  • отыщите строчку “Fast Boot”, установите в ней значение “Disabled”, а в строке “Launch CSM” значение “Enabled”.

Настройка

Загрузите пакеты, требуемые для компиляции (build dependencies).

sudo apt-get build-dep
sudo apt-get ccache fakeroot kernel-package libncurses5-dev

Убедитесь, что скриптам выставлено право на исполнение, запустите чистку.

chmod a x debian/rules
chmod a x debian/scripts/*
chmod a x debian/scripts/misc/*
fakeroot debian/rules clean

Скопируйте старый файл конфигурации в текущую директорию, запустите конфигурацию, выберите Load и загрузите config. Больше изменять ничего не требуется, выйдите и сохраните конфигурацию — Exit → Yes.

cp /boot/config-4.4.0-34-generic config
fakeroot debian/rules editconfigs

Измените файл kernel/power/hibernate.c, убрав проверку secure_modules().

--- a/kernel/power/hibernate.c
    b/kernel/power/hibernate.c
@@ -67,7  67,7 @@ static const struct platform_hibernation_ops *hibernation_ops;

 bool hibernation_available(void)
 {
-   return ((nohibernate == 0) && !secure_modules());
    return (nohibernate == 0);
 }

 /**
--

Скрипты компиляции определяют версию ядра по последней записи в истории изменений (changelog) в директории debian.master. Добавьте новую запись, чтобы изменить версию.

EDITOR=nano debchange -c debian.master/changelog -l "custom"

К версии будет добавлен суффикс custom1, что отразится при сборке пакетов .deb и позволит установить их при уже установленных пакетах той же версии без суффикса. Однако этот суффикс распространяется только на имя пакета, но не на его содержимое: ядро и директория с его модулями будут иметь ту же версию 4.4.

linux (4.4.0-3400.53custom1) UNRELEASED; urgency=medium

  * Allow hibernation on Secure Boot
...

Настройка crypttab, fstab и resume

Смонтируйте корень установленной системы в /mnt, свяжите /dev, /sys и /proc с /mnt/dev, /mnt/sys и /mnt/proc соответственно, а также /etc/resolv.conf с /mnt/etc/resolv.conf, чтобы у вас был доступ к сети. Теперь смените корневой каталог с помощью chroot.

mount /dev/ubuntu/root /mnt
mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
mount --bind /proc /mnt/proc
mount --bind /etc/resolv.conf /mnt/etc/resolv.conf
chroot /mnt
mount -a # смонтировать ESP раздел в /boot/efi автоматически, если он записан установщиком в /etc/fstab

Вам необходимо вручную заполнить /etc/crypttab — файл, описывающий монтируемые при загрузке криптоконтейнеры.

nano /etc/crypttab

В него нужно добавить запись о /dev/sda2, монтируемом в /dev/mapper/sda2_crypt. Настроим монтирование по UUID, а не по имени устройства. Чтобы узнать UUID /dev/sda2, откройте другой терминал и воспользуйтесь командой:

sudo blkid

В строке, начинающейся с /dev/sda2, будет записан его UUID. Скопируйте его (Ctrl Shift C). В /etc/crypttab добавьте запись вида имя_маппинга UUID=<UUID> none luks, вставив UUID (Ctrl Shift V). Закройте nano, нажав Ctrl X и Y, подтвердив сохранение.

Копаем глубже. Как работают механизмы прошивки, рутинга и восстановления Android — Хакер

Проверьте, чтобы в /etc/fstab были правильно описаны монтируемые разделы, а в /etc/initramfs-tools/conf.d/resume указан раздел для пробуждения из гибернации.

Копаем глубже. Как работают механизмы прошивки, рутинга и восстановления Android — Хакер

После всех изменений обновите образ initramfs.

update-initramfs -u

Не выходите из системы и chroot,

Настройка secure boot

Генерацию ключей, их установку в прошивку и подписывание UEFI-приложений описал CodeRushздесь, поэтому я буду считать, что вы всё понимаете и умеете.

Остаётся только подписать созданный нами загрузчик.

sbsign --key ISK.key --cert ISK.pem --output BOOTX64.EFI ubuntu.efi

Поместите BOOTX64.EFI в каталог EFI/BOOT/ раздела EFI, с которого вы планируете загружаться.

Ограничения решений «из коробки»

Ubuntu, как и другие распространённые дистрибутивы, предлагает опцию шифрования всего диска с LVM во время установки. Дистрибутив в такой конфигурации без ошибок устанавливается на UEFI с активным Secure Boot.

Но Canonical в первую очередь заинтересована в работоспособности ОС на устройствах с включённым Secure Boot, а не в обеспечении безопасности за счёт него. Если вы хотите использовать Secure Boot как средство безопасности, то вы сами по себе.

Отключение secure boot на ноутбуках pavilion и других моделях hp?

  1. Для входа в биос жмите на ESC или ESC => F10 перед запуском Windows.
  2. Перейдите во вкладку “System Configuration”, а в ней отыщите строчку “Boot Options”.
  3. Установите для критерия “Secure Boot” опцию “Disabled”, а для критерия “Legacy support” – “Enabled”.
  4. Система спросит, действительно ли вы готовы изменить настройки – подтвердите это нажатием на “Yes”.
  5. В конце нужно сохранить выполненные изменения нажатием на F10 и подтверждением “Yes”.

При последующей перезагрузке будьте внимательны. Система перестрахуется и включит “защиту от дурака”. Нужно смотреть на то, что идет после надписи “Operating System Boot Mode Change (021)” – там будет указана цифровая последовательность. Наберите ее и нажмите Enter.

Если вам нужно просто отключить Secure Boot, то дальше ничего делать не нужно. Если же изначально все делалось ради возможности загрузиться с USB-носителя, то сразу после прохождения “защиты от дурака” жмите ESC, а потом F9. Установите требуемой флешке максимальный приоритет, чтобы она грузилась первой на жесткий диск.

Отключения secure boot на материнских платах

Рынок материнских плат для настольных компьютеров достаточно консервативен и явными лидерами являются 2 компании: Asus и Gigabyte. Они поставляют более половины всего оборудования, так что рассматривать способы деактивации Secure Boot рациональней всего именно в разрезе этих производителей.

В любом случае третье и четвертое место давно оккупировали MSI и ASRock, – первая четверка полностью состоит из компаний Тайваня. Итог: принципиальных различий в инструкции по отключению все равно не будет и большая часть пользователей найдет ниже именно то, что ищет.

Отметим, что перейти сразу в UEFI можно в некоторых случаях напрямую с Windows (от 8 версии и более поздних). Для этого пробуйте следующее:

  • На рабочем столе справа вызовите выдвижную панель.
  • После следуйте по пути:  “Параметры” => “Изменение параметров…” => “Обновление и…” => “Восстановление”;
  • В возникшем окне найдите опцию перезагрузки системы и установите в этой строке значение “Настройки по UEFI” или “Параметры встроенного ПО UEFI”;
  • После жмите на “Перезагрузить” и в дальнейшем должен автоматически запуститься UEFI.

Очевидные советы

Если вашей задачей стоит защита данных на устройстве, то Secure Boot выполнит свою работу и не больше. Остальное возлагается на вас.

  • Не добавляйте чужих ключей в прошивку. Даже от Microsoft. В первую очередь от Microsoft.

  • Не подписывайте UEFI Shell, KeyTool или другие приложения, имеющие доступ к записи в NVRAM. Используйте их в Setup Mode.

  • Не оставляйте устройство включённым без присмотра. Устройство в ждущем режиме (suspend to RAM) содержит в RAM расшифрованные данные и мастер-ключи от криптоконтейнеров.

  • Установите пароль на UEFI Setup не проще, чем от вашего криптоконтейнера.

  • При физическом доступе к внутренностям устройства можно отключить Secure Boot, сбросив память NVRAM или повредив её, а также оставить хардварную закладку. Такая атака успешна только тогда, когда она незаметна. Сделайте так, чтобы вы о ней могли узнать: заклейте винты на корпусе трудновоспроизводимыми стикерами, обмажьте их лаком с блёстками. Опечатайте своё устройство.

  • Поставьте первым в списке загрузки неподписанное приложение. Если вы однажды не увидите сообщение от Secure Boot, то ваше устройство однозначно скомпрометировано.

  • Надёжнее отключённого от интернета устройства, хранимого в сейфе, всё равно ничего не придумаешь. Уязвимости в реализации Secure Boot в конкретных прошивках не исключены.

Подписывание драйверов и модулей ядра

Если вам нужно установить сторонние или собственные драйвера и модули ядра, их необходимо подписать. Для подписи модулей ядра требуются сертификат в формате DER и ключ без пароля, то есть сгенерированный с параметром -nodes.

openssl req -new -nodes -utf8 -sha256 -days 36500 -batch -x509 
       -subj "/CN=Kernel Key" -outform DER -out kernel.der 
       -keyout kernel.key

Для подписывания используется скрипт sign-file.

/usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 kernel.key kernel.der module.ko

Чтобы добавить этот сертификат в прошивку, его необходимо преобразовать в формат PEM, затем в ESL и подписать ключом KEK.

openssl x509 -inform der -in kernel.der -outform pem -out kernel.pem
cert-to-efi-sig-list -g "$(uuidgen)" kernel.pem kernel.esl
sign-efi-sig-list -k KEK.key -c KEK.pem kernel kernel.esl kernel.auth

Примеры отключения secure boot на разных ноутбуках и материнских платах

Общий алгоритм всегда один и тот же:

  1. Вход в UEFI.
  2. Поиск нужной опции.
  3. Отключение SecureBoot.
  4. Запись изменений.

Важно, что этот протокол безопасности поддерживается только в Windows 8 и более поздних версиях. Следовательно, если у вас в прошивке материнской платы включен Secure Boot, но на ПК установлена Windows 7, то ничего отключать не надо. Опция безопасной загрузки все равно не работает, а возможные проблемы с запуском ОС нужно искать в других местах.

Примечания

  1. Решаемо путём сборки образа GRUB с нужными модулями с помощью grub-mkstandalone, но его придётся подписывать самому.

  2. Теоретически можно исправить, установив пароль, встроив grub.cfg в образ GRUB с помощью grub-mkstandalone и установив в grub.cfg prefix на невалидный путь, чтобы GRUB не мог найти второй grub.cfg на диске. Но опять же требуется подписывать образ самостоятельно.

  3. А он есть у всех кроме

  4. параноиковоправданно озабоченных своей безопасностью пользователей.

  5. У меня загрузиться с USB не даёт. Windows 8 и 10 также без пароля не пускают в безопасный режим или консоль.

  6. Говорят, некоторые прошивки он окирпичивает. Безопаснее создать по ESP на каждый загрузчик.

Раздел boot и ядро

Если во время включения устройства ты не зажимал клавишу увеличения громкости либо не перезагружал смартфон в режим recovery намеренно (например, с помощью расширенного меню перезагрузки в кастомных прошивках), на последнем этапе своей работы aboot загружает в память устройства ядро Linux и RAM-диск из раздела boot, а после этого передает управление ядру.

Сам раздел boot не содержит никакой файловой системы, а представляет собой сжатые с помощью gzip и записанные друг за другом ядро и RAM-диск, предваренные небольшим заголовком размером в два килобайта (он содержит опции загрузки ядра, а также адреса расположения образов и другую информацию).

RAM-диск, в свою очередь, представляет собой небольшую виртуальную файловую систему, содержащую набор каталогов, к которым Android подключит файловые системы других разделов (system, data, sdcard), а также систему и скрипт инициализации и init.rc. RAM-диск загружается прямо в оперативку и продолжает существовать все время, пока смартфон включен.

Благодаря простой структуре образ раздела boot (boot.img) довольно легко распаковать. Это можно сделать даже с помощью HEX-редактора, но проще воспользоваться инструментом imgtool. Пример для Linux (x86_64):

$ imgtool.ELF64 boot.img extract
$ cd extracted
$ mkdir ramdisk_ext
$ cd ramdisk_ext
$ gunzip -c ../ramdisk | cpio -i

Запакованные ядро и RAM-диск окажутся в каталоге extracted, а содержимое RAM-диска — в подкаталоге ramdisk_ext. Это в идеале. На самом деле, как и в случае с загрузчиком, никакого стандарта для формата раздела boot нет, и производитель может проявить фантазию.

Тем не менее в 95% формат раздела boot стандартный, и если ты когда-либо прошивал на свой аппарат кастомное ядро, то наверняка внутри ZIP-архива с ядром был именно образ boot.img, так что вместе с ядром ты прошивал также и RAM-диск. Когда ты это делал, тебе приходилось быть осторожным, ведь RAM-диск стоковой прошивки отличается от RAM-диска того же CyanogenMod. Прошив ядро для AOSP в CyanogenMod, ты мог получить bootloop и много других неприятностей.

Чтобы обойти эту проблему, разработчик CyanogenMod и автор ClockworkMod Recovery Кушик Дутта (Koushik Dutta, или Koush) создал систему AnyKernel, которая позволяет устанавливать ядра отдельно от RAM-диска (путем пересборки раздела boot на лету).

Какое бы ядро ты ни выбрал, тебе в любом случае понадобится кастомный recovery для его установки.

Разметка и шифрование

Чтобы загружаться с диска в режиме UEFI, он должен быть размечен в формате GPT. Разметку диска рассмотрим с помощью KDE Partition Manager и GParted. Если у вас их нет, установите один, соответствующий вашей среде.

sudo apt-get install partitionmanager   # KDE
sudo apt-get install gparted            # GNOME и другие

Запустите редактор разделов и выберите интересующий вас диск, обычно это первый в системе — /dev/sda. Посмотрите свойства диска.

KDE Partition Manager: Два раза кликните по диску,
GParted: View -> Device Information.

В строке Partition table указана используемая таблица разделов. Если диск размечен в формате dos/msdos (MBR), то его необходимо преобразовать в GPT. Это возможно сделать без потери данных, но здесь я этого описывать не буду, поищите инструкции в интернете. Если на диске нет важных данных и вы хотите форматировать его в GPT, создайте новую таблицу.

KDE Partition Manager: New Partition Table — GPT
GParted: Device -> Create Partition Table — gpt

На диске должен быть как минимум один раздел ESP (EFI System Partition), в котором будут храниться загрузчики. Если на этом диске установлена ОС в режиме UEFI, то один такой раздел уже есть. В любом случае я рекомендую создать новый размером не меньше 100 МБ. ESP должен быть отформатирован в один из FAT-форматов, предпочтительно в FAT32, а также помечен как загрузочный.

KDE Partition Manager: Кликнуть по неразмеченной области -> New
    File system: fat32
    Size: 128.00 MiB
    Free space before: 0.00 — место после таблицы GPT
    OK, Apply
    Выбрать созданный раздел и открыть свойства (Properties), выставить флаг boot
    OK, Apply

GParted: Кликнуть по неразмеченной области -> New
    File system: fat32
    New size: 128 MiB
    Free space preceding: 1 MiB или больше — место под таблицу GPT
    Add, Apply
    Выбрать созданный раздел и открыть управление флагами (Manage Flags), выставить флаг boot
    Close

Дальше нужно создать раздел для шифрования. Тем же образом, что и ESP, только без форматирования (unformatted), выставления флагов и размером побольше — так, чтобы вместил систему и раздел подкачки. Создадим в этом разделе криптоконтейнер LUKS через терминал, предварительно перейдя в режим суперпользователя.

sudo -i

Отформатируем раздел с указанием современных алгоритмов шифрования и хеширования. В режиме XTS длину ключа необходимо указывать в два раза больше, поэтому для AES-256 нужно указать ключ длиной 512 бит. Параметр –iter-time задаёт время в миллисекундах, затрачиваемое на генерацию ключа из вводимого пароля функцией PBKDF2. Большее количество итераций усложняет перебор пароля, но и увеличивает время ожидания после ввода верного пароля.

cryptsetup luksFormat --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 2000 /dev/sda2

Подтвердите форматирование, написав YES, введите пароль. Теперь откройте криптоконтейнер (sda2_crypt — имя для маппинга) и введите тот же пароль.

cryptsetup luksOpen /dev/sda2 sda2_crypt

Контейнер должен стать доступным как блочное устройство /dev/mapper/sda2_crypt. Перейдём к разметке логических томов внутри криптоконтейнера. Инициализируем физический раздел LVM поверх /dev/mapper/sda2_crypt.

pvcreate /dev/mapper/sda2_crypt

Внутри этого физического раздела создадим группу томов с именем ubuntu.

vgcreate ubuntu /dev/mapper/sda2_crypt

Теперь мы можем создавать логические тома внутри этой группы. Первым делом создадим том для раздела подкачки и инициализируем его. Рекомендуемый размер — от sqrt(RAM) до 2xRAM в гигабайтах.

lvcreate -n swap -L 4G ubuntu # создать логический том с меткой swap размером 4 ГБ в группе ubuntu
mkswap /dev/ubuntu/swap

Добавим том для корня и создадим в нём файловую систему ext4. Хорошей практикой считается оставлять свободное место и расширять тома по мере необходимости, поэтому выделим для корня 20 ГБ. По желанию в свободном месте можно будет разметить дополнительные тома для home, usr, var и так далее. Выделить всё свободное место для тома можно с помощью параметра -l 100%FREE.

lvcreate -n root -L 20G ubuntu
mkfs.ext4 /dev/ubuntu/root

С разметкой закончено, можно перейти к установке.

Создание загрузчика

Ядро Linux поддерживает загрузку напрямую из UEFI, если оно было скомпилировано с параметром CONFIG_EFI_STUB. В таком случае initramfs обычно хранится рядом в ESP, и путь к нему передаётся в аргументах к ядру.

Однако отсутствие верификации initramfs позволяет встроить в него вредоносный код, имея доступ на запись в ESP. Teddy Reed предлагает компилировать ядро, встраивая в него initramfs.

Процесс компиляции ядра достаточно длительный, её придётся производить после каждого изменения initramfs. К счастью, есть другой способ. В пакете systemd (ранее в gummiboot) находится linuxx64.efi.stub — заготовка UEFI-приложения, в которую можно встроить ядро, initramfs и аргументы, передаваемые ядру. Подписав это UEFI-приложение, мы защитим ядро и initramfs от изменений.

Для данной операции потребуется пакет binutils.

sudo apt-get install binutils

Запишем в /tmp/cmdline аргументы, которые будут передаваться ядру.

Способ 3. скомпилировать своё ядро

Если ваше время ничего не стоит, то вы можете скомпилировать своё ядро без этого ограничения. Гарантий, что после долгих мучений вы будете довольны результатом, нет. Но если вы этого очень хотите, хвала Линусу Торвальдсу и GPLv2, у вас есть на это право. Вы можете предварительно протестировать скомпилированное мною ядро, чтобы не тратить зря время.

Инструкции

Получение исходного кода

Apt-get

Самый простой способ получить исходный код для ядра вашей версии — скачать его из репозитория.

В /etc/apt/sources.list должны присутствовать указатели на репозитории исходных кодов. Обычно там уже есть закомменти­рованные записи с deb-src. Раскомментируйте их для репозиториев xenial main и xenial-security main, либо добавьте сами, а затем обновите индекс apt.

$ sudo nano /etc/apt/sources.list
...
deb-src http://ru.archive.ubuntu.com/ubuntu/ xenial main restricted
deb-src http://security.ubuntu.com/ubuntu xenial-security main restricted
...
$ apt-get update

Загрузите исходный код и перейдите в создавшуюся директорию.

apt-get source linux-image-$(uname -r)
cd linux-4.4.0

Обратите внимание на то, чтобы apt скачивал актуальную версию исходного кода. Проверьте номер версии у файла .dsc.

linux_4.4.0-34.53.dsc

Git

Если вы хотите поддерживать ядро в актуальном состоянии и перекомпилировать его по мере выхода обновлений с сохранением своих изменений, выберите git. Первоначальная загрузка займёт продолжительное время.

Установите git.

sudo apt-get install git

Создайте локальную копию git-репозитория ядра текущего релиза Ubuntu и перейдите в создавшуюся директорию.

git clone git://kernel.ubuntu.com/ubuntu/ubuntu-xenial.git
cd ubuntu-xenial

По умолчанию git указывает на ветку master, соответствующую версии последнего релиза. Переключиться на другую версию можно по тегу релиза этой версии. Чтобы перечислить все теги по заданной маске, используйте git tag -l <маска>.

$ git tag -l Ubuntu-*
...
Ubuntu-4.4.0-33.52
Ubuntu-4.4.0-34.53
Ubuntu-4.4.0-35.54
...

Создайте ветку temp для тега, соответствующего вашей версии, и переключитесь на неё.

git checkout -b temp Ubuntu-4.4.0-34.53

Настройка

Загрузите пакеты, требуемые для компиляции (build dependencies).

sudo apt-get build-dep
sudo apt-get ccache fakeroot kernel-package libncurses5-dev

Убедитесь, что скриптам выставлено право на исполнение, запустите чистку.

chmod a x debian/rules
chmod a x debian/scripts/*
chmod a x debian/scripts/misc/*
fakeroot debian/rules clean

Скопируйте старый файл конфигурации в текущую директорию, запустите конфигурацию, выберите Load и загрузите config. Больше изменять ничего не требуется, выйдите и сохраните конфигурацию — Exit → Yes.

cp /boot/config-4.4.0-34-generic config
fakeroot debian/rules editconfigs

Измените файл kernel/power/hibernate.c, убрав проверку secure_modules().

--- a/kernel/power/hibernate.c
    b/kernel/power/hibernate.c
@@ -67,7  67,7 @@ static const struct platform_hibernation_ops *hibernation_ops;

 bool hibernation_available(void)
 {
-   return ((nohibernate == 0) && !secure_modules());
    return (nohibernate == 0);
 }

 /**
--

Скрипты компиляции определяют версию ядра по последней записи в истории изменений (changelog) в директории debian.master. Добавьте новую запись, чтобы изменить версию.

EDITOR=nano debchange -c debian.master/changelog -l "custom"

К версии будет добавлен суффикс custom1, что отразится при сборке пакетов .deb и позволит установить их при уже установленных пакетах той же версии без суффикса. Однако этот суффикс распространяется только на имя пакета, но не на его содержимое: ядро и директория с его модулями будут иметь ту же версию 4.4.0-34-generic, и при установке старые файлы перезапишутся новыми. Чтобы этого избежать, измените версию ABI c 34 на, например, 3400.

linux (4.4.0-3400.53custom1) UNRELEASED; urgency=medium

  * Allow hibernation on Secure Boot
...

Компиляция

Запустите чистку ещё раз и скомпилируйте ядро. Если вы не опытный разработчик ядра и не понимаете, как работают проверки ABI и модулей (я вот не понимаю), отключите их (skipabi=true, skipmodule=true), иначе ваша компиляция сломается на одном из последних этапов. Здесь используется многопоточная сборка пакетов с количеством потоков, равным количеству ядер процессора. Цель binary-generic означает компиляцию обычной разновидности ядра, архитектура определяется автоматически.

fakeroot debian/rules clean
skipabi=true skipmodule=true DEB_BUILD_OPTIONS=parallel=$(getconf _NPROCESSORS_ONLN) do_tools=false no_dumpfile=1 
fakeroot debianrules binary-generic

Если компиляция прошла успешно, то в вашей домашней директории появятся три пакета .deb. Необходимо установить linux-image-<version>.deb, а также желательно linux-image-extra-<version>.deb. Это можно сделать с помощью dpkg -i <путь к пакету> или через QApt, открыв пакет в файловом менеджере, если он это поддерживает. Будьте осторожны: если вы не изменяли версию ABI, то старое ядро и модули перезапишутся.

Снова соберите загрузочный файл.

echo -n "quiet splash" > /tmp/cmdline

objcopy 
  --add-section .osrel=/etc/os-release --change-section-vma .osrel=0x20000 
  --add-section .cmdline=/tmp/cmdline --change-section-vma .cmdline=0x30000 
  --add-section .linux=/boot/vmlinuz-4.4.0-34-generic --change-section-vma .linux=0x2000000 
  --add-section .initrd=/boot/initrd.img-4.4.0-34-generic --change-section-vma .initrd=0x3000000 
/usr/lib/systemd/boot/efi/linuxx64.efi.stub /tmp/test.efi

sbsign --key /root/keys/my.key --cert /root/keys/my.pem --output /boot/efi/EFI/BOOT/BOOTX64.EFI /tmp/test.efi

Копаем глубже. Как работают механизмы прошивки, рутинга и восстановления Android — Хакер

Гибернация работает, но нестабильно. Как, впрочем, и без Secure Boot.

Способ 4. отказ от гибернации и использование виртуализации

Если гибернация и работает, то это не делает её надёжным средством сохранения состояния. Это может быть проблемой моего железа, дистрибутива или, что более вероятно, KDE Plasma, но у меня Kubuntu просыпается через раз.

По уже описанной технологии в качестве хостовой ОС можно установить подходящий дистрибутив Linux, а гостевой — предпочитаемую для работы. При завершении работы автоматически останавливать виртуальную машину с сохранением состояния, а затем отключать устройство.

С большей надёжностью придёт и большая защищённость: чувствительные данные можно изолировать от опасной среды. Браузер и песочница для установки стороннних пакетов в одной виртуальной машине, важные персональные данные — в другой. Украсть мастер-ключ от зашифрованного диска в памяти хостовой ОС из гостевой гораздо сложнее. Кажется, для подобного существует Qubes OS. Но она данный момент не поддерживает Secure Boot. Fail.

На этом всё, приветствуются любые дополнения и замечания.

Установка

Так как мы планируем создать загрузчик самостоятельно, да и установщик Ubuntu не поддерживает шифрование /boot, запустим установку без создания загрузчика.

ubiquity -b

На этапе разметки диска выберите Вручную.

Здесь нам необходимо указать точки монтирования. Выберите /dev/mapper/ubuntu-root, укажите использование в качестве журналируемой файловой системы Ext4, точку монтирования (Mount Point) в /, без форматирования. Ubiquity сама подхватит /dev/mapper/ubuntu-swap как раздел подкачки и запомнит один из системных разделов EFI. Экран разметки должен выглядеть так:

Копаем глубже. Как работают механизмы прошивки, рутинга и восстановления Android — Хакер

Закончите установку и не перезагружайтесь.

Установка ubuntu с шифрованием всего диска с помощью luks и lvm

LUKS — Linux Unified Key Setup — обёртка для криптографической системы dm-crypt, позволяющая создавать виртуальные зашифрованные устройства в файлах и на физических дисках. С помощью LUKS можно зашифровать данные на всём диске для того, чтобы перед загрузкой ОС требовалось ввести пароль.

LVM — Logical Volume Manager — менеджер логических томов, с помощью которого мы разделим криптоконтейнер на тома. Тома LVM автоматически монтируются после ввода пароля к криптоконтейнеру, отдельный ввод пароля для каждого тома не требуется.

Следующие инструкции должны быть применимы к любому дистрибутиву на базе Ubuntu, для других потребуются коррективы. Сперва загрузитесь с Live CD или установочного образа в режиме Try before installing.

Заключение

  1. Secure Boot появился в компьютерном мире относительно недавно и этот протокол безопасности является составляющей UEFI – современным и актуальным видом прошивки материнских плат.
  2. Протокол безопасности препятствует запуску вредоносного ПО на более низком уровне, чем это делают обычные антивирусы. Поэтому при правильной настройке эта технология может существенно повысить устойчивость ПК к вирусам.
  3. Secure Boot стоит отключать по необходимости, если он препятствует старту системы с загрузочной флешки или при переустановке Windows. Просто для эксперимента технологию деактивировать не стоит.
  4. Для любого компьютера схема деактивации одна и та же – за счет указания подходящего критерия в нужном меню UEFI. Главное – это найти правильный путь к такому меню. Даже при существенных сложностях это займет не больше 10 минут.

Выводы

Надеюсь, эта статья помогла тебе разобраться в том, как работают механизмы разблокировки, прошивки и восстановления Android. В целом в этом нет ничего сложного, и, поняв, как именно все это работает, ты избежишь многих проблем, связанных с разблокировкой и перепрошивкой устройства. И даже если они возникнут — теперь ты сможешь их решить без посторонней помощи.

Оцените статью
Huawei Devices
Добавить комментарий