В пакете Cryptsetup, применяемом для шифрования дисковых разделов в Linux, выявлена уязвимость (CVE-2021-4122), позволяющая через модификацию метаданных добиться отключения шифрования в разделах в формате LUKS2 (Linux Unified Key Setup). Для эксплуатации уязвимости атакующий должен иметь физический доступ к зашифрованному носителю, т.е. метод имеет смысл в основном для атаки на зашифрованные внешние накопители, такие как Flash-диски, к которым злоумышленник имеет доступ, но не знает пароля для расшифровки данных.
Атака применима только для формата LUKS2 и связана с манипуляцией метаданными, отвечающими за активацию расширения “online reencryption”, позволяющего при необходимости смены ключа доступа инициировать процесс перешифрования данных на лету без остановки работы с разделом. Так как процесс расшифровки и шифровки с новым ключом занимает много времени, “online reencryption” даёт возможность не прерывать работу с разделом и выполнять перешифрование в фоне, постепенно перешифровывая данных с одного ключа на другой. В том числе имеется возможность выбора пустого целевого ключа, что позволяет перевести раздел в расшифрованный вид.
Атакующий может внести в метаданные LUKS2 изменения, симулирующие аварийное прерывание выполнения операции расшифровки в результате сбоя и добиться расшифровки части раздела после активации и использования модифицированного накопителя владельцем. При этом пользователь, подключивший модифицированный накопитель и разблокировавший его корректным паролем, не получает какого-либо предупреждения о выполнении процесса восстановления прерванной операции перешифрования и может узнать о ходе данной операции только при помощи команды “luks Dump”. Объём данных, расшифровки которых может добиться атакующий, зависит от размера заголовка LUKS2, но при размере по умолчанию (16 MiB) может превышать 3 ГБ.
Проблема вызвана тем, что несмотря на то, что перешифрование требует расчёта и проверки хэшей нового и старого ключей, но для начала расшифровки хэш не требуется, если новое состояние подразумевает отсутствие ключа для шифрования (plaintext). Кроме того, метаданные LUKS2, в которых задаётся алгоритм шифрования, не защищены от модификации в случае попадания в руки злоумышленника. Для блокирования уязвимости разработчики добавили в LUKS2 дополнительную защиту метаданных, для которых теперь проверяется дополнительный хэш, вычисляемый на основе известных ключей и содержимого метаданных, т.е. атакующий теперь не может незаметно изменить метаданные, не зная пароля для расшифровки.
Типовой сценарий атаки требует, чтобы у злоумышленника была возможность несколько раз получить накопитель в свои руки. Вначале атакующий, который не знает пароля доступа, вносит в область метаданных изменения, инициирующие расшифровку части данных при следующей активации накопителя. Затем накопитель возвращается на место и атакующий ждёт, пока пользователь не подключит его, введя пароль. Во время активации устройства пользователем запускается фоновый процесс перешифрования, в ходе которого часть зашифрованных данных заменяется на расшифрованные данные. Далее, если атакующий сможет получить в свои руки устройство ещё раз, часть данных на накопителе будет находиться в расшифрованном виде.
Проблема выявлена мэйнтейнером проекта cryptsetup и устранена в обновлениях cryptsetup 2.4.3 и 2.3.7. Состояние формирования обновлений с устранением проблемы в дистрибутивах можно отследить на данных страницах: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch. Уязвимость проявляется только начиная с выпуска cryptsetup 2.2.0, в котором появилась поддержка операции “online reencryption”. В качестве обходного пути защиты может использоваться запуск с опцией “–disable-luks2-reencryption”.