Баг в ADK


В августе 2000 года Ральф Сендерек, немецкий исследователь, выявил баг, связанный с дополнительными ключами расшифрования[link1]. Сендерек выступал против этой функции, и доказал свою правоту, поставив несколько экспериментов над ключами. Он добавил субпакет ADK к пакету открытого ключа, но вне защищённой подписью области: одни субпакеты должны быть заверены владельцем ключа, другие — нет. Спецификация OpenPGP требует, чтобы ключи ADK помещались в блок хэшируемых субпакетов, но Сендерек решил проверить, примет ли их PGP, если они размещены в незащищённом блоке.

Он обнаружил, что PGP не возражает на появление ADK в этом блоке, хотя сама программа, в соответствии с OpenPGP, никогда их туда не помещает. Таким образом, это ошибка в конкретной реализации, но не в стандарте OpenPGP. Злоумышленнику достаточно раздобыть открытый ключ жертвы, прикрепить собственный ключ в качестве ADK, а затем распространить его так широко, насколько возможно. Люди, пользующиеся этим ключом, будут, как правило (что считается этичным, поскольку, с их точки зрения, жертва сама об этом просила), шифровать свои сообщения одновременно и для получателя, и для ADK, так что владелец последнего тоже сможет их прочитать. Уязвимость присутствует в версиях с 5.5.x по 6.5.3. Она была устранена в PGP 6.5.8.

Описать эту ошибку можно двояко: как ошибку проектирования, поскольку, по-видимому, разработчики PGP недосмотрели такую необычную атаку, или как опечатку, поскольку единственное, что нужно для исправления, — это добавить одно условие if. Соответствующий участок кода можно найти в функции ringKeyAdditionalRecipientRequestKey в файле pgpsrc\libs\pgpcdk\priv\keys\keys\pgpRngPub.c. В этом файле можно обнаружить следующую конструкцию:



Существенная переменная здесь — это hashed. Функция ringKeyFindSubpacket присвоит ей значение true, если обнаружит ADK в той части ключа, которая покрыта цифровой подписью. В версии 6.5.1 переменная игнорировалась:



Кроме приведённого исправления всё ПО PGP, включая программу сервера ключей, было изменено, чтобы автоматически удалять любые злонамеренные пакеты ADK. Это крайне затрудняет проведение ADK-атаки, поскольку добавленный пакет ADK не будет распространяться сервером ключей 1 или пользователями с новыми версиями PGP.

Ральф Сендерек разместил своё уведомление [19][link2] вместе с ответом Циммермана на собственном веб-сайте. Оба сообщения заслуживают внимания. Сендерек имеет ряд довольно радикальных идей относительно PGP: по его мнению, версии 2.6.x были лучшими версиями PGP, а новые версии слишком сложны, чтобы быть безопасными. Также он утверждает, что невозможно выполнить анализ исходного кода программы такого объёма, и что ADK — плохая идея. Вместо аудита исходного кода он предлагает экспериментальный подход, подобный тому, что применяется в физике.

Никто не смог обнаружить в свободном распространении ни одного злонамеренного пакета ADK. Можно было бы организовать похожую атаку, но с меньшим ущербом, добавив в нехэшируемый блок сертификат аннулирования. Это бы привело к атаке на отказ в обслуживании (DoS). Проводя такую атаку противник ничего не приобретает, зато пользователь теряет очень много. Если б не выявление бага в ADK, кто-нибудь мог бы начать аннулировать ключи, что привело бы к серьёзному замешательству. Эксперименты, поставленные Мартийном Стамом, свидетельствуют, что такое более невозможно. 2

Назад[link3] | Дальше[link4]


1 Имея в виду только фирменный сервер PGP Keyserver, — прим. пер.

2 По данным частной переписки. Результаты не были опубликованы.

Ссылки
[link1] https://www.pgpru.com/biblioteka/statji/analiznadezhnostipgp/istorija/normaljnajaprogramma#p2

[link2] https://www.pgpru.com/biblioteka/statji/analiznadezhnostipgp/bibliografija#b19

[link3] https://www.pgpru.com/biblioteka/statji/analiznadezhnostipgp/bagiataki/kljuchevoeraspisanie

[link4] https://www.pgpru.com/biblioteka/statji/analiznadezhnostipgp/bagiataki/cheshskajaataka