Как укрепить «Веру». Делаем шифрованные контейнеры VeraCrypt неприступными
Ты пользуешься VeraCrypt и всегда выбираешь самый надежный алгоритм шифрования и длинный пароль, надеясь, что так ты сделаешь контейнер неприступным? Эта статья перевернет твои представления о том, как работает безопасность криптоконтейнеров, и покажет, что на самом деле влияет на стойкость контейнера к взлому.
Как взламывает контейнеры VeraCrypt полиция
Эта статья не о том, как ломать криптоконтейнеры. Однако, если ты не знаешь, как станут действовать эксперты, пытающиеся получить доступ к зашифрованным данным, будет трудно понять смысл описанных действий.
Действия эксперта в лаборатории зависят от того, что именно и каким именно образом изъято при обыске.
Стандартные методы
Самый типичный случай — изъятие внешних накопителей целиком; компьютеры выключаются и также изымаются целиком, но в лабораторию к эксперту попадает не целый компьютер в сборе, а только извлеченные из него диски.
Подобный сценарий — тот самый случай, противостоять которому так долго готовились разработчики всех криптоконтейнеров без исключения. Лобовые атаки на криптоконтейнеры малоэффективны, а на некоторые их разновидности (в частности, загрузочные разделы, зашифрованные в режиме TPM или TPM + ключ) неэффективны абсолютно.
В типичном случае эксперт попытается сначала проанализировать файлы гибернации и подкачки. Если пользователь пренебрег настройками безопасности криптоконтейнера (кстати, при использовании BitLocker эти настройки далеко не очевидны), то ключи шифрования спокойно извлекаются из этих файлов, а зашифрованные тома расшифровываются без длительных атак. Разумеется, в ряде случаев эта атака не сработает. Она будет бесполезна, если выполнено хотя бы одно из описанных ниже условий.
- Загрузочный диск зашифрован. В этом случае и файл подкачки, и файл гибернации будут также зашифрованы. Например, если для шифрования загрузочного раздела используется BitLocker (это имеет смысл, даже если остальные данные зашифрованы в контейнерах VeraCrypt), то Microsoft подробно описывает модель безопасности в FAQ и BitLocker Security FAQ (раздел What are the implications of using the sleep or hibernate power management options?). Кстати, из этого правила есть исключения — например, если файл подкачки вынесен на отдельное от загрузочного устройство (довольно распространенный случай для пользователей, которые таким образом «экономят» ресурс загрузочного SSD).
2. Компьютер был выключен штатным образом (через команду Shutdown) или был изъят в состоянии гибридного сна либо гибернации; при этом криптоконтейнер настроен таким образом, чтобы автоматически размонтировать зашифрованные тома и уничтожать ключи шифрования в оперативной памяти при переходе компьютера в сон, гибернацию или при его отключении.
Немного сложно для восприятия? Упрощу: если в момент изъятия зашифрованный том был смонтирован, а полиция просто выдернула вилку из розетки, то ключ шифрования, скорее всего, останется в файле гибернации (удастся ли его оттуда вытащить — зависит от пункта 1). А вот если компьютер выключили командой Shutdown, то наличие или отсутствие ключа будет зависеть от настроек криптоконтейнера. О том, как правильно настроить VeraCrypt, мы поговорим дальше.
3. Наконец, очевидное: анализ файлов подкачки и гибернации совершенно бесполезен, если в момент изъятия компьютера зашифрованный том не был подмонтирован.
Если извлечь ключи шифрования не удается, эксперт поищет их в облаке или корпоративной сети (для томов, зашифрованных штатными средствами BitLocker или FileVault 2). Только после этого в ход пойдет лобовая атака — перебор паролей.
С перебором паролей тоже непросто. Во-первых, давно прошли времена, когда под «лобовой атакой» понимался простой брутфорс. Скорость атаки будет такой, что полный перебор всего пространства паролей становится бесполезен, если длина пароля к криптоконтейнеру превышает 7–8 символов. Соответственно, для атак используются словари, в первую очередь — словари, составленные из паролей самого пользователя (извлечь их можно как из компьютера пользователя, так и из его мобильных устройств или напрямую из облака Google Account). Давно разработаны методы анализа паролей и составления правил-шаблонов, на основе которых будут генерироваться «похожие» пароли.
Для атаки в полиции будут использовать один из немногих пакетов программ, позволяющих запустить атаку на множестве (в теории — до нескольких тысяч, в реальности — порядка сотен) компьютеров, каждый из которых будет оснащен несколькими графическими ускорителями. Звучит неправдоподобно? Тем не менее во время тренингов для полиции в разных частях земного шара я видел помещения с компьютерами, использующимися для распределенных атак. Могу сказать о них следующее. Создателей фантастических фильмов в эти помещения, очевидно, не пускают, поэтому на экранах кинотеатров нам приходится наблюдать жалкие плоды убогой фантазии. Просто чтобы обозначить масштаб, поделюсь поразившим меня фактом: на рабочих столах полицейских экспертов одного британского захолустья стоят компьютеры с GeForce 2080 и 40 процессорными ядрами.
Для начала область перебора будет ограничена набором символов, которые встречаются в паролях пользователя.
Дальше опробуют атаку с мутациями (берется слово из словаря, и проверяются его варианты, составленные по довольно простым правилам, которыми пользуется подавляющее большинство обычных пользователей). Кстати, на мутациях чаще всего и заканчиваются попытки атак в тех случаях, когда у полиции нет зацепок — не удалось получить ни одного пароля пользователя.
Если это не сработает, в ход пойдут маски (попытки вручную сконструировать пароли, «похожие» на те, которые были найдены у пользователя).
В особо сложных случаях дело дойдет до гибридных атак (использование комбинаций из одного или двух словарей в комбинации со скриптованными правилами, масками и/или префиксами).
Нестандартные методы
Нестандартно действовать полиция начинает в редких случаях, когда у подозреваемого заранее предполагается наличие зашифрованных «цифровых улик». В этом случае вместе с оперативниками выезжают подготовленные эксперты, которые проконтролируют изъятие и попытаются исследовать включенные, работающие компьютеры прямо на месте. Эксперт попробует сделать следующее.
- Получить доступ к рабочему столу компьютера. Здесь все понятно и известно.
- Сделать дамп оперативной памяти компьютера. Это возможно, если удалось получить доступ к рабочему столу (кстати, в случае с многопользовательскими компьютерами для этого можно взять любую административную учетную запись), но не обязательно: например, заслуженной популярностью пользуется атака через DMA, которая обрела второе дыхание после выхода компьютеров с поддержкой технологии Thunderbolt через порт USB-C.
- Наконец, в особо сложных случаях может использоваться криогенная атака. О ее редкости и экзотичности говорит тот факт, что за все время работы я не встретил ни одного эксперта, который делал бы такой анализ на практике.
На что влияет выбор алгоритма шифрования
Еще во времена TrueCrypt пользователям предлагался выбор из разных алгоритмов шифрования, в том числе несколько вариантов с последовательным шифрованием данных сначала одним, а потом другим алгоритмом. В VeraCrypt выбор существенно расширился. Теперь предлагается пять алгоритмов (AES, Serpent, Twofish, Camellia и «Кузнечик») и десять вариантов их последовательного использования.
Патриотам, желающим воспользоваться алгоритмом шифрования отечественной разработки «Кузнечик», рекомендую ознакомиться с информацией о странностях в таблицах перестановки, которые однозначно указывают на существование намеренно оставленного «черного хода».
Средний пользователь VeraCrypt не понимает, чем отличаются алгоритмы, не интересуется подробностями, но считает, что если выбрать цепочку из двух, а еще лучше трех алгоритмов, то он точно будет защищен и от закладок спецслужб, и от уязвимостей самих алгоритмов.
Правда же заключается в том, что достаточно будет использовать самый известный и простой с вычислительной точки зрения алгоритм. Тот самый AES, который используется всеми — от детей, скачивающих на телефон новую игру, до финансовых воротил и самых что ни на есть специальных спецслужб. За десятилетия повсеместного использования и массовых исследований этот алгоритм так и не взломали, секретных черных ходов не нашли.
На что же на самом деле влияет выбор алгоритма шифрования? Еще одна грустная правда: только и исключительно на скорость доступа к зашифрованным данным.
Шифрование алгоритмом AES использует встроенные в современные процессоры (начиная от самых дешевых ядер ARMv8 и заканчивая даже очень старыми процессорами Intel и AMD) команды для аппаратного ускорения шифрования. Другие алгоритмы тоже могут применять эти команды. Но AES пользуются все, а другими алгоритмами — не все, поэтому их оптимизация оставляет желать лучшего. Самый оптимизированный алгоритм шифрования Camellia уступает AES в скорости шифрования в полтора раза, Twofish уступает AES в три, Serpent — в четыре, а Кузнечик — в четыре с половиной раза. Комбинированные варианты работают еще медленнее, не предоставляя при этом никакой дополнительной безопасности.
Итак, выбор отличного от AES алгоритма шифрования не может улучшить безопасность зашифрованных данных, а вот ухудшить — запросто. А что может улучшить?
Выбор хеш-функции и числа итераций
Для того чтобы зашифровать (ну, и расшифровать тоже) любые данные, криптоконтейнер не использует пароль. Для шифрования любым алгоритмом (от AES до «Кузнечика») берется двоичный ключ фиксированной длины, так называемый Data Encryption Key или Media Encryption Key (MEK). Каким именно образом твой пароль (наверняка очень длинный и безопасный) превращается в MEK фиксированной длины? Откровенно говоря, никаким. Media Encryption Key для единожды созданного контейнера неизменен; он хранится в зашифрованном (точнее сказать, «обернутом», wrapped) виде прямо в составе контейнера, а в «развернутом» виде используется для доступа к данным.
Ключ шифрования данных MEK в обязательном порядке шифруется (прости за тавтологию) ключом шифрования ключа шифрования Key Encryption Key (KEK). Без KEK невозможно расшифровать MEK, а без MEK невозможно расшифровать данные. Для чего нужна такая сложная схема? Хотя бы для того, чтобы ты мог сменить пароль от криптоконтейнера без обязательной расшифровки и перешифровки всего содержимого. Однако роль пары ключей MEK/KEK этим сценарием не ограничивается. Так, достаточно будет затереть несколько десятков байтов в заголовке контейнера (перезаписав область, в которой хранится MEK), и контейнер никто и никогда больше расшифровать не сможет, даже если точно известен пароль. Возможность моментального и безвозвратного уничтожения данных — важная часть общей стратегии безопасности.
Итак, с парой ключей MEK/KEK разобрались. Каким образом из пароля получается ключ KEK? VeraCrypt проводит циклическую последовательность односторонних (это важно) математических преобразований — хеш-функций, причем количество циклов достаточно велико: по умолчанию преобразование выполняется 500 000 раз. Таким образом, с настройками «по умолчанию» на вычисление одного-единственного ключа KEK на основе введенного пароля VeraCrypt потратит от одной до пяти-шести секунд.
Здесь наступает важный момент. Помнишь, чуть выше я разобрал скорость работы алгоритмов шифрования и порекомендовал использовать AES как самый распространенный и самый быстрый вариант? Так вот, с выбором хеш-функции все обстоит с точностью до наоборот: тебе нужен самый нестандартный и самый медленный алгоритм.
В VeraCrypt доступен выбор из четырех хеш-функций: дефолтный SHA-512 (он достаточно медленный и достаточно безопасный, но дефолтный, что для нас минус), еще более медленный и тоже хорошо изученный Whirlpool, старенький SHA-256, который все еще безопасен, но смысла в использовании которого я не вижу, и «темная лошадка» «Стрибог», который в бенчмарке медленнее всех.
Впрочем, от использования хеш-функции «Стрибог» надежно отвращают слова из Википедии: «Разработан Центром защиты информации и специальной связи ФСБ России с участием ОАО „ИнфоТеКС“ на основе национального стандарта Российской Федерации ГОСТ Р 34.11—2012 и введен в действие с 1 июня 2019 года приказом Росстандарта № 1060-ст от 4 декабря 2018 года», а также некоторые тривиальные ошибки и найденные независимыми исследователями странности в таблицах перестановки.
Как правильно настроить преобразование пароля в ключ шифрования KEK? Вот три основных пункта.
- Не используй выбор по умолчанию. Весь софт для взлома криптоконтейнеров без исключений настроен на атаки с настройками «по умолчанию». У эксперта будет выбор настроек (по умолчанию, выбрать конкретную комбинацию параметров или пробовать все комбинации). Атака «по умолчанию» будет самой быстрой, вариант «пробовать все комбинации» — катастрофически медленным, а попытаться выбрать правильную комбинацию параметров шифрования вручную — все равно, что вручную подбирать пароль.
- Выбери самую медленную хеш-функцию (но не «Стрибог»). Да, с медленной хеш-функцией, да еще и отличной от «выбора по умолчанию», твой криптоконтейнер будет монтироваться не одну, а пять-шесть секунд — но и стойкость к атаке вырастет в те же пять-шесть раз (а с учетом «выбора не по умолчанию» — еще сильнее).
- Измени число итераций. Об этом ниже.
Итак, с настройками по умолчанию разобрались, с выбором хеш-функции определились. Однако есть еще один важнейший параметр, скрывающийся за малозаметной галочкой Use PIM. Что за PIM такой и зачем он нужен?
PIM (Personal Iterations Multiplier) напрямую влияет на количество итераций, которые будут использованы для преобразования твоего пароля в ключ шифрования KEK. Согласно документации, VeraCrypt вычисляет количество итераций (число преобразований) по формуле 15 000 + (PIM*1000)
. Для хеш-функций SHA-512 и Whirlpool значение PIM по умолчанию 485, что дает нам ровно 500 000 итераций.
Для чего нужен этот параметр? Дело в том, что вычислительные мощности, в том числе и у тех, кто будет взламывать твой криптоконтейнер, постоянно растут. Защита, эффективная двадцать лет назад, сегодня уже не кажется такой непробиваемой. Однако в случае с VeraCrypt ты можешь легко и изящно повысить стойкость защиты сколь угодно сильно, просто увеличив число итераций. Да, увеличение числа итераций (через кастомное значение PIM) немного снизит удобство использования (при монтировании криптоконтейнера тебе придется, помимо пароля, вводить еще и число PIM), несколько замедлится скорость монтирования. Поверь, однако, что любое, самое незначительное изменение PIM означает сильнейшую головную боль у любого, кто вздумает подобрать пароль.
Насколько сильно изменение PIM повлияет на скорость монтирования криптоконтейнера? Вот время с настройками PIM по умолчанию.
А вот я изменил PIM на значение 500 (с дефолтных 485).
А тут я использовал PIM, равный 1000.
Цифры отнюдь не запредельные: подождать при монтировании зашифрованного тома лишние секунды несложно, а вот у того, кто будет пытаться подобрать пароль к тому, возникнет масса проблем. Общий алгоритм работы взломщиков будет выглядеть так.
- Сначала попробуют все возможные атаки со стандартными настройками. Это — время, часто существенное.
- Если понятно, что значение PIM нестандартное, а число PIM точно известно, атака будет вестись сразу с корректной настройкой. При этом увеличение PIM с 485 до 1000 увеличит время, необходимое для атаки, примерно вдвое. Так себе повышение безопасности, но лучше, чем ничего.
- А вот если значение PIM атакующему неизвестно, то атаку придется проводить для всего ряда значений PIM. То есть если ты выставишь значение PIM = 1000, то КАЖДЫЙ вариант пароля атакующему придется проверять со значениями PIM = 1, 2, 3, …, 1000 (или 485, 486, 487, …, 1000, если атакующий убежден, что значение PIM ты не уменьшал, а исключительно увеличивал). Иными словами, сложность атаки возрастает кратно значению (твой PIM — 485), если атакующий использует только варианты, превышающие значение по умолчанию, либо в (твой PIM) раз, если атакующий решит перебирать всю область значений PIM.
Логичный вопрос: разве увеличение длины пароля на два-три знака из расширенного набора символов не даст схожий (и даже лучший) результат? Если подходить с чисто вычислительной точки зрения, то даст. Реальность же такова, что большая часть атак проводится с настройками по умолчанию; программы, способные использовать атаки с нестандартным значением PIM, можно пересчитать по пальцам одной руки, а программ, которые способны автоматизировать атаки с кастомным рядом значений PIM, и того меньше.
Рассмотрим скриншот свежей сборки Elcomsoft Distributed Password Recovery с поддержкой VeraCrypt (кстати, даже не вышедшей еще официально).
На нем мы видим атаку в стандартной конфигурации: алгоритм шифрования AES, хеш-функция — SHA-512. Никаких сюрпризов. Скорость атаки — 170 паролей в секунду (это с загрузкой всех ядер процессора и с использованием вычислительных ресурсов видеокарты; без видеокарты мы бы увидели скорость порядка 0,5 пароля в секунду).
Но если ты сменишь хеш-функцию, то такой атакой, как показана на первом скриншоте, пароль найти не получится. Соответственно, будет применяться вторая атака — уже по всему спектру алгоритмов шифрования и хеш-функций.
Что мы видим на втором скриншоте? Во-первых, скорость перебора резко упала до одного пароля в секунду — это с использованием GPU-ускорителя.
А чего мы не видим на втором скриншоте? Мы не видим возможности провести атаку на число итераций PIM. Число итераций PIM в большинстве программ для взлома паролей можно указать вручную. Таким образом, нестандартное число итераций сделает атаку неэффективной: даже если твой пароль — 123, найти его не получится, не указав точного числа итераций.
Разумеется, если есть проблема, для нее найдется и решение. В свежей бете небезызвестного инструмента hashcat заявлены два любопытных параметра: --veracrypt-pim-start
и --veracrypt-pim-stop
(commit с изменением). А что будет со скоростью перебора? Если неизвестны точные параметры шифрования (комбинация из алгоритма шифрования и хеш-функции), то скорость перебора уже достаточно низкая: всего один пароль в секунду на компьютере с аппаратным ускорителем GPU. А теперь подели эту цифру на количество возможных вариантов PIM, и получишь исключительно медленный перебор. В реальности же перебор будет еще медленнее: если с низкими значениями PIM проверка пароля займет доли секунды, то большое число итераций замедлит перебор в несколько раз по сравнению со стандартным значением.
Защита ключа шифрования
Итак, мы выбрали шифрование AES, хеш-функцию Whirlpool, а число итераций выставили скромненько 1111 (чтоб и нестандартно, и не забыть случайно). Это полностью защитит контейнер от атаки на пароль, но, как мы помним из начала статьи, полиция может вообще не устраивать такую атаку, если сможет просто вытащить ключ шифрования из твоего компьютера.
Взять готовый ключ шифрования и с его помощью смонтировать (или расшифровать целиком) зашифрованный раздел — любимый и самый быстрый способ, которым пользуется полиция. Суть его заключается в следующем.
Как ты знаешь, для того чтобы зашифровать (и расшифровать) данные, криптоконтейнер не использует пароль. Для шифрования любым алгоритмом (от AES до «Кузнечика») используется двоичный ключ фиксированной длины, так называемый Data Encryption Key или Media Encryption Key (MEK). Ты уже в курсе, каким сложным образом твой пароль (наверняка очень длинный и безопасный) превращается в ключ фиксированной длины. Дело сейчас не в этом.
Логично, что ключ шифрования данных (MEK) хранится в оперативной памяти компьютера. Это необходимо для того, чтобы программа-криптоконтейнер могла получить доступ к зашифрованным данным в принципе. Обрати внимание: ключ шифрования хранится в оперативной памяти совершенно независимо от того, какой алгоритм шифрования ты выбрал в настройках контейнера. AES, Twofish, Serpent, «Кузнечик» или любая комбинация алгоритмов — независимо от твоего выбора ключи шифрования будут храниться в оперативной памяти, а сложность и скорость их извлечения практически одинакова.
Таким образом, сложность этой атаки мало зависит как от выбора алгоритма шифрования, так и от способа преобразования твоего пароля в двоичный ключ. Максимум, чего удастся добиться нестандартными настройками, — это увеличение времени поиска ключа в образе оперативной памяти, условно говоря, с десяти-пятнадцати минут до полутора-двух часов (цифры условные: многое зависит как от объема оперативной памяти компьютера, с которого делался дамп, так и от скорости накопителя и центрального процессора, где этот дамп анализируется).
Можно ли защититься от подобных атак? Полноценная защита от извлечения ключей шифрования из оперативной памяти компьютера достаточно сложна, а на обычном десктопе может и вовсе оказаться невозможной (противостоять криогенной атаке вообще достаточно тяжело, но и вероятность ее применения исчезающе мала). В то же время ты можешь включить в настройках VeraCrypt недавно появившуюся возможность шифрования ключей шифрования в оперативной памяти компьютера.
Обрати внимание: настройка доступна начиная с VeraCrypt 1.24 (на момент написания статьи актуальна сборка 1.24 Update 4). По умолчанию опция выключена; если ее включить, использование оперативной памяти драйвером увеличится примерно на 10%, производительность упадет на 5–15% (источник), а также будет отключена возможность гибернации.
Но это только часть защиты. В файл подкачки или файл гибернации также могут попасть и сами данные, которые хранятся в зашифрованном контейнере, а встроенная в VeraCrypt функция отключения гибернации может не сработать. По-хорошему также необходимо отключить ее на уровне Windows. Опции Hybrid sleep и, собственно, Hibernation.
Обрати также внимание на режим «быстрой загрузки» (Fast Startup) на первом скриншоте. В этом режиме (по умолчанию он, кстати, включен) при выключении компьютера Windows сохраняет состояние ядра в файл на системном диске. Этот файл — в некотором роде урезанный (без user space) аналог файла гибернации. Его наличие позволяет ускорить процесс последующей загрузки, но оно же приводит к возможности утечки ключа шифрования томов VeraCrypt. Отключение режима Fast Startup поможет защититься от этой уязвимости.
Если же жертвовать режимом гибернации не хочется, то стоит подумать о шифровании системного диска с помощью того же BitLocker’а. В этом случае и файл подкачки, и файл гибернации будут надежно защищены.
Облако и ключи восстановления доступа
Для VeraCrypt этот момент не критичен, но BitLocker по умолчанию предлагает пользователю сохранить ключ восстановления доступа к зашифрованному диску в облако OneDrive. Если его удастся оттуда извлечь (а полиции обычно удается, достаточно сделать запрос в Microsoft), то расшифровка данных становится тривиальной. Атака сработает и в том случае, если ты сохранишь подобный ключ на USB-накопителе, доступ к которому получит полицейский эксперт или злоумышленник. Иными словами, ключи восстановления доступа — палка о двух концах, и с точки зрения чистой безопасности лучше их не иметь, чем иметь.
Заключение
Надеюсь, я смог изменить твои представления о безопасности криптоконтейнеров в целом и VeraCrypt в частности. Вооружившись новыми знаниями, ты сможешь создавать зашифрованные контейнеры, обладающие на несколько порядков более высокой стойкостью к парольным атакам. Кроме того, использование недавно появившихся малоизвестных настроек безопасности позволит тебе защититься и от излюбленных атак на оперативную память, файлы подкачки и гибернации. В то же время разработчики VeraCrypt не гарантируют безопасность любых данных, попадающих в оперативную память компьютера, так что речь идет скорее не о стопроцентной защите, а о существенном осложнении соответствующих атак с не менее существенным снижением их эффективности и вероятности успешно вскрыть зашифрованный том.