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

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

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

Примечания:

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 22 апреля 2011

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

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

0 голосов
/ 26 апреля 2011

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

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

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

STACK_OF(SSL_COMP)* cm = SSL_COMP_get_compression_methods();
sk_SSL_COMP_zero(cm);
0 голосов
/ 23 апреля 2011

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

...