Компания Kudelski Security, специализирующаяся на проведении аудита безопасности, опубликовала инструментарий Shufflecake, который позволяет создавать скрытые файловые системы, размазанные по имеющемуся свободному пространству в существующих разделах и не отличимые от случайных остаточных данных. Разделы создаются таким образом, что не зная ключ доступа существование их проблематично доказать даже при проведении криминалистического анализа. Код утилит (shufflecake-userland) и модуля ядра Linux (dm-sflc) написан на языке Си и распространяется под лицензией GPLv3, что делает невозможным включение опубликованного модуля ядра в основной состав ядра Linux из-за несовместимости с лицензией GPLv2, под которой поставляется ядро.
Проект позиционируется как более совершенное, чем Truecrypt и Veracrypt, решение для скрытия требующих защиты данных, которое имеет родную поддержку платформы Linux и позволяет размещать до 15 скрытых разделов на устройстве, вложенных друг в друга для запутывания разбора их существования. Если само применение Shufflecake не представляет тайну, о чем можно судить, например, по наличию в системе соответствующих утилит, то общее число созданных скрытых разделов определить невозможно. Создаваемые скрытые разделы на усмотрение пользователя могут форматироваться для размещения любых ФС, например, ext4, xfs или btrfs. Каждый раздел обрабатывается как отдельное виртуальное блочное устройство со своим ключом разблокировки.
Для запутывания следов предлагается использовать модель поведения «правдоподобное отрицание» (plausible deniability), суть которого в том, что представляющие ценность данные скрываются в качестве дополнительных слоёв в шифрованных разделах с менее ценными данными, образуя своеобразную скрытую иерархию разделов. В случае давления владелец устройства может раскрыть ключ к шифрованному разделу, но в этом разделе могут скрываться другие разделы (вплоть до 15 вложенных уровней), а определить их наличие и доказать существование проблематично.
Скрытие обеспечивается благодаря формированию каждого раздела как набора шифрованных слайсов, размещаемых в случайных позициях на устройстве хранения. Каждый слайс создаётся динамически в момент когда в разделе требуется дополнительное пространство для хранения. Для затруднения анализа слайсы разных разделов чередуются, т.е. разделы Shufflecake не связываются с непрерывными областями и слайсы всех разделов смешиваются. Информация об используемых и свободных слайсах хранится в привязанной к каждому разделу карте местоположения, на которую ссылается зашифрованный заголовок. Карты и заголовок зашифрованы и без знания ключа доступа неотличимы от случайных данных.
Заголовок разделён на слоты, каждый из которых определяет свой раздел и связанные с ним слайсы. Слоты в заголовке размещены в стековом порядке и рекурсивно связаны — текущий слот содержит ключ для расшифровки параметров предыдущего раздела в иерархии (менее скрытого), что позволяет использовать один пароль для расшифровки всех менее скрытых разделов, связанных с выбранным разделом. Каждый менее скрытый раздел рассматривает слайсы вложенных разделов как свободные.
По умолчанию все вложенные разделы Shufflecake имеют тот же видимый размер, что и раздел верхнего уровня. Например, если на устройстве, размером 1 ГБ задействовано три раздела, каждый из них будет виден для системы как раздел с размером 1 ГБ и общее доступное дисковое пространство будет совместно использоваться во всех разделах — если в сумме размер сохранённых данных превысит фактический размер устройства, начнёт выдаваться ошибка ввода/вывода.
Не открытые вложенные разделы не участвуют в распределении места, т.е. попытка заполнения раздела верхнего уровня приведёт к перетиранию данных во вложенных разделах, но не даст возможность раскрыть их наличие через анализ размера данных, который удастся разместить в разделе до начала вывода ошибки (предполагается, что верхние разделы содержат неизменяемые данные для отвлечения внимания и никогда по отдельности не используются, а штатная работа осуществляется всегда с самым последним вложенным разделом, сама схема подразумевает, что важнее сохранить тайну существования данных, чем потерять эти данные).
Фактически всегда создаётся 15 разделов Shufflecake — к используемым разделам привязывается пароль пользователя, а неиспользованные разделы снабжаются случайно сгенерированным паролем (невозможно понять сколько реально разделов используется). При инициализации разделов Shufflecake, выделенные для их размещения диск, раздел или виртуальное блочное устройство заполняется случайными данными, что не позволяет определить на общем фоне метаданные и данные Shufflecake.
Реализация Shufflecake имеет достаточно высокую производительность, но из-за наличия накладных расходов примерно в два раза отстаёт по пропускной способности по сравнению с шифрованием дисков на базе подсистемы LUKS. Применение Shufflecake также приводит к дополнительным затратам оперативной памяти и места для хранения служебных данных на диске. Затраты памяти оценивается в 60 МБ на каждый раздел, а места на диске — в 1% от общего размера. Для сравнение, аналогичная по назначению техника WORAM приводит к замедлению от 5 до 200 раз с 75% потерей полезного места на диске.
Инструментарий и модуль ядра протестированы только при работе в Debian и Ubuntu с ядрами 5.13 и 5.15 (поддерживается работа в Ubuntu 22.04). Отмечается, что проект пока стоит рассматривать как рабочий прототип, который не стоит использовать для хранения важных данных. В будущем планируется провести дополнительную оптимизацию производительности, надёжности и безопасности, а также обеспечить возможность загрузки с разделов Shufflecake.
Источник: opennet.ru