GnuPG. ВНИМАНИЕ! Обнаружена критическая уязвимость!


Как три часа назад сообщил ведущий разработчик Вернер Кох, схема электронной подписи GnuPG по Эльгамалю была полностью взломана! Причиной тому стал серьёзный баг в реализации криптографической схемы.

Данная угроза относится ТОЛЬКО к ЭЦП по схеме Эльгамала, но не к ЭЦП по алгоритму DSA или RSA и не к шифрованию по схеме Эльгамала или по алгоритму RSA. Угроза исключительно серьёзна и может привести к компрометации закрытого ключа.

Здесь[link1] находится официальное сообщение Вернера Коха, подписанное ключом заверения дистрибутивов GnuPG. Чуть позже приведу его перевод.

С уважением.


Комментарии
— SATtva (27/11/2003 18:38)   
КЛЮЧИ ПОДПИСАНИЯ ПО СХЕМЕ ЭЛЬГАМАЛЯ В
РЕАЛИЗАЦИИ GNUPG СКОМПРОМЕТИРОВАНЫ
============================
Описание:

Phong Nguyen обнаружил серьёзный баг в механизме генерации и использования ключей Эльгамаля для создания ЭЦП. Эта ошибка способна привести к компрометации практически всех ключей Эльгамаля, используемых для подписания. Учтите, это реальная уязвимость, благодаря которой можно за секунды взломать ваш закрытый ключ!

Пожалуйста, *примите немедленные меры по аннулированию своих ключей подписания по схеме Эльгамаля*. Более того, вы должны принять все возможные меры для ограничения ущерба и потерь в части информации, зашифрованной и подписанной данным ключом.

Пожалуйста, не отправляйте частных емэйлов в ответ на данное сообщение, поскольку у меня нет времени, чтобы ответить на все. Лучшее место для обсуждения текущей проблемы – это список рассылки gnupg-users@gnupg.org (первоначально подпишитесь на него, чтобы ваши сообщения не проходили модераторский контроль [2]).

Имейте в виду, что стандартные ключи, генерируемые GnuPG (подписание по алгоритму DSA и шифрование по схеме Эльгамаля), равно, как и ключи RSA, НЕ подвержены данной уязвимости. Также учтите, что ключи подписания Эльгамаля нельзя сгенерировать без использования специального свитча для разблокирования скрытых опций, а также без получения предупреждения о нестандартном типе этого ключа. За сведениями о том, как опознать уязвимые ключи, см. ниже.

Данное сообщение подписано с помощью обычного ключа заверения дистрибутивов GnuPG [1]. Я приножу извинения за этот серьёзный баг и за все вызванные им проблемы.


Предыстория:

По историческим причинам [3] GnuPG позволяет генерировать ключи Эльгамаля, предназначенные как для шифрования, так и для подписания. Возможно даже создать один ключ (базовый), способный выполнять обе операции. С криптографической точки зрения это не лучшая практика, однако поддерживаемая стандартом OpenPGP.

Не предполагалось, что эти ключи будут по-прежнему применяться для подписания, поскольку они имеют ряд недостатков: размер их ЭЦП намного больше в сравнении с DSA и RSA, генерация и сличение подписи проходят медленнее, кроме того, применение схемы Эльгамаля для подписания по некоторым криптологическим причинам всегда считалось проблематичным и труднореализуемым. Поэтому я всегда отговаривал людей от использования ключей Эльгамаля для подписания; тем не менее, они всё ещё применяются, и порядка 200 ключей ежегодно генерируется и загружается на общественные депозитарии.

В январе 2000 года в порядке обновления версии 1.0.2 код GnuPG был изменён, чтобы позволить генерацию более эффективных для шифрования ключей Эльгамаля (для них выбирался меньший секретный показатель степени x, а для зашифрования применялся меньший показатель k). Проведение этих изменений привело к непреднамеренному привнесению ошибки в схему подписания: малый показатель k, использовавшийся для зашифрования, применялся и для подписания. Подобная ошибка в реализации может быть использована для проведения криптографической атаки, направленной на получение закрытого ключа (т.е. секретнго показателя степени x), если взломщик располагает ЭЦП, сгенерированной данным ключом. Для базового ключа Эльгамаля такая ЭЦП всегда имеется, поскольку подпись этого ключа (автоподпись, self-signature) нужна, чтобы связать сертификаты (ID) пользователя и иной материал с данным базовым ключом. Поэтому ключ должен считаться скомпрометированным, даже если никогда не использовался для подписания документов.

