Содержание статьи
LUKS — это, по сути, стандарт для шифрования дисков в Linux. Поддерживается до восьми слотов ключей, есть выбор хеш‑функций, алгоритмов и режимов шифрования, есть адаптивный алгоритм выбора количества итераций. Расшифровать данные на диске можно, только имея доступ к секретному ключу и паролю.
Среди других преимуществ LUKS:
- совместимость через стандартизацию;
- защита от атак с низкой энтропией;
- возможность аннулировать секретную фразу.
Ну и распространяется она бесплатно.
Настройка диска
Все манипуляции мы будем проводить на свежем Debian 10, добавив дополнительный диск для экспериментов с шифрованием.
После установки переходим под root:
su -
Затем утилитой fdisk смотрим названия доступных дисков:
$
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: VMware Virtual S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x09849b5eDevice Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 37750783 37748736 18G 83 Linux
/dev/sda2 37752830 41940991 4188162 2G 5 Extended
/dev/sda5 37752832 41940991 4188160 2G 82 Linux swap / Solaris
Disk /dev/sdb: 4 GiB, 4294967296 bytes, 8388608 sectors
Disk model: VMware Virtual S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
В своем примере я буду использовать устройство /
. Для разметки диска использую утилиту parted
, передав имя диска в качестве аргумента:
parted /dev/sdb
Помечаю таблицу разделов как GPT:
(parted) mklabel gpt
И создаю единственный раздел, занимающий весь диск:
(parted) mkpart primary 1 -1(parted) quit
Сборка cryptsetup
Работы с разметкой /
закончены. Переходим к сборке cryptsetup.
Если у тебя уже установлен LUKS и ты хочешь модифицировать текущую версию утилиты, используй dpkg-dev. В этом же примере я буду собирать cryptsetup из исходных кодов, скачанных отдельно от системы. У меня версия 2.0.6, так как при сборке последней доступной (2.3.4) были проблемы с версиями библиотек.
Скачиваем, распаковываем и устанавливаем необходимые зависимости:
# cd /root# wget https://www.kernel.org/pub/linux/utils/cryptsetup/v2.0/cryptsetup-2.0.6.tar.xz# tar xf cryptsetup-2.0.6.tar.xz# cd cryptsetup-2.0.6# apt update && apt install build-essential automake autopoint libtool pkg-config uuid-dev libdevmapper-dev libpopt-dev libgcrypt20-dev libjson-c-dev libssl-dev libblkid-dev gettext
Собираем и устанавливаем:
# ./configure# make && make install
Проверяем установку:
#
cryptsetup 2.0.6
Отлично. Теперь создадим зашифрованный раздел с помощью cryptsetup и пароля, вводимого в TTY:
# cryptsetup luksFormat /dev/sdb1
Соглашаемся на форматирование (YES
) и вводим пароль для последующего доступа к разделу. Я использую t3st3ncryp7
.
Проверяем, все ли удалось.
#
Ok!
Все получилось! Подключаем шифрованный раздел, чтобы дальше его монтировать:
# cryptsetup luksOpen /dev/sdb1 db
Вводим парольную фразу (t3st3ncryp7
). Чуть позже в этом месте мы перехватим вводимый в TTY пароль.
Форматируем раздел:
# mke2fs -j /dev/mapper/db
И монтируем для работы, например в /
:
#
#
#
Hello!
#
итого 28
drwxr-xr-x 3 root root 4096 ноя 6 06:49 .
drwxr-xr-x 20 root root 4096 ноя 6 05:34 ..
drwx------ 2 root root 16384 ноя 6 06:48 lost+found
-rw-r--r-- 1 root root 7 ноя 6 06:49 test.txt
Модифицируем код
На этом этапе мы научились монтировать шифрованный раздел LUKS c использованием парольной фразы. Сейчас мы исправим исходный код, чтобы сохранять не только вводимый пароль, но и случайно сгенерированный файл, который может быть указан в качестве ключа для расшифровки раздела.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
ya
14.12.2020 в 19:17
название не совсем или совсем не соотвествует содержанию. бэкдор? да! только как его задействовать ДО создания шифрованного раздела. или как залить его в git производителя?
Denis Simonov
14.12.2020 в 19:24
Чтобы залить в git, нужны креды автора репозитория, очевидно же. А вот если есть root доступ к машине с LUKS разделом, то есть возможность внедрить бекдор для перехвата пароля или ключа. Узкий кейс, тем не менее.
Hackcat
14.12.2020 в 20:30
Ну почему «до»?
Этот код перехватит при *каждой* разблокировке контейнера, и подсадить малварь на целевую машину можно довольно незаметно. Хотя бы многочисленные скрипты для «взлома без регистрации и смс», которые запускаются от рута, могут запросто подменить cryptsetup, и при маски-шоу получить ключ в чистом виде
hummelchen
14.12.2020 в 20:47
Для перехвата пароля от зашифрованного раздела с корневой ФС такую закладку могу внедрить в initramfs. В большинстве случаев initrd.img и ядро лежат на boot-разделе в открытом виде, чтобы контролировать их целостность приходится серьёзно заморачиваться с secureboot.
hummelchen
14.12.2020 в 20:48
*могут 🙂
Denis Simonov
15.12.2020 в 00:18
Согласен полностью. Такой вариант можно было бы рассмотреть в контексте опубликованного материала. Но я не стал этого делать, продемонстрировал лишь суть атаки.
soko1
17.12.2020 в 11:22
Парни, гляньте, у вас там слетели цвета в консольном выводе. Черный шрифт на черном фоне, без выделения ничего не видно.