Разработчики OpenPGP.js выпустили исправление для критической уязвимости, которая могла использоваться для спуфинга. Баг позволял подделывать как подписанные, так и зашифрованные сообщения.
OpenPGP.js — это JavaScript-имплементация опенсорсной библиотеки шифрования электронной почты OpenPGP, которую можно использовать на любом устройстве. Разработчики проекта объясняют, что идея заключалась в том, чтобы реализовать всю необходимую функциональность OpenPGP в библиотеке JavaScript, которая могла бы повторно использоваться в других проектах для браузерных расширений или серверных приложений.
OpenPGP.js используется в таких проектах, как FlowCrypt, Mymail-Crypt, UDC, Encrypt.to, PGP Anywhere и Passbolt.
Недавно эксперты компании Codean Labs обнаружили, что OpenPGP.js подвержена критической уязвимости. Эта проблема позволяет злоумышленнику осуществить спуфинг проверки подписи с помощью специально созданного сообщения, передаваемого openpgp.verify или openpgp.decrypt. В результате они возвращают «успешный результат проверки подписи, хотя на самом деле возвращаемые данные не были подписаны».
«Чтобы подделать сообщение, злоумышленнику потребуется одна действительная подпись (встроенная или отдельная), а также данные, которые были подписаны, открытым текстом. После этого можно сгенерировать сообщение со встроенной подписью (inline-signed) или сообщение с подписью и шифрованием (signed-and-encrypted), содержащее любые данные. И сообщение будет выглядеть как легитимно подписанное в уязвимых версиях OpenPGP.js, — объясняют исследователи. — Иными словами, сообщение со встроенной подписью можно модифицировать таким образом, чтобы оно возвращало любые другие данные (при этом сообщая, что подпись действительна). То же возможно для сообщений с подписью и шифрованием, если злоумышленник сможет заполучить действительную подпись и зашифровать новое сообщение (с произвольным содержимым) вместе с этой подписью».
Уязвимость получила идентификатор CVE-2025-47934 (8,7 балла по шкале CVSS) и затрагивает OpenPGP.js версий 5 и 6. Версии 4.x не затронуты.
Разработчики устранили баг с выходом версий 5.11.3 и 6.1.1.
Дэниел Хьюгенс (Daniel Huigens), руководитель команды криптографов в Proton и главный мейнтейнер OpenPGP.js, сообщает, что пользователям следует как можно скорее установить обновления. А до этого рекомендуется внимательно изучать все якобы подписанные сообщения и проверять каждую подпись как отдельную.
Для подписанных и зашифрованных сообщений Хьюгенс предлагает проверять подлинность в два этапа. Сначала вызывать openpgp.decrypt без verificationKeys, а затем передавать возвращаемые подписи и расшифрованные данные в openpgp.verify для явной проверки.