Учтите, что эта уязвимость не относится к обычным ключам "только шифрование по схеме Эльгамаля" (тип 16 в спецификации OpenPGP [5]), поскольку GnuPG не позволяет генерировать подписи такими ключами. Уязвимости подвержены только ключи "шифрование+подписание по схеме Эльгамаля" (тип 20) и только в случае применения таких ключей в GnuPG 1.0.2 и выше.


Последствия:

Все ключи "шифрование+подписание по схеме Эльгамаля" (тип 20), сгенерированные в GnuPG 1.0.2 и выше, должны считаться скомпрометированными. Ключи, сгенерированные в более ранних версиях, по-видимому остались надёжными, но в идеале также должны быть ануллированы. Имейте в виду, что даже если ключ "шифрование+подписание по схеме Эльгамаля" был сгенерирован в ранней версии, использование этого ключа в GnuPG 1.0.2 и выше для изготовления подписей также его скомпрометирует.

Повторяю, ключи "только шифрование по схеме Эльгамаля" (тип 16) из любой версии GnuPG *не* подвержены уязвимости.


Решение:

=============================
Нужно различать два разных случая: базовый ключ Эльгамаля тип 20 и простые подключи Эльгамаля тип 20.

Первый случай требует незамедлительных действий. Вот он:



За таким ключом могут следовать дополнительные поля "uid", "sig" или "sub". Здесь мы видим ключ "шифрование+подписание по схеме Эльгамаля", наверняка сгенерированный в GnuPG 1.0.2 и выше. Заглавная "G" обозначает ключ типа 20. АННУЛИРУЙТЕ ЕГО НЕМЕДЛЕННО.

Второй случай связан с подключами. Вот пример:



Это мой обычный рабочий ключ, представляющий собой стандартный ключ GnuPG с добавленными со временем несколькими дополнительными подключами. Это хороший пример, поскольку один из подключей — второй — это ключ типа 20 "шифрование и подписание по Эльгамалю":



Заглавная буква "G" обозначает потенциально скомпрометированный подключ, тогда как первый подключ:



— это стандартный подключ "только шифрование" (тип 16), о чём говорит малая "g". Этот ключ не подвержен уязвимости.

Подключи, отмеченные большой "G" должны быть АННУЛИРОВАНЫ, за исключением случаев, когда вы абсолютно уверены, что эти подключи никогда не применялись для создания цифровой подписи с помощью GnuPG 1.0.2 и выше.


Как аннулировать ключ:
=======
Чтобы выпустить сертификат аннулирования для ключа в целом (базового и всех подключей), выполните:



Если вы не можете воспользоваться своей ключевой фразой, надеюсь, у вас имеется предварительно сгенерированный сертификат аннулирования (на флоппи-диске или распечатанный на листке бумаги), который можно использовать вместо приведённой выше команды.

Теперь этот сертификат аннулирования нужно нужно импортировать в GnuPG с помощью:



Теперь экспортируйте свой ключ в файл и распространите его по серверам-депозитариям:




Если ваш базовый ключ — не ключ Эльгамаля тип 20, вам следует аннулировать отдельные подключи. Ещё раз напоминаю, что требуют аннулирования только ключи Эльгамаля тип 20 (отмеченные заглавной буквой "G") — со стандартными ключами Эльгамаля "только шифрование" (малая "g") всё в полном порядке. Воспользуйтесь командой редактирования GnuPG:



Появится описание ключа. Командой "key порядковый_номер_подключа" выберите подключ, который хотите аннулировать, а затем введите команду "revkey" и следуйте указаниям. Сделав это, экспортируйте ключ, как описано выше.


Сколько ключей подвержено уязвимости?
=======================
Не могу ответить наверняка. По сведениям статистики общественных депозитариев, существует 848 уязвимых ключей подписания по Эльгамалю. Это около 0.04% всех базовых ключей на серверах. Кроме того, на серверах находится 324 уязвимых подключа.

Некоторые из этих подключей скорее всего никогда не использовались для подписания, поскольку вместо созданных подключей шифрования типа 20 для подписания мог применяться базовый ключ DSA. Тем не менее, такие ключи тоже стоит аннулировать.

