Часть GNU Project, известная под названиями GPG и GnuPG – это свободная имплементация стандарта OpenPGP, который используется для шифрования данных и создания электронных подписей.
В этом месяце было представлено обновление GnuPG до версии 2.2.8, исправляющее уязвимость SigSpoof, которой был присвоен идентификатор CVE-2018-12020. Проблема была обнаружена ИБ-специалистом Маркусом Бринкманном (Marcus Brinkmann) и представляет опасность для GnuPG, Enigmail, GPGTools и python-gnupg.
«Верификация электронных подписей в Enigmail 2.0.6.1, GPGTools 2018.2 и python-gnupg 0.4.2 осуществляется путем парсинга данных, полученных от GnuPG 2.2.6, с опцией
--status-fd 2
. Это позволяет удаленному атакующему подделать произвольную подпись через встроенный параметр filename в пакетах литеральных данных OpenPGP. Для этого в конфигурационном файле gpg.conf у пользователя должна быть включена опция verbose», — пишет исследователь в отчете, к которому были приложены proof-of-concept эксплоиты для Enigmail и GPGTools.
Разработчики поясняют, что программы парсят статусные сообщения, чтобы получить от GPG информацию о действительности подписей. Статусные сообщения создаются с опцией --status-fd N
, где N – это дескриптор файла. В случае если N – это 2, статусные сообщения делят канал выхода stderr с обычными диагностическими сообщениями.
Проблема состоит в том, что OpenPGP позволяет включать имя оригинального input-файла в подписанные или зашифрованные сообщения. GnuPG во время расшифровки и верификации может отображать уведомление, содержащее имя данного файла, однако очистка имени файла производится некорректно, и в итоге атакующий имеет возможность включить в него управляющие символы. В результате статусное сообщение может быть подделано, равно как и статус верификации произвольной подписи. Единственное условие: длина статусного сообщения не должна превышать 255 символов.
«Атакующий может внедрить произвольное (фальшивое) статусное сообщение GnuPG в парсер приложения, подделав верификацию подписи и результат расшифровки сообщения. Атакующий может контролировать спецификации алгоритма, время создания, User ID и так далее, и все это без публичных или приватных ключей», — рассказывает Бринкманн.
Специалист рекомендует пользователям убедиться, что verbose в файле gpg.conf выключен, а также советует избегать использования gpg --verbose
в командной строке. Разработчикам Бринкманн порекомендовал всегда использовать --no-verbose
при вызове gpg.