что такое intel software guard extensions
Intel Software Guard Extensions, учебное руководство. Часть 2, устройство приложения
Вторая часть в серии учебных материалов по Intel Software Guard Extensions (Intel SGX) представляет собой общее описание приложения, которое мы будем разрабатывать: простой диспетчер паролей. Поскольку мы создаем это приложение с нуля, то можно с самого начала предусмотреть использование Intel SGX. Это означает, что в дополнение к требованиям к приложению мы рассмотрим, каким образом требования для Intel SGX и общая архитектура приложения влияют друг на друга.
Диспетчеры паролей — краткое описание
Пользователи, как правило, знают, что такое диспетчеры паролей и для чего они служат, но всегда полезно еще раз пройтись по общей информации перед тем, как заниматься подробностями устройства приложения.
Основные цели диспетчера паролей:
При использовании диспетчера паролей достаточно запомнить всего одну очень стойкую парольную фразу, чтобы получить доступ к базе данных паролей (хранилищу паролей). После входа в диспетчер паролей можно найти все сохраненные там пароли, скопировать и вставить их в поля проверки подлинности на нужных сайтах. Разумеется, главным уязвимым местом диспетчера паролей является база данных паролей: это излюбленная мишень злоумышленников, поскольку в ней хранятся все пароли пользователя. Поэтому база данных паролей шифруется с помощью стойких алгоритмов шифрования, а для расшифровки содержащихся в них данных используется главная парольная фраза пользователя.
Наша цель в этом учебном руководстве — создать простой диспетчер паролей, предоставляющий те же основные функции, что и аналогичные коммерческие продукты, соблюдая при этом рекомендации в области безопасности и используя эту программу в качестве упражнения, чтобы изучить Intel SGX. Этот учебный диспетчер паролей я решил назвать «Tutorial Password Manager с Intel Software Guard Extensions» (да, произнести непросто, зато название говорит само за себя). Эта программа не предназначена для использования в качестве коммерческого продукта и, безусловно, не будет содержать всех защитных механизмов, свойственных коммерческим решениям, но для обучения такой уровень подробностей и не требуется.
Базовые требования к приложению
Базовые требования к приложению помогут ограничить область приложения, чтобы можно было сосредоточиться на интеграции Intel SGX, а не на тонкостях проектирования и разработки приложения. Напомню, перед нами не стоит задача создания коммерческого продукта: от программы Tutorial Password Manager с Intel SGX не требуется возможности запуска в множестве операционных систем или на всех возможных архитектурах ЦП. Требуется лишь некая действующая отправная точка.
Второе требование предоставляет нам доступ к определенным алгоритмам шифрования в ветви кода без поддержки Intel SGX и к некоторым библиотекам, которые нам потребуются. Требование использования 64-разрядной операционной системы упрощает разработку приложения за счет доступа к 64-разрядным типам собственного кода. Кроме того, повышается скорость работы некоторых алгоритмов шифрования, оптимизированных для 64-разрядного кода.
Третье требование предоставляет нам доступ к инструкции RDRAND в ветви кода без поддержки Intel SGX. Это существенно упрощает генерацию случайных чисел и обеспечивает доступ к источнику с высокой энтропией. Системы, поддерживающие инструкцию RDSEED, смогут использовать ее. (Сведения об инструкциях RDRAND и RDSEED см. в руководстве по внедрению программного обеспечения генерации случайных чисел Intel).
Четвертое требование поддерживает наивозможную краткость списка программного обеспечения, требуемого разработчику (и пользователю). Не требуется загружать и устанавливать никакие сторонние библиотеки, платформы, приложения и служебные программы. Впрочем, у этого требования есть не слишком приятный побочный эффект: если отказаться от сторонних платформ, то у нас остается всего четыре варианта создания пользовательского интерфейса. Вот эти варианты:
Платформа пользовательского интерфейса
Для связывания управляемого и неуправляемого кода мы будем использовать C++/CLI (то есть C++, измененный для Common Language Infrastructure). Это существенно упрощает упаковку данных и настолько удобно, что многие разработчики называют этот метод «IJW» (It Just Works — это просто работает).
Рисунок 1. Минимальные структуры компонентов приложений Intel Software Guard Extensions для собственного кода и C#.
На рис. 1 показано влияние на минимальный состав компонентов приложения Intel SGX при переходе от собственного кода к C#. При использовании только собственного кода уровень приложения может напрямую взаимодействовать с DLL-библиотекой анклава, поскольку функции моста анклава можно встроить в исполняемый файл приложения. В смешанном приложении функции моста анклава потребуется выделить из блока управляемого кода, поскольку эти функции должны быть полностью собственным кодом. С другой стороны, приложение C# не может напрямую взаимодействовать с функциями моста, а в модели C++/CLI это означает, что нужно создать еще один промежуточный уровень: DLL-библиотеку, которая передает данные между управляемым приложением C# и DLL-библиотекой моста анклава, состоящей только из собственного кода.
Требования к хранилищу паролей
Шифрование хранилища при хранении означает, что файл хранилища должен быть зашифрован, когда он не находится в активном использовании. При этом хранилище должно быть зашифровано на диске (если бы не было требования переносимости, то требование шифрования можно было бы решить, используя функцию запечатывания в Intel SGX), и не должно находиться в расшифрованном виде в оперативной памяти дольше, чем необходимо.
Шифрование с проверкой подлинности гарантирует, что зашифрованное хранилище не было изменено после шифрования. Также благодаря этому мы получаем удобное средство проверки парольной фразы пользователя: если ключ расшифровки неверный, расшифровка выдаст отказ при проверке тега подлинности. В этом случае нам нет необходимости изучать расшифрованные данные, чтобы убедиться в их правильности.
Пароли
Пароль учетной записи расшифровывается лишь в случае, когда пользователь этого требует. Благодаря этому ограничивается уязвимость пароля в оперативной памяти и на экране.
Алгоритмы шифрования
Поскольку наши требования к шифрованию уже определены, пора выбрать определенные алгоритмы шифрования, и в этом отношении существующие требования к нашему приложению существенно ограничивают доступные варианты. Программа Tutorial Password Manager должна работать как на платформах, поддерживающих Intel SGX, так и без Intel SGX, при этом запрещено использовать сторонние библиотеки. Это означает, что необходимо выбрать алгоритм, размер ключа и размер тега подлинности, поддерживаемые и в API Windows CNG, и в доверенной библиотеке шифрования Intel SGX. На практике это означает, что в нашем распоряжении остается один-единственный возможный алгоритм: AES-GCM с 128-разрядным ключом. Это, пожалуй, не самый лучший режим шифрования для использования в приложении, особенно поскольку эффективная стойкость тега подлинности 128-разрядного GCM меньше 128 бит, но для наших целей этого будет достаточно. Помните: наша задача — создание не коммерческого продукта, а учебного пособия по использованию Intel SGX.
Ключи шифрования и проверка подлинности пользователей
После выбора алгоритма шифрования можно перейти к ключу шифрования и проверки подлинности пользователей. Как пользователь проходит проверку подлинности в диспетчере паролей, чтобы открыть свое хранилище?
Самый простой способ — формировать ключ шифрования напрямую из парольной фразы или пароля пользователя, используя функцию формирования ключа (KDF). Этот простой подход вполне работоспособен, но у него есть один существенный недостаток: если пользователь сменит пароль, то вместе с ним изменится и ключ шифрования. Вместо этого мы применим более распространенный подход и зашифруем ключ шифрования.
В этом случае первичный ключ шифрования формируется случайным образом на основе источника с высокой энтропией и никогда не меняется. Парольная фраза или пароль пользователя используется для формирования вторичного ключа шифрования, и этот вторичный ключ используется, чтобы зашифровать первичный ключ. У этого подхода есть ряд важных преимуществ:
Последнее требование, касающееся создания функции формирования ключа на основе алгоритма SHA-256, обусловлено ограничением, проистекающим из необходимости использовать алгоритм хэширования, который поддерживается и в API Windows CNG, и в библиотеке шифрования Intel SGX.
Сведения учетной записи
Рисунок 2. Предварительный макет главного окна Tutorial Password Manager.
Последнее требование посвящено упрощению кода. Если зафиксировать количество учетных записей, находящихся в хранилище, можно легче определить верхнюю границу размера хранилища. Это будет важно при проектировании анклава. Разумеется, настоящие диспетчеры паролей лишены такой роскоши, но в учебном руководстве мы вполне можем себе это позволить.
В дальнейших выпусках
В третьей части этого учебного руководства мы подробнее рассмотрим устройство приложения Tutorial Password Manager для Intel SGX. Мы определим секреты, решим, какие части приложения должны находиться внутри анклава, каким образом анклав будет взаимодействовать с основным приложением и как анклав влияет на объектную модель. Следите за новостями!
Intel® SGX: переход от зашифрованных данных к конфиденциальным вычислениям
Вопросы к ИТ-специалистам, которые необходимо учитывать по мере того, как появляется информация о новых уязвимостях.
Какова критичность уязвимости? Подробнее о балле CVSS.
Имеется ли патч от поставщика и применяется ли он в моей сети?
Каковы векторы атаки, необходимые для выполнения? Уязвим ли я для них?
Позволяет ли код моего приложения использовать проверенные методы защиты от атак?
Имеется ли код атаки? Зафиксированы ли случаи, когда он был найден?
Понимание расширений Intel® Software Guard (Intel® SGX)
Что такое атака в побочных каналах, и нужно ли мне беспокоиться?
Атаки в побочных каналах основаны на использовании информации, такой как состояние питания, излучение и время ожидания непосредственно от процессора, — для косвенного получения информации о паттернах использования данных. Эти атаки — весьма сложные, и их нелегко осуществлять; для них потенциально требуются бреши в защите ЦОД на нескольких уровнях: физическом, сетевом и системном.
Хакеры, как правило, идут по пути наименьшего сопротивления. В настоящее время это обычно означает атаки на программное обеспечение. Хотя Intel® SGX не предназначены специально для защиты от атак по побочным каналам, они обеспечивают своего рода изоляцию кода и данных, которая повышает барьер, защищающий от атак. Корпорация Intel продолжает тесное сотрудничество с нашими клиентами и исследовательским сообществом для выявления потенциальных рисков в побочных каналах и их устранения. Несмотря на существование уязвимостей в побочных каналах, Intel® SGX остаются ценным инструментом, поскольку обеспечивают мощный дополнительный уровень защиты.
8 предназначений Intel Software Guard Extensions
Одной из функциональных новинок, появившихся в процессорах Intel Core шестого поколения (Skylake), стала технология Intel Software Guard Extensions (Intel SGX). Легко убедиться гуглением, что информации о ней в интернете не так много. Мы решили восполнить этот пробел, тем более что под рукой у нас оказалась статья одного из разработчиков этой технологии, Мэтью Хойкстра (Matthew Hoekstra); в ней он описывает цели, которые преследует Intel SGX. Приводим ее перевод.
Если говорить о сути, то Intel SGX – это набор новых инструкций процессора, которые могут использоваться приложениями для выделения приватных областей кода и данных. Создавая эту технологию, мы преследовали следующие цели.
Цель 1. Позволить разработчикам приложений защитить чувствительные данные от несанкционированного доступа или изменения со стороны зловредного ПО, запущенного с более высокими привилегиями.
Хотел бы выделить в этом пункте несколько принципиальных моментов. Первое, защита чувствительных данных подразумевает обеспечение и их конфиденциальности (предотвращение утечек), и целостности (защита от подделок). Второе, защищать необходимо не только данные, но и код (например, атакующий может легко получить доступ к данным, изменив или отключив авторизацию). Третье, данные должны быть защищены не только когда они хранятся в зашифрованном виде, но и во время рантайма, когда они не зашифрованы и активно используются для вычислений. Наконец, критически важно обеспечить защиту рантайма против вредоносного ПО, обошедшего систему контроля привилегий с целью получить более высокий уровень прав.
Цель 2. Позволить приложениям обеспечивать конфиденциальность и целостность чувствительных данных и кода, не вмешиваясь в работу системы контроля привилегий, не мешая ей планировать и контролировать ресурсы платформы.
Чувствительные данные и код должны быть защищены от вредоносного ПО запущенного с высоким уровнем прав, однако в то же время система контроля привилегий должна постоянно делать свою работу, мешать ей нельзя. Недопустимо, чтобы защищаемые приложения брали на себя или нарушали базовую функциональность системы, такую как планирование задач, управление устройствами и т.д. Операционные системы развивались много лет, чтобы хорошо выполнять эти задачи, и создавать параллельную им сущность было бы непрактично.
Цель 3. Позволить пользователям компьютерных устройств держать над ними контроль, в то же время предоставляя свободу устанавливать и удалять приложения и сервисы.
Работа доверенного приложения не должна требовать каких-то специфических конфигураций и не должна ограничивать контроль пользователя над его компьютером. Обычной практикой обеспечения защиты сегодня является жесткое ограничение набора приложений, которое может быть загружено на платформу. В игровые приставки, смартфоны и т.д. сейчас обычно встроена специализированная операционная система, которая накладывает различного рода ограничения на доступность и поведение приложений, дабы не допустить проблем с безопасностью.
Корпоративное использование устройств может налагать еще более строгие дополнительные ограничения (например, на подключения USB-накопителей). В принципе, в этих мерах нет ничего плохого, но они не должны быть обязательными для обеспечения конфиденциальности и целостности данных. Это условие становится еще более очевидным, если мы будем говорить о персональном ПК, где необходимость в доверенном окружении так же велика, как и потребность в персонализации.
Цель 4. Позволить платформе измерять доверенный код приложения и производить с помощью процессора подписанный аттестат, который включает в себя это измерение и прочие сертификаты, удостоверяющие, что код был корректно инициализирован в доверенной среде.
Разрешая пользователю контролировать ПО на платформе, мы порождаем проблему доверенной доставки приложений. Как кто-либо может быть уверен, что платформа обладает всеми необходимыми примитивами для поддержки доверенных вычислений, которые требуются приложению, или что установленное приложение не было подделано? Или, говоря другими словами, как приложение может доказать, что оно доверенное?
Чтобы определить, было ли приложение корректно загружено и инициализировано, можно сравнить подпись приложения (криптографический хэш его отпечатка памяти в заранее заданной точке исполнения) с ожидаемым значением, полученным из считающейся доверенной системы – это называется измерением приложения. Чтобы подтвердить свое происхождение, измерение подписано приватным ключом, известным только доверенной системе, которая производит измерение.
Отметим, что разработчики не могут полагаться на вычисления, делаемые программно системой; как говорилось ранее, ПО всегда можно виртуализировать или обмануть с помощью вредоносной программы, имеющей достаточный уровень привилегий. Таким образом, вычисление должно быть аппаратным и исполняться тем же компонентом, которое создает доверенную среду, загружает/инициализирует доверенное приложение и осуществляет вычисление чувствительных данных.
Цель 5. Позволить разработчикам создавать доверенные приложения с использованием известных им средств и процессов.
Первые 4 цели обеспечивают преимущества более закрытой среды путем уменьшения набора сущностей, которые должны быть доверенными, при этом платформы остаются открытыми а выбор пользователя – свободным. Однако из этого не следует, что процесс разработки ПО останется неизменным. Например, если выяснится, что разработчикам придется кардинально менять свои процессы или они будут вынуждены писать софт под проприетарный контроллер безопасности, продуктивность процесса значительно уменьшится.
Цель 6. Позволить производительности доверенных приложений увеличиваться с ростом производительности процессоров.
Эта цель вырастает из идеи минимализации влияния на существующий процесс разработки ПО. Одной из движущих сил этого процесса состоит в том, что разработчики пытаются получить максимум преимуществ от увеличивающейся производительности процессора. Было бы здорово, если бы доверенные приложения не имели проблем с производительностью по сравнению с прочими.
Цель 7. Позволить производителям ПО распространять и обновлять приложения, используя наиболее удобные для них способы.
Если предлагаемое решение требует, чтобы независимые создатели ПО тесно работали с производителями платформ с целью предустановить их приложения в момент производства платформы или же обновления ПО могут быть установлены только вместе с обновлением системы, это также будет помехой созданию инновационных продуктов.
Цель 8. Позволить приложениям определять защищенные области кода и данных, которые содержат конфиденциальность, даже в том случае, если атакующий физически контролирует платформу и может производить прямые атаки на ее память.
Эффективное решение должно обеспечивать защиту от различных типов аппаратных атак, включая и те случаи, когда платформа физически находится в распоряжении врага. Исследователи Принстонского университета демонстрируют одну из таких атак. Возможны и другие варианты с использованием анализаторов шины памяти или подобных техник.
Intel Software Guard Extensions, серия учебных материалов. Часть 1, основы Intel SGX
Первая часть в серии учебных материалов по Intel Software Guard Extensions (Intel SGX) представляет собой краткое описание этой технологии. Дополнительные сведения см. в документации в составе Intel Software Guard Extensions SDK. Список всех учебных материалов в этой серии см. в статье Представляем серию учебных материалов, посвященных Intel Software Guard Extensions.
Технология Intel Software Guard Extensions
Программным приложениям зачастую приходится работать с конфиденциальной информацией, например с паролями, номерами счетов, финансовыми данными, ключами шифрования, медицинскими данными. Доступ к этим данным должен быть только у полномочных получателей. В терминологии Intel SGX такая конфиденциальная информация называется «секретом приложения».
Задача операционной системы состоит в применении политики безопасности в компьютере, чтобы эти секреты не были непреднамеренно раскрыты другим пользователям или приложениям. Операционная система не даст пользователю получить доступ к файлам другого пользователя (без предоставленного явным образом разрешения); не даст одному приложению получить доступ к памяти другого приложения; не даст пользователю без необходимых прав получить доступ к ресурсам ОС, исключая строго контролируемые ресурсы. В приложениях часто используются дополнительные защитные меры, например шифрование данных, чтобы исключить доступ третьими сторонами к данным, пересылаемым в хранилище или по сетевому подключению, даже если злоумышленникам удалось получить доступ к ОС и к оборудованию.
Несмотря на все эти защитные меры, в большинстве компьютерных систем все равно остаются уязвимые места. Разнообразные механизмы защищают одно приложение от другого и защищают ОС от пользователя, не имеющего разрешений, но приложения обычно практически никак не защищены от процессов, выполняющихся с более высоким уровнем прав, включая саму ОС. Вредоносные программы, обладающие правами администратора, имеют неограниченный доступ ко всем системным ресурсам и ко всем приложениям, запущенным в системе. Усовершенствованные вредоносные программы могут атаковать защитные механизмы приложения, чтобы извлечь ключи шифрования и даже секретные данные непосредственно из памяти.
Корпорация Intel разработала расширения Intel SGX для высокоуровневой защиты секретов и для защиты от таких программных атак. Intel SGX — это набор инструкций ЦП, дающих возможность приложениям создавать анклавы: защищенные области в адресном пространстве приложения, обеспечивающие конфиденциальность и целостность даже при наличии вредоносных программ с расширенными правами. Код анклавов поддерживается особыми инструкциями, он компилируется и загружается в виде файла библиотеки динамической компоновки Windows * (DLL).
Расширения Intel SGX позволяют снизить уязвимость приложений. На рис. 1 показана значительная разница между потенциальными областями атаки при наличии и при отсутствии анклавов Intel SGX.
Рисунок 1. Области атаки с анклавами и без анклавов Intel Software Guard Extensions
Как технология расширений Intel Software Guard Extensions помогает защищать данные
Intel SGX обеспечивает следующую защиту от атак, нацеленных на оборудование и программ.
Рисунок 2. Защита данных в анклавах Intel Software Guard Extensions в защищенных приложениях
Как это устроено
Для использования Intel SGX приложение должно быть разделено на два компонента (см. рис. 3).
В анклавах также следует свести к минимуму взаимодействие между доверенными и недоверенными компонентами. Анклавы могут выходить за пределы защищенной области памяти и вызывать функции в недоверенном компоненте (с помощью особых инструкций), но рекомендуется ограничивать такие зависимости, чтобы обеспечить более надежную защиту анклава от атак.
Рисунок 3. Выполнение приложения Intel Software Guard Extensions
Аттестация
В архитектуре SGX аттестация — это подтверждение создания определенного анклава на платформе. Существует два механизма аттестации.
Локальная аттестация
Локальная аттестация полезна, когда у приложений есть несколько анклавов, которые должны работать вместе для выполнения какой либо задачи, или когда два отдельных приложения должны обмениваться данными между анклавами. Каждый из анклавов должен проверить другой анклав, чтобы убедиться в его надежности. После этого анклавы устанавливают защищенный сеанс и используют обмен ключами ECDH, чтобы совместно использовать ключ сеанса. Этот ключ сеанса можно использовать, чтобы шифровать данные, которые должны быть общими для обоих анклавов.
Один анклав не может получить доступ к защищенному пространству памяти другого анклава, даже если оба анклава созданы одним и тем же приложением, поэтому необходимо убрать из всех указателей ссылки на их значения и скопировать; полный набор данных должен быть передан из одного анклава в другой.
Удаленная аттестация
При удаленной аттестации программные расширения Intel SGX и оборудование платформы формируют предложение, которое передаются на сторонний сервер для установления доверия. Программное обеспечение включает анклав приложения, а также компонент Quoting Enclave (QE) и Provisioning Enclave (PvE), предоставляемые корпорацией Intel. Оборудование для аттестации — ЦП, поддерживающий Intel SGX. Сводка программной информации в сочетании с уникальным для платформы асимметричным ключом оборудования используются для формирования предложения, которое передается на удаленный сервер по проверенному каналу. Если удаленный сервер определяет, что экземпляр анклава был создан правильно и запущен на процессоре, поддерживающем Intel SGX, то сервер устанавливает доверительные отношения и передает секреты по проверенному каналу.
Запечатывание данных
Запечатывание данных — это шифрование данных, чтобы можно было записывать их в недоверенную память или хранилище, не раскрывая содержимое. Эта данные могут быть позже прочитаны анклавом и распечатаны (расшифрованы). Ключи шифрования создаются внутри по запросу и не раскрываются для анклава.
Существует два способа запечатывания данных.
Запечатывание с удостоверением анклава
При запечатывании с удостоверением анклава ключ является уникальным для конкретного анклава, запечатавшего данные. При любых изменениях анклава, влияющих на его подпись, будет создан новый ключ. При использовании этого метода данные, запечатанные одной версией анклава, будут недоступны для другой версии этого же анклава. Побочный эффект этого метода состоит в том, что запечатанные данные невозможно перенести в новые версии приложения и его анклава. Такой подход предназначен для предложений, в которых старые запечатанные данные не должны использоваться новыми версиями приложения.
Запечатывание с удостоверением запечатывания
При запечатывании с удостоверением запечатывания несколько анклавов из одного и того же центра могут запечатывать и распечатывать данные друг друга. Это позволяет переносить данные из одной версии анклава в другую или совместно использовать данные несколькими приложениями одного и того же поставщика.
Если нужно запретить доступ старых версий ПО и анклава к данным, запечатанным в новых версиях приложения, можно использовать номер версии ПО при подписании анклава. Версии анклава, более старые по сравнению с указанным номером версии ПО, не смогут образовать ключ, поэтому не смогут распечатать данные.
Как мы будем использовать технологию Intel Software Guard Extensions в учебном руководстве
Мы рассмотрели три важнейших компонента Intel SGX: анклавы, аттестацию и запечатывание. В этом учебном руководстве мы сосредоточимся на реализации анклавов, поскольку это основа Intel SGX. Невозможно провести аттестацию или запечатывание, не создав анклав. Кроме того, это позволит ограничить размер учебного руководства.
В дальнейших выпусках
Во второй части серии учебных материалов Расширения Intel Software Guard Extensions: часть 2, создание приложений мы рассмотрим диспетчер паролей, который будет создан с поддержкой Intel SGX. Мы опишем требования к созданию этого приложения, ограничения и пользовательский интерфейс. Следите за новостями.