Ещё раз обращаю внимание на то, что стандартная конфигурация GnuPG не допускает генерацию уязвимых ключей "шифрование+подписание по схеме Эльгамаля", а также на то, что ни DSA (тип 17), ни RSA (тип 1), ни ключи Эльгамаля "только шифрование" (тип 16) не уязвимы.


Благодарности:

Phong Nguyen [4] проанализировал реализацию криптографических элементов GnuPG и обнаружил эту уязвимость. Также он написал сам код для проведения подобной атаки и был дал мне достаточно времени на изучение своих материалов и для составления списка владельцев известных ключей типа 20.


Я действительно очень сожалению о случившемся,

Вернер


[1] Чтобы получить свежую копию ключа обратитесь на депозитарий или загрузите его с помощью "finger wk@g10code.com" либо "finger dd9jn@gnu.org". (ID 0x57548DCD, — SATtva)
[2] См. http://lists.gnupg.org/mailman/listinfo/gnupg-users.
[3] Патентный статус DSA был неясен, когда в 1997 я начал писать GnuPG.
[4] Работает в French National Center for Scientific Research и Ecole normale superieure: http://www.di.ens.fr/~pnguyen/.
[5] Diffie-Hellman, или DH, в терминологии PGP, — SATtva.

============= Перевод с английского: SATtva
— SATtva (27/11/2003 19:05)   
По сообщению Вернера, Дэвид Шоу написал патч для GnuPG 1.2.3, запрещающий создание подписей ключами Эльгамаля тип 20, а также саму возможность сгенерировать такие ключи.

Данное исправление войдёт в следующую версию GnuPG. Однако при желании можете самостоятельно внести изменения в исходный код программы.

Патч для GnuPG 1.2.3[link2]
Гость (13/12/2003 16:47)   
Извините за мою безграматность, но хотелось бы задать вопрос, могу ли все также безопасно использовать мой PGP 8.0 с DH/DSS ключами. Ведь в меню PGP Keys напротив иконки подписи стоит надпись "DSS exportable signature". А то я ничего не понимаю.
Гость (15/12/2003 14:10)   
AlexanderXX, можете. Проблема связана только с GnuPG и лишь с его реализацией схемы подписания по Эльгамалю. PGP использует этот алгоритм ТОЛЬКО для шифрования; для подписания в нём реализованы RSA и DSA.
Гость (15/12/2003 23:30)   
Огромное спасибо!!!!
Гость (09/03/2004 16:34)   
можно ли подделать открытый ключ pgp так, что б сообщение мог расшифровывать и я (настоящий владелец ключа) и злоумышленник.
— SATtva (09/03/2004 16:50)   
всполошеный, прошу впредь не писать сообщения офф-топик. Почитайте правила.

Касаемо вопроса, Вы имеете в виду злоумышленную модификацию материала ключа? Подобная проблема наблюдалась в версиях 6.х и была устранена в 6.5.8. Атака заключалась в несанкционированном включении в материал открытого ключа OpenPGP дополнительного ключа расшифрования (ADK) злоумышленника. Загляните в FAQ, технические вопросы, там всё изложено более подробно.

В новых версиях эта уязвимость ликвидирована.
Гость (13/12/2004 15:22)   
Здравствуйте!
1. При создании ключей в PGP предлагается создание ключей типов Diffe-Hellman/DSS, RSA и RSA Legacy. Какому нибудь из них соответсвует способ Эльгамаля?
2. Был взломан сам теоретический принцип способа Эльгамаля или это ошибка в написании программы, т.е. при практической реализации?
3. Я слышал, что взломана одна из систем криптозащиты используемая в Windows, это правда?
Спасибо.
— unknown (13/12/2004 16:36)   
2. Был взломан сам теоретический принцип способа Эльгамаля или это ошибка в написании программы, т.е. при практической реализации?

Ошибка в написании программы. Для метода Эль-Гамаля программисты много увлекались оптимизацией, а затем появилось много работ с вариантами атак на такие схемы. Так же как и в RSA многие практические реализации, которые корректно реализуют сам алгоритм, но не учитывают специфические его свойства при реальном применении и могут быть взломаны.

3. Я слышал, что взломана одна из систем криптозащиты используемая в Windows, это правда?

А что в этом может быть интересного? Кто-нибудь разве будет добровольно доверять криптозащитам от Майкрософта? Уязвимости в закрытых и несвободных программах особенного интереса не представляют.
— SATtva (13/12/2004 17:01)   
Ключи DH/DSS в PGP используют для шифрования схему Эльгамаля.

