From: kmeaw
Date: 2021-06-16 13:31:40Z
> гели неунивесален и ограничен
Я почти не знаю FreeBSD, но быстрый эксперимент, чтение докуметнации и
g_eli.c показывают, что ограничение заключается лишь в том, что
метаданные хранятся в последнем 512-байтном секторе.
Раз вы смогли разобраться с device-mapper в Linux, то будет несложно
провернуть следующий трюк - создать md размером 512 байт, записать туда
правильный заголовок и приклеить его к диску с помощью gconcat.
pahole подсказывает:
struct g_eli_metadata {
char md_magic[16]; /* 0 16 */
uint32_t md_version; /* 16 4 */
uint32_t md_flags; /* 20 4 */
uint16_t md_ealgo; /* 24 2 */
uint16_t md_keylen; /* 26 2 */
uint16_t md_aalgo; /* 28 2 */
uint64_t md_provsize; /* 30 8 */
uint32_t md_sectorsize; /* 38 4 */
uint8_t md_keys; /* 42 1 */
int32_t md_iterations; /* 43 4 */
uint8_t md_salt[64]; /* 47 64 */
/* --- cacheline 1 boundary (64 bytes) was 47 bytes ago --- */
uint8_t md_mkeys[384]; /* 111 384 */
/* --- cacheline 7 boundary (448 bytes) was 47 bytes ago --- */
u_char md_hash[16]; /* 495 16 */
/* size: 511, cachelines: 8, members: 13 */
/* last cacheline: 63 bytes */
} __packed;
То есть заголовок необязательно запоминать целиком. Достаточно правильно
заполнить все служебные поля, а затем (например, с помощью openssl)
посчитать HMAC(SHA512, key, "\0") и записать остальные поля. Последние
17 байт получаются из MD5(data)||"\0", где data - всё то, что мы уже
посчитали.
После этого делаем geli restore на gconcat, и можно подключать
зашифрованный диск. С помощью gnop и gconcat можно повторить эту
процедуру и для вложенных контейнеров по известному смещению.
Да, неудобно, но разве это остановит настоящего шифропанка? Заодно и
deniability чуть возрастёт - раз geli такой ограниченный, то меньше
шансов, что кто-то будет подозревать о наличии вложенного
криптоконтейнера. И устанавливать никакой дополнительный софт не нужно -
всё уже есть в базовой системе.