Модель угроз ГОСТ CMS и безопасная обработка контейнеров¶
В криптографическом документообороте атакуют не только шифр. Уязвимостями становятся доверие к сертификату, ошибки ASN.1, неканонические атрибуты, выбор профиля, доступность CRL, организация ключей и логика приложения. Эта глава связывает алгоритмы с проверяемой защитой документов.
Поверхности атаки¶
| Где возникает риск | Пример атаки или ошибки | Требуемая защита |
|---|---|---|
| Входной ASN.1 | Глубокая вложенность, некорректные длины | Ограничения ресурсов, отказ без побочных эффектов |
| Detached-документ | Подмена внешнего файла или нормализация байтов | Строгое сравнение messageDigest и signedAttrs |
| Набор подписантов | Удаление одной из сильных подписей | Политика все/некоторые + RFC 5752 при применимости |
| Сертификаты внутри CMS | Подложенный CA или сертификат с чужой цепочкой | Явный trust store, PKIX, KU/EKU, политики |
| CRL/OCSP | Недоступность, устаревший ответ, неизвестный статус | Проверка подписей, актуальности, строгая политика отказа |
| Выбор алгоритма | Подмена OID, неявный downgrade | Белый список профилей и параметров |
| Key management | Неподходящий UKM/кривая, повтор ключей | Выполнение правил RFC 7836 и установленного профиля |
| AEAD | Повтор nonce, выдача данных до проверки тега | Управление nonce, отказ до публикации plaintext |
| S/MIME | Перекодировка и смена MIME-структуры | Каноникализация согласно почтовому профилю |
Границы доверия¶
[Внешний файл/письмо] ── НЕДОВЕРЕННЫЕ БАЙТЫ
│
▼
[Декодер MIME/ASN.1] ── НЕ ПРОИСХОЖДЕНИЕ
│
▼
[Криптографическая библиотека] ── ПРОВЕРКА ПОДПИСИ/ТЕГА
│
▼
[Trust store + CRL/OCSP] ── ДОПУЩЕН ЛИ КЛЮЧ?
│
▼
[Бизнес-правила] ── ДОПУЩЕН ЛИ ДОКУМЕНТ?
Ни один слой не должен объявлять успешной работу последующего. Разделяйте parse PASS, crypto PASS, trust PASS, policy PASS. Для системы с отложенной обработкой фиксируйте также версию криптобиблиотеки и политику на момент проверки.
Подписанное — не всегда конфиденциальное¶
SignedData может содержать открытые данные вместе с подписью. ГОСТ Р 34.10 обеспечивает проверяемую подпись, но не шифрует документ. EnvelopedData создаёт конфиденциальность, но без дополнительной подписи сам по себе не доказывает автора. Для одновременных целей используйте правильно согласованную вложенную композицию, а при AEAD — соответствующий профиль хранения тега: RFC 5652, RFC 5083, MGM.
Логика принятия документа¶
Объявите в политике, что делать с: несколькими подписями, неизвестным SignerInfo, истёкшим сертификатом, недоступной CRL, устаревшим алгоритмом, неподдерживаемым OID, локальной подписью неизвестного CA, недопустимым MIME-типом и недоверенной отметкой времени. Не используйте «прошло у одного клиента» как замену перечню правил.
Для разработчиков: при парсинге сторонних ASN.1-структур вводите лимиты размера файла, числа подписей/получателей, глубины вложенности и времени операции. Сохраняйте оригинальные байты, чтобы диагностическое извлечение не изменяло проверяемый объект.
Практическая стратегия тестирования¶
- Положительный образец от второй независимой реализации.
- По одному отрицательному образцу на каждый класс угроз: документ, подпись, параметры, цепочка, отзыв, формат.
- Два направления: НАЙС.ОС → другая система, другая система → НАЙС.ОС.
- Фиксация конечных байтов, OID, версии RPM, режима чтения и журналов.
- Повторение тестов после обновления OpenSSL,
libksba,gpgsm, системного trust store.
См. проверку доверия, SignedData, матрицу интеграции, приёмку, руководство по совместимости.
Источники¶
Далее: диагностика → план межоперабельности.
Пределы AEAD и защита от повторного использования параметров¶
При шифровании MGM или другим аутентифицированным режимом необходимо соблюдать требования к nonce, ключам и тегу. Повтор использования nonce с тем же ключом может серьёзно нарушить защищённость режима. Само наличие AEAD не означает защиту от повторного целого корректного сообщения: против replay могут потребоваться счётчики, идентификаторы сообщений или прикладные правила. Указанные механизмы относятся к внешнему протоколу, а не возникают автоматически из формата CMS.
В режиме, не обеспечивающем аутентификации шифротекста, успешная расшифровка и осмысленный текст не доказывают отсутствия подмены. Это особенно опасно в автоматической обработке бухгалтерских и служебных документов, где решение может зависеть от полей полученного сообщения. Перед автоматической обработкой следует различать результат расшифрования и результат проверки целостности/происхождения.
Невозможность доказать доверие из одного контейнера¶
Злоумышленник может сформировать синтаксически правильный SignedData и подписать его собственным ключом. Криптографическая операция будет математически корректна, но подпись не станет доверенной без необходимой цепочки и политики. Аналогично, подписанный сертификат внутри certificates может быть полезен декодеру, но не должен добавляться в список доверенных CA только потому, что получен вместе с документом.
Что учесть при реализации API проверки¶
Программный интерфейс должен сообщать четыре независимых статуса: формат входных данных, криптографический результат, доверие к ключу и результат бизнес-политики. Недопустима архитектура, где openssl cms -cmsout -print трактуется как подтверждение подписи или где ошибка сети при получении CRL автоматически превращается в успешный ответ. Для каждой операции нужны лимиты размера и времени, а пользовательские имена файлов должны нормализоваться перед записью на диск.
Для обновлений и инцидентов создавайте воспроизводимые тесты, основанные на сохранённых публичных сертификатах и тестовых контейнерах, но не распространяйте рабочие приватные ключи и пароли в репозитории документации.
Связанные разделы: политика ключей, практика ротации, RFC 5083 для AEAD CMS, RFC 5752 о нескольких подписях.