В криптографии атака оракула заполнения — это атака, которая использует проверку заполнения криптографического сообщения для расшифровки зашифрованного текста. В криптографии сообщения открытого текста переменной длины часто приходится дополнять (расширять), чтобы они были совместимы с базовым криптографическим примитивом . Атака основана на наличии « оракула заполнения », который свободно отвечает на запросы о том, правильно ли заполнено сообщение или нет. Информация могла передаваться напрямую или просачиваться по побочным каналам .
Самая ранняя известная атака, в которой используется оракул заполнения, - это атака Блейхенбахера 1998 года, которая атакует RSA с заполнением PKCS # 1 v1.5 . [1] Термин «заполняющий оракул» появился в литературе в 2002 году, [2] после атаки Сержа Водене на дешифрование в режиме CBC , используемое в симметричных блочных шифрах . [3] Варианты обеих атак продолжают пользоваться успехом спустя более десяти лет после их первоначальной публикации. [1] [4] [5]
В 1998 году Дэниел Бляйхенбахер опубликовал основополагающую статью о так называемой атаке Блейхенбахера (также известной как «атака миллиона сообщений»). В атаке используется оракул заполнения против RSA с заполнением PKCS #1 v1.5 , но он не включает этот термин. Более поздние авторы классифицировали его атаку как атаку оракула. [1]
Мангер (2001) сообщает об атаке на замену заполнения PKCS #1 v1.5 на PKCS #1 v2.0 «OAEP». [6]
В симметричной криптографии атака оракула заполнения может быть применена к режиму работы CBC . Утечка данных о достоверности заполнения может позволить злоумышленникам расшифровать (а иногда и зашифровать) сообщения через оракул с использованием ключа оракула, не зная ключа шифрования.
По сравнению с атакой Блейхенбахера на RSA с помощью PKCS #1 v1.5, атака Водене на CBC гораздо более эффективна. [1] Обе атаки нацелены на широко используемые в то время криптосистемы: CBC — это исходный режим, используемый в Secure Sockets Layer (SSL) и продолжающий поддерживаться в TLS. [4]
Был предпринят ряд мер по смягчению последствий, чтобы предотвратить работу программного обеспечения для дешифрования в качестве оракула, но новые атаки, основанные на времени, неоднократно восстанавливали этот оракул. TLS 1.2 представляет ряд методов шифрования с аутентификацией и дополнительными режимами данных, которые не полагаются на CBC. [4]
Стандартная реализация дешифрования CBC в блочных шифрах заключается в расшифровке всех блоков зашифрованного текста, проверке заполнения, удалении заполнения PKCS7 и возврате открытого текста сообщения. Если сервер возвращает ошибку «недопустимое заполнение» вместо общей ошибки «не удалось расшифровать», злоумышленник может использовать сервер в качестве оракула заполнения для расшифровки (а иногда и шифрования) сообщений.
Математическая формула расшифровки CBC:
Как показано выше, расшифровка CBC выполняет XOR каждого блока открытого текста с предыдущим блоком. В результате однобайтовая модификация в блоке приведет к соответствующему изменению одного байта в .
Предположим, злоумышленник имеет два блока зашифрованного текста и хочет расшифровать второй блок, чтобы получить открытый текст . Злоумышленник меняет последний байт (создает ) и отправляет на сервер. Затем сервер сообщает, правильно ли заполнение последнего расшифрованного блока ( ) (действительное заполнение PKCS#7). Если заполнение правильное, злоумышленник теперь знает, что последний байт равен , последние два байта — 0x02, последние три байта — 0x03, … или последние восемь байтов — 0x08. Злоумышленник может изменить предпоследний байт (перевернуть любой бит), чтобы гарантировать, что последний байт равен 0x01. (В качестве альтернативы злоумышленник может перевернуть более ранние байты и выполнить двоичный поиск позиции для идентификации заполнения. Например, если изменение третьего с конца байта правильно, но изменение предпоследнего байта неверно, тогда известны два последних байта. быть 0x02, что позволяет расшифровать их оба.) Следовательно, последний байт равен . Если заполнение неверно, злоумышленник может изменить последний байт на следующее возможное значение. В лучшем случае злоумышленнику потребуется сделать 256 попыток найти последний байт , 255 попыток для каждого возможного байта (256 возможных, минус одна по принципу «котла» ), плюс одна дополнительная попытка устранить неоднозначное дополнение. [7]
Определив последний байт , злоумышленник может использовать ту же технику для получения предпоследнего байта . Злоумышленник устанавливает последний байт в значение . Затем злоумышленник использует тот же подход, описанный выше, на этот раз изменяя предпоследний байт до тех пор, пока заполнение не станет правильным (0x02, 0x02).
Если блок состоит из 128 бит ( например, AES ), что составляет 16 байт, злоумышленник получит открытый текст не более чем за 256⋅16 = 4096 попыток. Это значительно быстрее, чем попытки подбора 128-битного ключа.
CBC-R [8] превращает оракул дешифрования в оракул шифрования и в первую очередь демонстрируется против оракулов заполнения.
Используя атаку оракула заполнения, CBC-R может создать вектор инициализации и блок зашифрованного текста для любого открытого текста:
Чтобы сгенерировать зашифрованный текст длиной N блоков, злоумышленник должен выполнить N атак оракула заполнения. Эти атаки объединены в цепочку, так что правильный открытый текст создается в обратном порядке, от конца сообщения ( CN ) до начала сообщения ( C 0 , IV). На каждом этапе используется атака оракула заполнения для построения IV к предыдущему выбранному зашифрованному тексту.
Атака CBC-R не будет работать против схемы шифрования, которая аутентифицирует зашифрованный текст (с использованием кода аутентификации сообщения или аналогичного) перед расшифровкой.
Оригинальная атака на CBC была опубликована в 2002 году Сержем Водене . [3] Позднее были реализованы конкретные примеры атаки против SSL [9] и IPSec. [10] [11] Он также применялся к нескольким веб-фреймворкам , включая JavaServer Faces , Ruby on Rails [12] и ASP.NET [13] [14] [15] , а также к другому программному обеспечению, такому как игровой клиент Steam . . [16] В 2012 году было показано, что он эффективен против криптографических токенов PKCS 11 . [1]
Хотя эти более ранние атаки были исправлены большинством разработчиков TLS после его публичного объявления, новый вариант, атака Lucky Thirteen , опубликованная в 2013 году, использовала побочный канал синхронизации для повторного открытия уязвимости даже в ранее исправленных реализациях. По состоянию на начало 2014 года атака больше не считается угрозой в реальной эксплуатации, хотя теоретически она все еще работоспособна (см. Отношение сигнал/шум ) против определенного класса машин. По состоянию на 2015 год [обновлять]наиболее активной областью разработки атак на криптографические протоколы, используемые для защиты интернет-трафика, являются атаки с понижением версии , такие как атаки Logjam [17] и Export RSA/FREAK [18] , которые обманом заставляют клиентов использовать менее безопасные криптографические операции. предусмотрено для совместимости с устаревшими клиентами, когда доступны более безопасные. Атака под названием POODLE [19] (конец 2014 г.) сочетает в себе атаку понижения версии (до SSL 3.0) с атакой оракула с заполнением старого небезопасного протокола для компрометации передаваемых данных. В мае 2016 года в CVE - 2016-2107 было обнаружено , что исправление Lucky Thirteen в OpenSSL представило еще один оракул заполнения на основе времени. [20] [21]
Аналогичная модель атаки использовалась Блейхенбахером против PKCS#1 v1.5 [5] и Мангером против PKCS#1 v2.0 [13]. В этой статье показано, что подобные атаки возможны в мире симметричных ключей.