Почему шифрование диска не панацея?
Спасибо всем, что пришли, сегодня мы поговорим о полном шифровании жёсткого диска (FDE), которое не так безопасно, как вы думаете. Поднимите руки, кто шифрует таким образом HDD своего компьютера. Поразительно! Ну что же, добро пожаловать на DefCon!
Похоже на то, что 90% из вас используют для шифрования диска программы с открытым исходным кодом, чтобы иметь возможность провести их аудит. Теперь пусть поднимут руки те, кто полностью выключает компьютер, если оставляет его без присмотра. Я думаю, примерно 20% присутствующих. Скажите, а кто вообще оставляет свой компьютер без присмотра на несколько часов, всё равно, включён он или выключен? Считайте, что я задаю эти вопросы, просто убедиться, что вы не зомби и не спите. Я думаю, что практически всем приходилось оставлять свой компьютер хотя бы на несколько минут.
Итак, почему мы шифруем наши компьютеры? Трудно найти того, кто задавался бы этим вопросом, поэтому я думаю, что действительно важно сформулировать мотивацию конкретных поступков в области обеспечения безопасности. Если мы не сделаем этого, то не сможем понять, как же нужно организовать эту работу.
Существует масса документации на программное обеспечение, осуществляющее шифрование диска, которая описывает, что делает это ПО, какие алгоритмы оно использует, какие пароли и так далее, но почти нигде не говорится о том, зачем это делается.
Итак, мы зашифровываем свой компьютер, потому что хотим контролировать наши данные, мы хотим гарантировать их конфиденциальность и то, что никто не сможет их украсть или изменить без нашего ведома. Мы хотим решать сами, как поступать со своими данными и контролировать, что с ним происходит.
Существуют ситуации, когда вы просто обязаны обеспечить секретность данных, например, если вы юрист или врач, обладающей конфиденциальной информацией клиента. Это же касается финансовой и бухгалтерской документации. Компании обязаны сообщать клиентам об утечке такой информации, например, если кто-то оставил незащищённый ноутбук в автомобиле, который угнали, и теперь эта конфиденциальная информация может оказаться в свободном доступе в интернете.
Кроме того, необходимо контролировать физический доступ к компьютеру и обеспечить его защиту от физического воздействия, потому что FDE ничем не поможет, если кто-то физически завладеет вашим компьютером.
Если мы хотим обеспечить безопасность сети, нам необходимо контролировать доступ к компьютеру конечного пользователя. Мы не сможем построить безопасный интернет, не обеспечив безопасность каждого конечного пользователя.
Итак, мы разобрались с теоретическими аспектами необходимости шифрования диска. Мы знаем, как генерировать случайные числа для обеспечения безопасности ключей, как управлять режимами блочного шифрования, используемого для полного шифрования диска, как безопасно осуществлять наследование ключа для паролей, так что можно считать, что «миссия выполнена», как сказал президент Буш, выступая на борту авианосца. Но вы знаете, что это не так, и нам ещё многое нужно сделать для её завершения.
Даже если у вас имеется безупречная криптография и вы знаете, что её практически невозможно взломать, в любом случае она должна быть реализована на реальном компьютере, где у вас нет никаких аналогов надёжных «черных ящиков». Злоумышленнику не нужно атаковать криптографию, если он пытается взломать полное шифрование диска. Для этого ему нужно просто атаковать сам компьютер или каким-то образом обмануть пользователя, убедив его предоставить пароль, или же использовать клавиатурный перехватчик keylogger, и т.д.
Реальное использование шифрования не совпадает с моделью безопасности FDE. Если рассмотреть ПО, предназначенное для полного шифрования диска, видно, что его создатели уделяли очень много внимания теоретическим аспектам шифрования. Я приведу выдержку из технической документации с веб-сайта программы TrueCrypt: «Наша программа не защитит никакие данные на компьютере, если атакующий имеет физический доступ к компьютеру до запуска или в процессе работы TrueCrypt».
В принципе, вся их модель безопасности выглядит так: «если наша программа правильно шифрует диск и правильно его расшифровывает диск – мы сделали свою работу». Извиняюсь за текст, который изображён на следующем слайде, если вам трудно его прочесть, я сделаю это сам. Это выдержки из переписки между разработчиками TrueCrypt и исследователем проблем безопасности Джоанной Рутковской по поводу атак «уборщика».
TrueCrypt: «Мы никогда не рассматриваем возможность аппаратных атак, мы просто предполагаем худшее. После того, как злоумышленник «поработал» над вашим компьютером, вы просто должны перестать использовать его для хранения конфиденциальной информации. Криптопроцессор TPM не в состоянии предотвратить аппаратные атаки, например, с использованием кейлоггеров.
Джоанна Рутковская спросила их: «Как можно определить, «поработал» ли злоумышленник над вашим компьютером или нет, ведь вы не носите ноутбук всё время с собой?», на что разработчики ответили: «Нас не волнует, каким образом пользователь обеспечивает сохранность и неприкосновенность своего компьютера. Например, пользователь мог бы использовать замок или помещать ноутбук на время своего отсутствия в запираемый шкаф или сейф». Джоанна ответила им очень корректно: «Если я собираюсь пользоваться замком или сейфом, зачем мне вообще ваше шифрование»?
Таким образом, игнорирование возможности подобной атаки – это обман, мы не можем так поступать! Мы живем в реальном мире, где существуют эти системы, с которыми мы взаимодействуем и которые используем. Не существует никакого способа сравнить 10 минут атаки, выполняемой только с помощью программного обеспечения, например, с «флешки», с чем-то, что вы можете выполнять, манипулируя системой исключительно с помощью аппаратных средств.
Таким образом, независимо от того, что они говорят, физическая безопасность и устойчивость к физическим атакам зависит от FDE. Не имеет значения, от чего вы отказываетесь в своей модели безопасности, и, по крайней мере, если они не хотят брать на себя ответственность, то им следует предельно ясно и честно объяснить пользователю, как легко может быть взломана защита, которую они предлагают.
На следующем слайде изображена схема загрузки абстрактного FDE, которая используется в большинстве современных компьютеров.
Как мы знаем, загрузчик грузится с SSD/HDD с помощью BIOS и копируетс�� в основную память по пути передачи данных Storage Controller – PCI Bus – Platform Controller Hub. Затем загрузчик запрашивает у пользователя данные аутентификации, такие как пароль или ключ смарт-карты. Далее пароль проходит путь от клавиатуры к процессору, после чего загрузчик принимает управление на себя, при этом оба компонента – ОС и ключ — остаются в памяти для того, чтобы обеспечить прозрачность процесса шифрования и дешифровки диска. Это идеализированный взгляд на процесс, предполагающий, что никто не попытается каким-то образом в него вмешаться. Я думаю, что вы прекрасно знаете несколько способов, как это можно взломать, поэтому давайте перечислим вещи, которые могут пойти не так, если кто-то попытается на вас напасть. Я подразделяю атаки на 3 уровня.
Первый – неинвазионный, не требующий захвата вашего компьютера, так как осуществляется с помощью флеш-накопителя с вредоносным ПО. Вам не нужно «разбирать» систему, если вы можете без проблем подсоединить к ней любой аппаратный компонент типа PCI card, ExpressСard или Thunderbolt – новейший адаптер Apple, предоставляющий открытый доступ к шине PCI.
Для атак второго уровня понадобится отвёртка, потому что вам может потребоваться временно удалить какой-либо компонент системы, чтобы иметь дело с ним в вашей собственной маленькой среде. Третий уровень, или «атака паяльником», является самым сложным, здесь вы физически либо добавляете, либо модифицируете компоненты системы, такие как чипы, чтобы попытаться их взломать.
Одним из типов атак первого уровня является скомпрометированный загрузчик, также известный под названием атака «evil maid», где вам нужно выполнить некоторый незашифрованный код в рамках процесса загрузки системы, что-то, что вы можете загрузить сами, используя персональную информацию пользователя, чтобы затем получить доступ к остальной части данных, зашифрованных на жестком диске. Есть несколько различных способов сделать это. Вы можете физически изменить загрузчик в системе хранения. Вы можете скомпрометировать BIOS или загрузить вредоносный BIOS, который возьмёт под контроль адаптер клавиатуры или процедуры чтения диска и модифицирует их так, чтобы они были устойчивы к удалению жесткого диска. Но в любом случае, вы можете модифицировать систему так, что когда пользователь вводит свой пароль, он будет записываться на диск в незашифрованном виде, или проделать что-то подобное, это не составит особого труда для хакера.
Вы можете проделать нечто похожее на уровне операционной системы. Это особенно актуально, если вы используете не полное шифрование диска, а шифрование контейнера.
Это также может произойти при атаке системы эксплойтом, благодаря которому атакующий получает root-права и может прочитать ключ из основной памяти, это весьма распространённый способ атаки. Этот ключ может быть сохранен на жестком диске в виде открытого текста для последующего применения злоумышленником или отправлен по сети системе Command&Control.
Другая возможность – это клавиатурный перехват с помощью кейлоггера, будь то программное обеспечение, аппаратное обеспечение или что-то экзотическое, типа камеры «игольное ушко» или например, микрофон, который записывает звуки, сопровождающие нажатия клавишей пользователем, и пытается выяснить, что это за клавиши. Предотвратить такую атаку трудно, потому что потенциально она включает в себя компоненты, которые находятся за пределами системы.
Я также хотел бы упомянуть атаки восстановления данных, более известные как «атаки методом холодной перезагрузки» Cold Boot Attack. Если бы лет 5 назад вы спросили даже очень подкованных в компьютерной безопасности людей, каковыми были свойства безопасности основной памяти, они бы сказали, что при отключении электропитания данные пропадают очень быстро.
Но в 2008 году были опубликованы отличные исследования Принстона, который обнаружил, что на самом деле даже при комнатной температуре в течение нескольких секунд наблюдается очень незначительные потери данных в памяти RAM. И если охладить модуль до криогенных температур, вы можете получить несколько минут, в течение которых происходит лишь незначительная деградация данных в основной памяти.
Таким образом, если ваш ключ находится в основной памяти и кто-то извлёк модули из вашего компьютера, они могут атаковать ваш ключ, обнаружив, где он находится в основной памяти в открытом виде. Существуют определённые методы противостоять этому на аппаратном уровне, например, принудительная очистка содержимого памяти при отключении питания или перезагрузке, но это не поможет, если кто-то просто вытащит модуль и поместит его в другой компьютер либо в выделенную часть оборудования для извлечения содержимого его памяти.
Наконец, существует возможность прямого доступа к памяти. Любое PCI — устройство в вашем компьютере имеет возможность в обычном режиме считывать и записывать содержимое любого сектора в основную память. Они могут делать все, что угодно.
Это было разработано еще тогда, когда компьютеры были намного медленнее и мы не хотели, чтобы центральный процессор «нянчился» с каждой передачей данных устройству из основной памяти. Таким образом, устройства получают возможность прямого доступа к памяти, процессор может выдавать им команды, которые они просто могут завершить, но данные будут оставаться в памяти всякий раз, когда вам это нужно.
В этом состоит проблема, потому что PCI-устройства могут быть перепрограммированы. Многие из этих вещей имеют записываемую прошивку, которую вы можете просто перепрошить на что-то враждебное. И это может поставить под угрозу безопасность всей операционной системы, так как позволит осуществить любую форму атаки, даже модифицировать саму ОС или извлечь ключ напрямую. В компьютерной криминалистике существует оборудование, предназначенное для таких вещей в процессе расследования преступлений: они подключают что-то к вашему компьютеру и вытаскивают содержимое памяти. Вы можете сделать это с помощью FireWire, ExpressСard или Thunderbolt… Фактически всё это внешние порты, обеспечивающие доступ к внутренней системной шине.
Итак, было бы неплохо, если бы можно было не хранить ключ в RAM, потому что мы вроде как продемонстрировали, что оперативная память не очень надежна с точки зрения безопасности. Существует ли какое-нибудь выделенное хранилище ключей или специальное криптографическое оборудование? Да, существует. Можно использовать криптографические ускорители для веб-сервера, чтобы обрабатывать больше SSL-транзакций в секунду. Они устойчивы к несанкционированному вмешательству. У центров сертификации СА есть вещи, которые хранят их совершенно секретные ключи, но на самом деле они не предназначены для таких высокопроизводительных операций, как использование шифрования диска. Итак, есть ли другие варианты?
Можем ли мы использовать процессор как своего рода псевдоаппаратный крипто-модуль? Можем ли мы вычислить что-то вроде симметричного алгоритма блочного шифрования AES в ЦП, используя вместо RAM только нечто типа регистров ЦП?
Intel и AMD добавили в процессоры отличные новые инструкции, которые взяли на себя работу выполнять AES, так что теперь вы можете выполнять операции примитивного блочного шифрования всего лишь с одной простой инструкцией по сборке. Вопрос состоит в том, можем ли мы оставить наш ключ в памяти или мы можем выполнить этот процесс, не полагаясь на основную память? В современных процессорах x86 есть довольно большой набор регистров, и если кто-то из вас действительно пытался сложить все биты, которые имеются в этих, получается около 4 килобайт. Таким образом, мы можем фактически использовать некоторые CPU для хранения ключей и создания пространства для выполнения операций шифрования.
Одна из возможностей — использование аппаратных регистров отладки точек остановок. В типичном процессоре Intel имеется 4 таких регистра, и в системе x64 каждый из них будет содержать 64-битный указатель. Это 256 бит потенциального дискового пространства, которое большинство людей никогда не будет использовать. Конечно, преимущество использования регистров отладки состоит в их привилегированности, потому что доступ к ним может получить только операционная система. Здесь есть и другие приятные преимущества, например, при отключении питания процессора при выключении системы или переходе её в спящий режим вы действительно потеряете все содержимое регистра, так что можете не бояться «холодной перезагрузки».
Парень из Германии, Тило Мюллер, реализовал эту подобную штуку под названием TRESOR для Linux в 2011 году. Он протестировал производительность такой системы и сделал вывод, что она работает ничуть не медленнее, чем при регулярном вычислении AES программным обеспечением.
Как насчет того, чтобы вместо одного ключа хранить два 128-битных ключа? Это приведёт нас к большему пространству криптомодуля. Мы можем хранить один мастер-ключ, который никогда не покидает процессор при загрузке, а затем загружать и выгружать версии ключей, необходимые нам для совершения дополнительных операций и решения дополнительных задач.
Проблема в том, что мы можем хранить наш код или наши ключи вне основной памяти, но CPU в любом случае все равно будет обрабатывать содержимое памяти. Так, использование DMA, технологии прямого доступа к памяти, минуя центральной процессор, или другие манипуляции, позволяют изменить операционную систему и сохранять ее дамп вне регистров главной памяти, или, если используются более экзотические способы, вне регистров отладки.
Мы можем что-нибудь сделать с углом атаки DMA? Как оказалось, да, можем. В последнее время, в рамках новых технологий для повышения виртуализации серверов, по соображениям производительности людям нравится иметь возможность подключить, скажем, сетевой адаптер к виртуальному серверу, поэтому он должен подключаться через гипервизор.
Технология IOMMU была разработана таким образом, что вы можете изолировать устройство PCI в своем собственном маленьком разделе памяти, откуда оно не сможет произвольно читать и записывать в любом месте системы. Это идеально: мы можем настроить разрешения IOMMU для защиты нашей операционной системы или того, что мы используем для обработки ключей, и защитить их от произвольного доступа.
Опять таки, наш друг из Германии, Тило Мюллер, реализовал версию TRESOR на микробитном визоре под названием BitVisor, который это делает. Это позволяет запускать отдельную операционную систему и прозрачно осуществляет доступ к шифрованию диска, и здорово то, что вам не нужно об этом заботиться или что-либо об этом знать. Доступ к диску полностью прозрачен для ОС, операционная система не может получить доступ к регистрам отладки, и IOMMU настроен таким образом, что гипервизор полностью защищен от каких-либо манипуляций.
Но, как оказалось, в памяти, кроме ключей шифрования диска, существуют и другие вещи, о которых стоит позаботиться. Есть проблема, которую я уже упоминал – раньше мы использовали шифрование контейнеров, а теперь преимущественно выполняем полное шифрование диска.
Мы делаем полное шифрование диска, потому что очень трудно убедиться в том, что вы случайно не запишите ваши конфиденциальные данные во временные файлы или системный кеш в процессе шифрования контейнера. Теперь, когда мы оцениваем RAM как небезопасное, ненадежное место для хранения данных, мы должны относиться к ней соответственным образом. Мы должны зашифровать все данные, утечка которых нежелательна, всё действительно важное, такое, как SSH-ключи, приватные ключи или PGP-ключи, даже менеджер паролей и любые документы категории «совершенно секретно», с которыми вы работаете.
У меня была очень глупая идея: можем ли мы зашифровать RAM? Или, по крайней мере, большую часть основной памяти, в которой будем хранить секреты, чтобы минимизировать возможный объём утечки.
И, повторюсь, удивительно это или нет, но ответ – да, можем! В доказательство этой концепции в 2010 году парень по имени Питер Петерсон попытался реализовать решение шифрования оперативной памяти RAM. Фактически шифруется не вся оперативная память — он разделил основную память на две части: небольшой незашифрованный компонент фиксированного размера под названием “clear”, и более крупное псевдоустройство подкачки, где все данные зашифровывались перед тем, как сохраниться в основной памяти. При этом синтетические тесты показали снижение производительности системы в 10-50 раз. Однако в реальном мире, когда вы запускаете, например, тест веб-браузера, он на самом деле работает довольно хорошо – всего лишь на 10% медленнее. Я думаю, с этим можно примириться. Проблема с этим доказательством реализации концепции заключалась в том, что он хранил ключ для расшифровки в основной памяти, потому что куда еще его можно было поместить? Автор рассматривал возможность использования таких вещей, как TPM для массовых операций шифрования, но эти вещи работали даже медленнее, чем выделенная аппаратная криптосистема, поэтому были полностью непригодны для использования.
Но если у нас есть возможность использовать процессор как своего рода псевдоаппаратный крипто-модуль, то он находится прямо в центре событий и должен быть очень быстрым, чтобы делать подобные вещи. Так что, возможно, мы сможем использовать что-то вроде этого с помощью высокопроизводительного CPU.
Допустим, что у нас есть такая система. Наши ключи не находятся в основной памяти, и наш код, ответственный за управление ключами, защищен от произвольного доступа вредоносных аппаратных компонентов к чтению и записи. Основная память зашифрована, поэтому большинство наших секретов не будут просачиваться, даже если кто-то попытается выполнить атаку холодной перезагрузки. Но как ��ам получить систему, загруженную до этого состояния? Ведь нам нужно начать с выключенной системы, пройти аутентификацию и запустить систему. Как можно проделать это самым надежным способом? В конце концов, кто-то все еще может модифицировать системное программное обеспечение, чтобы обмануть нас так, что мы будем думать, что запускаем эту “большую новую” систему, на самом деле ничего такого не делая.
Таким образом, одной из важнейших тем является возможность проверки целостности наших компьютеров. Пользователь должен быть в состоянии проверить, что компьютер не был взломан, прежде чем на нём аутентифицироваться. Для этого мы можем использовать инструмент — доверенный платформенный модуль Trusted Platform Module – реализацию спецификации, описывающей криптопроцессор. Это своего рода плохой рэп, позже мы подробнее поговорим об этом, но у него есть возможность измерить последовательность загрузки несколькими различными способами, чтобы позволить вам контролировать, какие данные TPM будут предоставлены конкретным состояниям конфигурации системы. Таким образом, вы сможете «запечатать» данные в конкретной конфигурации программного обеспечения, которое вы запускаете в системе. Есть несколько различных подходов к реализации этого, и есть замысловатая криптография, затрудняющая обход этой реализации. Так что, возможно, это реально сделать.
Что же такое ТРМ? Изначально это было своего рода грандиозное решение для управления цифровыми правами медиа-компаний. Медиа-компании могут удаленно проверить, что ваша система работает в какой-то «одобренной» конфигурации, прежде чем они позволят вам запустить программное обеспечение и разблокировать ключ доступа к видеофайлам. В действительности это оказалось весьма неудачным решением, поэтому никто даже не пытается практически использовать его для этих целей.
Я думаю, что лучший способ реализации такой идеи – это смарт-карта, которая закреплена на вашей материнской плате. Она может выполнять некоторые криптографические операции, RSA/SHA1, имеет генератор случайных чисел, и у нее есть контрмеры против физических атак, во время которых кто-то пытается получить доступ к хранящимся на ней данным. Единственная реальная разница между ТРМ и смарт-картой заключается в том, что она имеет возможность измерять состояние загрузки системы в регистры конфигурации платформы и обычно это отдельный чип на материнской плате. Таким образом, она может оказать положительное влияние на обеспечение безопасности.
23:10 мин