Если оно это знает, это не значит, что оно это умеет

Sep 24, 2019 10:29

Наткнулся на забавную багу в 12 постгресе - несмотря на то, что в документации написано, что минимальная поддерживаемая версия OpenSSL 0.9.8, он не компилируется с 0.9.8j из дистрибутива SLES 11sp4.

По очень забавной причине:

В OpenSSL 0.9.8j максимальная поддерживаемая версия TLS - 1.0. Тем не менее, константы
TLS1_1_VERSION и TLS1_2_VERSION определены. Типа, мы знаем что такие версии TLS бывают.
Константы там не просто так, а соответстуют магическим числам в заголвоке пакетов, так что вполне оправданное решение.

И есть константа TLS_MAX_VERSION, которая честно определена как TLS1_0_VERSION.

В коде рядом с определением констант честно написано:

#define TLS1_VERSION 0x0301
#define TLS1_1_VERSION 0x0302
#define TLS1_2_VERSION 0x0303
/* TLS 1.1 and 1.2 are not supported by this version of OpenSSL, so
* TLS_MAX_VERSION indicates TLS 1.0 regardless of the above
* definitions. (s23_clnt.c and s23_srvr.c have an OPENSSL_assert()
* check that would catch the error if TLS_MAX_VERSION was too low.)
*/
#define TLS_MAX_VERSION TLS1_VERSION

К сожалению, в более поздних версиях openssl ничего похожего на этот комментарий нет и TLS_MAX_VERSION везде соответствует последнией из определенных констант TLS1_x_VERSION.
Поэтому тот, кто писал этот код в постгресе, ничтоже сумняшеся воспользовался

#ifdef TLS1_1_VERSION

для проверки того, что соответствующая версия TLS поддерижваеться.

В pgsql-hackers я написал. Напистаь теперь что-ли в openssl-devel со словами
"Добавьте в tls1.h комментарий вида:
Never assume, that if TLSx_x_VERSION defined, it means that this TLS version is supported.
Always check against TLS_MAX_VERSION, for there were some version in past, where
TLS1 was highest supported version, but TLS1_2_VERSION defined, and there might
be versions in future which know magic number of some newer TLS version, but don't really
support it".

This entry was originally posted at https://vitus-wagner.dreamwidth.org/2105275.html. Please comment there using OpenID. Now there are
comments

криптография, postgresql, open source

Previous post Next post
Up