Почему OpenSSL может хранить полученные / записанные данные в памяти?

Я пытаюсь убедиться, что конфиденциальные данные (пароли,...) не хранятся в виде открытого текста в памяти процесса, и я обнаружил, что все данные, отправленные или полученные из OpenSSL, хранятся в памяти...

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

Заметки:

  • Это только в случае использования SSLv3 или TLSv1. При использовании SSLv2 данные не сохраняются в памяти.
  • Я использую версию 0.9.8k-7ubuntu8.6 от Ubuntu Lucid. Если это связано с исправлением безопасности, я думаю, что это актуально.

Воспроизведение легко:

  • Используйте 'openssl client -tls1 -connect hostname:443подключиться к серверу SSL
  • Отправить данные в TLS-соединении
  • Принудительная генерация файла ядра (kill -SEGV например)
  • Проверьте основной файл, полученные и отправленные данные будут присутствовать

Есть ли причина, по которой OpenSSL может понадобиться сохранить эти данные? Есть ли возможность изменить его поведение?

3 ответа

Решение

Примечание: я отвечаю на свой вопрос после того, как нашел объяснение, которое искал.

Данные хранятся в буферах zlib, если в соединении включено сжатие. Вот почему это не наблюдается с некоторой конфигурацией / сервером. Zlib, безусловно, требует правильного сжатия потока.

Если вам не нужно сжатие и вы не хотите, чтобы незашифрованные данные долгое время оставались в памяти процесса, вы можете отключить сжатие OpenSSL.

STACK_OF(SSL_COMP)* cm = SSL_COMP_get_compression_methods();
sk_SSL_COMP_zero(cm);

Это все еще в памяти, потому что вы никогда специально не перезаписывали содержимое памяти. Нет веских причин для этого делать это автоматически (все остальные будут жаловаться, что он использует ненужные циклы).

Вы должны стереть содержимое памяти самостоятельно. Эта функциональность не предоставляется через программу командной строки.

Инструмент командной строки "клиент" предназначен только для тестирования. Он не предназначен для обеспечения реальной безопасности или пригодности для реального использования. Он имеет ряд функций, которые делают его очень непригодным для любого другого использования, например, вы не можете отправить 'R', поскольку это вызывает повторное согласование.

Другие вопросы по тегам