Перейти к основному содержимому

Шифрование и расшифровка сообщений

Второе назначение 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: храните их на защищенной машине и не пересылайте в открытом виде.

Зашифрованный ответ

  1. Импортируйте публичный ключ исследователя (из вложения или по fingerprint из отчета) и сверьте отпечаток.
  2. Зашифруйте ответ его ключом и подпишите своим:
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.
  • Расшифрованные материалы хранятся на защищенной машине, без пересылки в открытом виде.
  • Ответ зашифрован ключом исследователя и подписан своим ключом.