gcc heartbleed.c -o heartbleed -lssl -lssl3 -lcrypto
Это выглядит хорошо. -lssl
- это подпрограммы OpenSSL SSL/TLS. -lcrypto
- это криптографические процедуры OpenSSL.
Но я не уверен насчет -lssl3
. Что это за библиотека?
heartbleed.c:(. text+0x47d): неопределенная ссылка на `SSL_CTX_SRP_CTX_init '
Похоже, что ваша версия OpenSSL не поддерживает пароль безопасного удаленного доступа (SRP) Томаса Ву. Или он был скомпилирован без поддержки.
Согласно OpenSSL CHANGELOG, SRP был добавлен в OpenSSL 1.0.1:
*) Add SRP support.
[Tom Wu <tjw@cs.stanford.edu> and Ben Laurie]
Вы можете проверить, была ли библиотека OpenSSL построена без SRP, с помощью следующего.
Сначала найдите библиотеку OpenSSL SSL/TLS:
$ find /usr/ -iname libssl.*
/usr/lib/libssl.0.9.7.dylib
/usr/lib/libssl.0.9.8.dylib
/usr/lib/libssl.dylib
/usr/local/ssl/android-14/lib/libssl.a
/usr/local/ssl/android-14/lib/libssl.so
/usr/local/ssl/android-14/lib/libssl.so.1.0.0
/usr/local/ssl/android-18/lib/libssl.a
/usr/local/ssl/android-18/lib/libssl.so
/usr/local/ssl/android-18/lib/libssl.so.1.0.0
...
Во-вторых, посмотрите, экспортируется ли символ:
$ nm /usr/lib/libssl.0.9.7.dylib | grep SSL_CTX_SRP_CTX_init
$
В моем случае, SRP не доступен , так как библиотека Apple , по умолчанию так вниз уровня (версия 0.9.7).
У меня есть еще одна копия библиотеки (версия 1.0.1i):
$ nm /usr/local/ssl/macosx-x64/lib/libssl.dylib | grep SSL_CTX_SRP_CTX_init
0000000000034920 T _SSL_CTX_SRP_CTX_init
Моя версия 1.0.1i имеет рутину.
Иногда вы можете построить без SRP. Чтобы проверить, был ли OpenSSL настроен без SRP:
$ cat /usr/local/ssl/macosx-x64/include/openssl/opensslconf.h | grep -A 1 SRP
$
В случае выше, я настроил для SRP.
Вот как это выглядит, когда OpenSSL настроен без функции (я настраиваю без SSLv2):
$ cat /usr//local/ssl/macosx-x64/include/openssl/opensslconf.h | grep -A 1 SSL2
#ifndef OPENSSL_NO_SSL2
# define OPENSSL_NO_SSL2
#endif
--
# if defined(OPENSSL_NO_SSL2) && !defined(NO_SSL2)
# define NO_SSL2
# endif
SSL_CTX_SRP_CTX_init
используется в двух местах. Чтобы это исправить, просто закомментируйте это.
Сначала строка 355:
/* SSL_CTX_SRP_CTX_init(c->sslContext); */
Во-вторых, строка 499:
/* SSL_CTX_SRP_CTX_init(c->sslContext); */
В связи с этим, авторы эксплойта, вероятно, могли бы следить за номером версии OpenSSL. Библиотека предоставляет OPENSSL_VERSION_NUMBER(3) только для такого рода вещей. Что-то вроде:
#if (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRP)
SSL_CTX_SRP_CTX_init(c->sslContext);
#endif