НО! Если Вы внимательно читали текст объявления Вернера Коха, то обратили внимание, что речь идёт о специфической реализации алгоритма Elgamal в GnuPG 1.0.2 и выше. Это ошибка в реализации, но не в самом алгоритме. Объясню более подробно.

Стандарт OpenPGP до последнего времени (до десятой редакции RFC2440bis включительно) предусматривал две спецификации для этого алгоритма: тип 16 (только шифрование по схеме Эльгамаля) и тип 20 (шифрование и подписание одним ключом по схеме Эльгамаля). Использование одного ключа Эльгамаля как для подписания, так и для шифрования всегда считалось нерекомендуемой практикой — нужно с особой осторожностью подбирать математический материал для ключа, иначе возникает риск, что из цифровой подписи можно будет восстановить закрытый ключ. Это не значит, что реализовать такую схему невозможно, это значит, что сделать это труднее, чем при реализации Elgamal только для шифрования.

Именно это и произошло в GnuPG 1.0.2. Во время планового обновления в программную реализацию алгоритма была случайно внесена ошибка, благодаря которой малый показатель k, применявшийся для шифрования, стал использоваться и для подписания. Это привело к риску компрометации ключей, использующих алгоритм Эльгамала для шифрования и подписания (тип 20), НО НЕ ключей типа 16+17, использующих два независимых ключа: Эльгамаль — ТОЛЬКО для шифрования и DSA — только для подписания.

Так вот... Ключи типа 20 изначально были экспериментом. Хотя такая спецификация и была закреплена в стандарте, она была реализована только в GnuPG, причём сгенерировать подобный ключ было нетривиальной задачей: необходимо было предварительно переключить программу в расширенный (экспертный) режим работы, а затем утвердительно ответить на предупреждение программы, что генерация такого ключа является нестандартной процедурой, т.е. можно допустить, что пользователь, идущий на это, знает, что делает, и берёт на себя весь риск.

Ключи типа 20 никогда не были реализованы в PGP. PGP всегда поддерживал только две спецификации ключей: тип 1 — RSAv3, он же RSA Legacy (подписание и шифрование одним ключом RSA), RSAv4, он же просто RSA (подписание и шифрование независимыми ключами RSA), а также тип 16+17, названный в PGP по определённым историческим причинам Diffie-Hellman/DSS (шифрование по Эльгамалю и подписание по DSA). НИ ОДНА ИЗ ЭТИХ РЕАЛИЗАЦИЙ НЕ ПОДВЕРЖЕНА СПЕЦИФИЧЕСКОЙ УЯЗВИМОСТИ GNUPG!

Буквально через месяц после этого объявления вышел новый релиз GnuPG (кажется, это был 1.2.5), запрещающий генерацию ключей типа 20. А около двух месяцев назад была опубликована 11-ая редакция стандарта OpenPGP, из которой спецификации асимметричных ключей типа 20 (подписание+шифрование по Эльгамалю) были полностью исключены, дабы подобные ошибки не повторялись в дальнейшем.

Касаемо Вашего последнего вопроса, он трубует уточнения. Криптография используется слишком широко и в слишком большом числе приложений, чтобы ответить на этот вопрос однозначно: правда это или нет. Речь идёт о ядре Win32 или об одном из майкрософтовских приложений? Ну, например, протокол PPTP, реализованный в Microsoft VPN-клиенте, действительно признан ненадёжным...
Гость (15/12/2004 07:54)   
Здравствуйте!
Уточню по поводу своего вопроса о взломанной системе. Это протокол Kerberos в Windows 2000. Это протокол проверки подлинности пользователя в сети Windows 2000 server. Правда я точно не знаю, взломана эта система или нет. Просто слышал такое. К PGP как я понимаю это отношения не имеет.
— unknown (15/12/2004 08:54)   
Это протокол Kerberos в Windows 2000. Это протокол проверки подлинности пользователя в сети Windows 2000 server. Правда я точно не знаю, взломана эта система или нет.

Действительно не имеет это отношение к PGP. Уже совсем оффтопик какой-то.
Я этим вопросом не интересовался, знаю только, что специалисты с самого начала критически отзывались об этой реализации протокола.
Потому что Kerberos у них какой-то совсем нестандартный и несовместимый без особых на то оснований.
Гость (20/03/2014 07:36)   

