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

Атака padding oracle

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

Принцип работы

Режим CBC и дополнение (padding)

В режиме CBC каждый блок открытого текста перед шифрованием подвергается операции XOR с предыдущим зашифрованным блоком (или вектором инициализации для первого блока). Поскольку длина открытого текста не всегда кратна размеру блока, применяется дополнение. Наиболее распространённый стандарт — PKCS#7 (RFC 5652), где последний блок дополняется байтами, значение каждого из которых равно количеству добавленных байт. Например, если не хватает 3 байт, дополнение будет состоять из трёх байт со значением 0x03. Если длина текста кратна размеру блока, добавляется целый блок из байт 0x10 (для 16-байтового блока).

Утечка информации

При расшифровке сервер сначала расшифровывает блок, затем проверяет корректность дополнения. Если дополнение валидно, сервер возвращает успешный ответ (например, HTTP 200). Если нет — сообщает об ошибке (HTTP 403, 500, или другое исключение). Эта разница в поведении и является «оракулом» (oracle). Злоумышленник, перехвативший зашифрованный текст, может многократно отправлять модифицированные версии на сервер и по ответам определять, когда дополнение становится валидным.

Механизм атаки

Цель

Расшифровать произвольный зашифрованный блок C_i, зная только предыдущий блок C_{i-1} и имея доступ к оракулу.

Шаги для расшифровки одного блока

  1. Выбор промежуточного состояния. Злоумышленник работает с последним блоком C_n и предыдущим C_{n-1}. Он создаёт модифицированный блок C'_{n-1}, который будет подаваться на вход XOR с расшифрованным C_n.
  2. Подбор последнего байта. Злоумышленник изменяет последний байт C'_{n-1} так, чтобы после XOR с расшифрованным значением D(C_n) последний байт полученного открытого текста стал равен 0x01. Сервер, получив запрос, проверяет дополнение. Если последний байт равен 0x01, дополнение считается валидным (один байт со значением 1). Если нет — сервер возвращает ошибку. Путем перебора 256 возможных значений злоумышленник находит то, при котором оракул даёт положительный ответ.
  3. Вычисление расшифрованного байта. Зная, что P_n[15] = C'_{n-1}[15] XOR D(C_n)[15], и что P_n[15] = 0x01 в момент успеха, злоумышленник вычисляет D(C_n)[15] = C'_{n-1}[15] XOR 0x01.
  4. Подбор предпоследнего байта. Злоумышленник изменяет два последних байта C'_{n-1} так, чтобы после XOR с расшифрованным значением последние два байта стали равны 0x02 0x02. Для этого он фиксирует уже найденное значение D(C_n)[15] и подбирает C'_{n-1}[14] до тех пор, пока оракул не подтвердит валидность дополнения из двух байт.
  5. Повторение для всех байт. Процесс повторяется для каждого байта блока, начиная с последнего и заканчивая первым. На каждом шаге злоумышленник подбирает один байт, фиксируя уже найденные значения.

Полное расшифрование

После расшифровки последнего блока C_n злоумышленник переходит к предыдущему блоку C_{n-1}, используя в качестве предыдущего блок C_{n-2}. Процедура повторяется для всех блоков, кроме первого, для которого требуется знание вектора инициализации (IV). Если IV известен (например, передаётся открыто), он расшифровывается аналогично. В результате злоумышленник получает весь открытый текст.

История

Первое описание

Впервые атака padding oracle была описана в 2002 году группой исследователей: Сержем Воже (Serge Vaudenay) в работе «Security Flaws Induced by CBC Padding — Applications to SSL, IPSEC, WTLS...». Воже показал, что утечка информации о корректности дополнения может быть использована для полного расшифрования данных.

Известные реализации

  • POODLE (2014) — атака на SSLv3, использующая уязвимость в дополнении блочных шифров. Позволяла расшифровать куки сессии.
  • Lucky13 (2013) — атака на TLS, основанная на временных различиях при проверке дополнения в режиме CBC.
  • Padding oracle в ASP.NET (2010) — уязвимость в платформе Microsoft, позволявшая расшифровать данные аутентификации.
  • Атака на библиотеку OpenSSL (2016) — ошибка в реализации CBC-режима, позволявшая проводить padding oracle атаку через сеть.

Условия успешной атаки

Для проведения атаки необходимо выполнение следующих условий:

  • Использование симметричного шифрования в режиме CBC с дополнением по стандарту PKCS#7 (или аналогичному).
  • Наличие оракула — сервера, который явно или неявно сообщает о корректности дополнения. Различие может быть в коде ответа HTTP, времени обработки, сообщении об ошибке или даже в одном бите (например, успешный запрос возвращает 200, а неуспешный — 500).
  • Возможность многократной отправки модифицированных зашифрованных текстов (обычно не менее 256 запросов на байт, в среднем 128).

Защита от атаки

Криптографические меры

  • Использование режимов с аутентификацией — например, GCM (Galois/Counter Mode) или CCM (Counter with CBC-MAC). Эти режимы включают проверку целостности и аутентичности, что делает padding oracle атаку невозможной, так как сервер отвергает любые модификации шифротекста до расшифровки.
  • MAC-then-Encrypt — использование кода аутентификации сообщения (MAC) перед шифрованием. Однако эта схема уязвима к другим атакам (например, к атаке на сжатие).
  • Постоянное время проверки — реализация проверки дополнения за фиксированное время, независимо от результата. Это затрудняет временные атаки, но не защищает от атак, основанных на кодах ответа.

Практические рекомендации

  • Отказ от режима CBC — переход на современные режимы шифрования с аутентификацией (AES-GCM, ChaCha20-Poly1305).
  • Единая обработка ошибок — сервер должен возвращать одинаковый ответ (например, HTTP 500) при любой ошибке расшифровки, независимо от причины (некорректное дополнение, неверный ключ, повреждённые данные).
  • Ограничение числа запросов — блокировка IP-адресов после определённого количества неудачных попыток расшифровки.

Пример атаки

Рассмотрим гипотетический сценарий: веб-приложение шифрует данные сессии в режиме AES-128-CBC с дополнением PKCS#7. Злоумышленник перехватывает зашифрованный cookie-файл, состоящий из двух блоков: C_1 и C_2. Он отправляет на сервер запрос с модифицированным C_1 и исходным C_2. Сервер расшифровывает, проверяет дополнение и возвращает:

  • HTTP 200, если дополнение корректно.
  • HTTP 500, если дополнение некорректно.

Злоумышленник, подбирая байты C_1, последовательно восстанавливает все 16 байт расшифрованного C_2. Затем он повторяет процесс для C_1, используя в качестве предыдущего блок вектор инициализации (IV), который обычно передаётся открыто. В результате злоумышленник получает полный открытый текст cookie.

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

Атака padding oracle является классическим примером того, как незначительная утечка информации (один бит) может привести к полной компрометации шифрования. Однако она имеет ограничения:

  • Требует большого числа запросов (в среднем 128 на байт, то есть 2048 на 16-байтовый блок). Для длинных сообщений количество запросов может быть значительным.
  • Зависит от наличия оракула. Если сервер не различает ошибки дополнения и другие ошибки, атака неэффективна.
  • Не работает против режимов с аутентификацией (GCM, CCM, EAX).

Применение в реальных атаках

Padding oracle атаки были использованы в нескольких громких инцидентах:

  • POODLE (2014) — атака на SSLv3, затронувшая миллионы веб-сайтов. Привела к отказу от SSLv3 в современных браузерах.
  • Lucky13 (2013) — атака на TLS 1.0 и 1.1, показавшая, что даже постоянное время проверки не гарантирует защиту из-за особенностей реализации.
  • Уязвимость в ASP.NET (2010) — позволила расшифровать данные аутентификации в веб-приложениях Microsoft. Microsoft выпустила обновление, рекомендующее использовать режим GCM.

Источники

  • Vaudenay, Serge. «Security Flaws Induced by CBC Padding — Applications to SSL, IPSEC, WTLS...» (2002).
  • Möller, B., Duong, T., Kotowicz, K. «This POODLE Bites: Exploiting The SSL 3.0 Fallback» (2014).
  • AlFardan, N., Paterson, K. «Lucky Thirteen: Breaking the TLS and DTLS Record Protocols» (2013).
  • Rizzo, J., Duong, T. «Practical Padding Oracle Attacks» (2010).
  • RFC 5652 — Cryptographic Message Syntax (CMS) — раздел о дополнении PKCS#7.
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru