Шифрование и расшифровка сообщений
Второе назначение GPG-ключа (подключ [E]) — шифрование. В проекте оно используется в процессе работы с сообщениями об уязвимостях: по VDP любой отчет об уязвимости передается только в зашифрованном виде, а вся дальнейшая переписка до согласованного раскрытия также шифруется.
Как это работает: сообщение шифруется публичным ключом получателя, а расшифровать его может только владелец соответствующего приватного ключа. Дополнительно отправитель может подписать сообщение своим ключом — тогда получатель убедится и в авторстве.
1. Шифрование отчета (сторона отправителя)
Шаг 1. Получите и сверьте ключ получателя
Для отчетов об уязвимостях получатель — Lead Maintainer of Netgap (andrey@ganyushkin.ru, key ID 556B41333653BD5A). Способы получения ключа и обязательная сверка отпечатка описаны в статье Где взять ключ участника; канонические значения отпечатка — в разделе 5 VDP.
gpg --locate-keys andrey@ganyushkin.ru
gpg --fingerprint 556B41333653BD5A
Шаг 2. Зашифруйте текст отчета
# Текстовый отчет: ASCII-armored результат удобно вставить в тело письма
gpg --encrypt --armor --recipient 556B41333653BD5A report.txt
# Результат: report.txt.asc
--recipient(-r) — чьим публичным ключом шифровать; можно указать key ID или email;--armor(-a) — текстовый формат (-----BEGIN PGP MESSAGE-----) вместо бинарного.
Шаг 3. Зашифруйте и подпишите вложения
Бинарные вложения (PoC, логи, дампы) шифруются без --armor — получаются файлы *.gpg:
# Зашифровать и одновременно подписать своим ключом
gpg --encrypt --sign --recipient 556B41333653BD5A poc.tar.gz
# Результат: poc.tar.gz.gpg
--sign добавляет вашу подпись внутрь зашифрованного контейнера — получатель после расшифровки увидит, кем создан файл, и сможет отвечать именно вам.
Шифрование сразу нескольким получателям
Флаг --recipient можно повторять: gpg -e -r KEYID1 -r KEYID2 file. Полезно, если переписку ведут несколько участников — каждый сможет расшифровать сообщение своим ключом. Добавьте и свой key ID, иначе вы не сможете прочитать собственное отправленное сообщение.
Шаг 4. Отправьте письмо
Требования из раздела 4 VDP: тема с префиксом [Netgap][Security] без деталей уязвимости, зашифрованное тело/вложения, и по возможности — ваш публичный ключ (или fingerprint), чтобы ответ тоже был зашифрован.
2. Расшифровка и ответ (сторона PSIRT / получателя)
Расшифровка
# Расшифровать текст (запросит passphrase вашего приватного ключа)
gpg --decrypt report.txt.asc > report.txt
# Расшифровать вложение
gpg --decrypt --output poc.tar.gz poc.tar.gz.gpg
Если сообщение было подписано отправителем, gpg --decrypt сразу покажет статус подписи:
gpg: Good signature from "Researcher Name <researcher@example.com>"
Статус Can't check signature: No public key означает, что ключ отправителя еще не импортирован — импортируйте приложенный к письму ключ (gpg --import researcher.asc) и повторите расшифровку, затем сверьте fingerprint из письма.
Расшифрованные материалы отчета — конфиденциальные данные процесса CVD: храните их на защищенной машине и не пересылайте в открытом виде.
Зашифрованный ответ
- Импортируйте публичный ключ исследователя (из вложения или по fingerprint из отчета) и сверьте отпечаток.
- Зашифруйте ответ его ключом и подпишите своим:
gpg --encrypt --sign --armor --recipient researcher@example.com reply.txt
3. Полезные приемы
# Посмотреть, кому адресовано зашифрованное сообщение (не расшифровывая)
gpg --list-packets report.txt.asc | grep -i "pubkey enc"
# Проверить отсоединенную подпись файла (например, релизного .sha256.asc)
gpg --verify file.sha256.asc file.sha256
# Симметричное шифрование паролем — для случаев, когда у второй стороны
# еще нет ключа (пароль передается по независимому каналу)
gpg --symmetric --cipher-algo AES256 big-dump.bin
Симметричное шифрование (--symmetric) — запасной вариант: основной процесс VDP всегда использует шифрование публичным ключом.
Чеклист: отправка зашифрованного отчета об уязвимости
- Ключ Lead Maintainer получен (WKD или
https://netgap.io/gpg.asc). - Отпечаток сверен со значением из VDP, раздел 5.
- Тело отчета зашифровано:
gpg --encrypt --armor --recipient 556B41333653BD5A. - Вложения зашифрованы (и желательно подписаны):
gpg --encrypt --sign. - Тема письма —
[Netgap][Security] <суть без деталей>, деталей уязвимости в открытом виде нет нигде. - Приложен ваш публичный ключ или fingerprint для зашифрованного ответа.
Чеклист: обработка входящего отчета (PSIRT)
- Письмо расшифровано своим приватным ключом (
gpg --decrypt). - Ключ отправителя импортирован, отпечаток сверен с указанным в отчете.
- Подпись отправителя проверена (если есть):
Good signature. - Расшифрованные материалы хранятся на защищенной машине, без пересылки в открытом виде.
- Ответ зашифрован ключом исследователя и подписан своим ключом.