Ужас какой. Алгоритм реализован корректно, но может быть взломан — как это? Речь об упрощённом математическом описании или алгоритме, описанном в стандарте? О чём речь? О паддинге, о тайминг-атаках,* о малой экспоненте,** о запрете подписывать переданные другой стороной данные без RSA-OAEP и т.п.?


*Особенно в серверном окружении, а также при утечке информации о ключе через кэш при атаке локальным приложением. Сюда же относится модуляция питанием, которую можно замерить через счётчики производительности процессора. Вроде как есть чисто математические методы для разрушения связи между ключом и таймингами.
**Экспонента должна быть 65537. Экспоненты 5 и особенно 3 небезопасны.
— sentaus (20/03/2014 08:47)   
Археологи, ау!
— SATtva (20/03/2014 09:58)   
Мда...

Алгоритм реализован корректно, но может быть взломан — как это?

Элементарно, если некорректно реализован или отсутствует паддинг, используется малая экспонента и т.д. — то, что Вы же и перечислили.
— unknown (20/03/2014 10:14, исправлен 20/03/2014 10:18)   

Мда...?


Ну т.е. надо различать «голый алгоритм» и всякие обёртки, условия реализации; что можно, а что нельзя подавать на вход и т.д.

— SATtva (20/03/2014 10:48)   
Алгоритм реализован корректно

Элементарно, если некорректно реализован

Мда...?

unknown, вырываете цитаты из контекста? ;)
— unknown (20/03/2014 11:03)   

Мда! ;) Для сравнительного примера.


Потому что:
Это не только вырывание из контекста, но ещё и его искажение.

Возможно, в исходном утверждении что-то было не совсем чётко сформулировано, но доведение до абсурда — это как форма риторического вопроса с целью прояснения или попытки исправить.
Гость (20/03/2014 15:31)   
/comment2785[link3]:
корректно реализуют сам алгоритм, но не учитывают специфические его свойства

Гумманитарный оксюморон это потому что. Под словом «алгоритм» можно понимать и полный стандарт и упрощённую его версию. Логично под алгоритмом понимать реализацию официального стандарта, тогда «взломан» он быть не может (во всяком случае, таким примитивным образом).
— unknown (20/03/2014 16:00)   

Ну да. Алгоритм м.б. демонстрационным и не предназначенным для прямой реализации. Например, алгоритм RSA можно взять из учебника для студентов, где он явно упрощён по сравнению со стандартом.


Тогда уже надо явно указывать. Алгоритм RSA — это понятно всем, кто в теме. Это то, что Райвист, Шамир и Адлеман написали в своей работе. А стандарты могут быть разные. Первые стандарты, кстати, были кривые.

А когда-то стандартов вообще не было, а алгоритм RSA[link4] был широко известен в криптографической литературе.

Работа была выполнена в конце семидесятых, когда шифрование открытым ключом RSA было относительно новым. По этой причине работа может удивить сегодняшних читателей использованием сырого RSA, прямым применением возведения в степень по модулю для зашифрования и расшифрования без использования специальной схемы рэндомизации. Случайные параметры добавлялись к открытому тексту до шифрования в целях создания двух различных шифртекстов на выходе при двух различных шифрованиях.


Математическая структура RSA может быть предметом активных атак, которые вызывают утечку достаточного количества информации в процессе расшифрования для нахождения связей шифртекстов с соответствующими открытыми текстами. Кроме того возможны атаки маркировки, поскольку шифрованные блоки при использовании RSA независимы друг от друга и они будут дублироваться или просто заменяться известными шифртекстами. Исходящее сообщение тогда должно содержать два блока одинакового открытого текста или соответственно блок известого открытого текста. Опять же, использование RSA в контексте гибридных криптосистем, в которых ключи зашифованы операциями шифрования с открытым ключом, а само сообщение симметричным шифром не было в достаточной мере изучено в то время.


«Сырой», кривореализованный и небезопасный RSA — это полноценный алгоритм в теоретическом смысле.

Ссылки
[link1] http://www.pgpru.com/articles/gnupg_elgamal.txt

[link2] http://www.pgpru.com/articles/gnupg_elgamal_patch.txt

[link3] https://www.pgpru.com/comment2785

[link4] https://www.pgpru.com/biblioteka/statji/sac/31originaljnyemiksychauma