Открыть сервис

CRYPT_EXPORTABLE

CRYPT_EXPORTABLE — это константа, используемая в криптографическом API (CryptoAPI) операционной системы Microsoft Windows, а также в некоторых других криптографических библиотеках. Она задаёт значение флага, который определяет, может ли криптографический ключ быть экспортирован (передан) из системы, в которой он был создан или сохранён, в другую систему или хранилище. В контексте безопасности константа играет ключевую роль в управлении жизненным циклом и защитой ключей, особенно в сценариях, где требуется предотвращение несанкционированного копирования конфиденциальных криптографических данных.

Определение и назначение

Константа CRYPT_EXPORTABLE (обычно имеет значение 0x00000001) используется в функциях, таких как CryptGenKey, CryptDeriveKey, CryptImportKey и CryptAcquireContext, входящих в состав CryptoAPI. Она передаётся в параметре dwFlags при создании или импорте ключа. Если флаг установлен, ключ может быть экспортирован из контейнера ключей с помощью функции CryptExportKey. Если флаг не установлен (или установлен флаг CRYPT_USER_PROTECTED), ключ становится неэкспортируемым, то есть его нельзя извлечь в виде открытого или зашифрованного блока данных для передачи или хранения вне защищённого контейнера.

Назначение константы — обеспечение гибкого управления политиками безопасности. В сценариях, где ключ должен быть доступен только на одном устройстве (например, для шифрования локальных файлов или для аутентификации на конкретном сервере), его неэкспортируемость предотвращает кражу или утечку даже при наличии доступа к системе. В других случаях, например, при обмене ключами между серверами или при резервном копировании, экспортируемость необходима.

История и контекст

CryptoAPI была представлена компанией Microsoft в составе Windows 2000 и Windows 98 (второе издание) как часть платформы Windows для обеспечения криптографических операций. Константы, такие как CRYPT_EXPORTABLE, были введены для стандартизации параметров создания ключей. В более поздних версиях Windows, включая Windows 10 и Windows 11, API остаётся обратно совместимым, хотя Microsoft рекомендует использовать более современные библиотеки, такие как Cryptography API: Next Generation (CNG), где управление экспортом ключей реализовано через другие механизмы (например, атрибуты ключей в хранилищах).

В контексте безопасности, неэкспортируемые ключи (когда флаг не установлен) стали важным элементом для защиты ключей, используемых в смарт-картах, аппаратных модулях безопасности (HSM) и виртуальных смарт-картах. Однако в ранних реализациях CryptoAPI были выявлены уязвимости, позволяющие обойти защиту неэкспортируемых ключей через атаки на память процесса или через перехват вызовов API. Microsoft исправляла такие уязвимости в обновлениях безопасности, но полная защита требует использования аппаратных средств.

Технические детали

Значение и использование

Константа CRYPT_EXPORTABLE определена в заголовочном файле wincrypt.h как #define CRYPT_EXPORTABLE 0x00000001. Она может комбинироваться с другими флагами, такими как CRYPT_CREATE_SALT, CRYPT_USER_PROTECTED, CRYPT_ARCHIVABLE и другими, с помощью битовой операции OR. Например, для создания экспортируемого ключа шифрования сеанса используется вызов:

``c CryptGenKey(hProv, CALG_RC4, CRYPT_EXPORTABLE, &hKey); ``

Если требуется создать неэкспортируемый ключ, флаг не указывается:

``c CryptGenKey(hProv, CALG_RC4, 0, &hKey); ``

Влияние на функции

  • CryptGenKey: создаёт новый ключ. Если флаг установлен, ключ будет экспортируемым. Если нет — неэкспортируемым.
  • CryptDeriveKey: создаёт ключ на основе хеша пароля. Флаг управляет экспортируемостью полученного ключа.
  • CryptImportKey: импортирует ключ из внешнего источника. Флаг CRYPT_EXPORTABLE может быть указан, чтобы сделать импортированный ключ экспортируемым (по умолчанию импортированные ключи неэкспортируемы, если не указан флаг).
  • CryptExportKey: экспортирует ключ в виде блока данных. Если ключ неэкспортируемый, функция возвращает ошибку NTE_BAD_KEY.

Примеры сценариев

  1. Шифрование локального файла: ключ создаётся без флага CRYPT_EXPORTABLE, чтобы злоумышленник, получивший доступ к системе, не мог извлечь ключ и расшифровать файл на другом устройстве.
  2. Обмен ключами между серверами: ключ создаётся с флагом CRYPT_EXPORTABLE, затем экспортируется в зашифрованном виде с помощью другого ключа (например, открытого ключа получателя) и передаётся по сети.
  3. Резервное копирование ключей: администратор может создать экспортируемый ключ для резервного копирования, но затем удалить его из системы и хранить только в защищённом хранилище.

Критика и ограничения

Использование CRYPT_EXPORTABLE в CryptoAPI имеет ряд недостатков. Во-первых, флаг является статическим атрибутом ключа, который не может быть изменён после создания. Это означает, что если ключ был создан как неэкспортируемый, его нельзя сделать экспортируемым без повторного создания. Во-вторых, защита неэкспортируемых ключей в CryptoAPI основана на программных механизмах, которые могут быть обойдены при наличии у злоумышленника прав администратора или доступа к памяти процесса. В-третьих, в современных версиях Windows Microsoft рекомендует использовать CNG, где управление экспортом ключей осуществляется через политики хранилищ и атрибуты ключей, что обеспечивает более гибкую и безопасную модель.

Кроме того, в некоторых реализациях CryptoAPI (например, в Windows 2000) были обнаружены уязвимости, позволяющие экспортировать неэкспортируемые ключи через специальные вызовы API или через манипуляции с контейнерами. Microsoft выпускала исправления, но полная защита требует использования аппаратных модулей безопасности (HSM) или смарт-карт, где ключи физически не покидают устройство.

Альтернативы в современных системах

В Windows, начиная с Windows Vista, основным криптографическим API является CNG (Cryptography API: Next Generation). В CNG управление экспортом ключей реализовано через атрибуты, такие как NCRYPT_EXPORT_POLICY_PROPERTY, который может принимать значения, разрешающие или запрещающие экспорт, а также требующие подтверждения пользователя. Кроме того, CNG поддерживает аппаратные ключи, где экспорт невозможен физически. В Linux и других Unix-подобных системах аналогичные функции предоставляются библиотеками OpenSSL и GnuTLS, где экспорт ключей контролируется через параметры функций, таких как EVP_PKEY_export или через флаги при создании ключей.

Интересные факты

  • Константа CRYPT_EXPORTABLE используется не только в Windows, но и в некоторых эмуляторах CryptoAPI, таких как Wine, для обеспечения совместимости.
  • В ранних версиях Windows (до Windows 2000) CryptoAPI не поддерживала неэкспортируемые ключи, что приводило к уязвимостям в приложениях, использующих шифрование.
  • В некоторых реализациях CryptoAPI для смарт-карт (например, в Microsoft Base Smart Card Cryptographic Service Provider) флаг CRYPT_EXPORTABLE игнорируется, так как ключи физически не могут быть экспортированы из смарт-карты.

Источники

  • Microsoft Developer Network (MSDN): документация по функциям CryptGenKey, CryptExportKey, CryptImportKey.
  • Windows CryptoAPI: Security and Implementation Guide (Microsoft, 2002).
  • «Cryptography in Windows» by John Viega and Matt Messier (O'Reilly Media, 2004).
  • Microsoft Security Bulletins MS02-022, MS03-041 (исправления уязвимостей CryptoAPI).
  • Спецификация Windows API: заголовочный файл wincrypt.h.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →