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