diff options
author | Matthew Jordan <mjordan@digium.com> | 2014-10-20 14:20:15 +0000 |
---|---|---|
committer | Matthew Jordan <mjordan@digium.com> | 2014-10-20 14:20:15 +0000 |
commit | dad0334cf1b907252dbd6a7ab54e66292983c889 (patch) | |
tree | c113c0e0d37a2e63062c6c8e2acf92d2f49f17aa /main/tcptls.c | |
parent | 5e10e369b182c7c05a9d802fe1ead92b21dc2839 (diff) |
AST-2014-011: Fix POODLE security issues
There are two aspects to the vulnerability:
(1) res_jabber/res_xmpp use SSLv3 only. This patch updates the module to use
TLSv1+. At this time, it does not refactor res_jabber/res_xmpp to use the
TCP/TLS core, which should be done as an improvement at a latter date.
(2) The TCP/TLS core, when tlsclientmethod/sslclientmethod is left unspecified,
will default to the OpenSSL SSLv23_method. This method allows for all
ecnryption methods, including SSLv2/SSLv3. A MITM can exploit this by
forcing a fallback to SSLv3, which leaves the server vulnerable to POODLE.
This patch adds WARNINGS if a user uses SSLv2/SSLv3 in their configuration,
and explicitly disables SSLv2/SSLv3 if using SSLv23_method.
For TLS clients, Asterisk will default to TLSv1+ and WARN if SSLv2 or SSLv3 is
explicitly chosen. For TLS servers, Asterisk will no longer support SSLv2 or
SSLv3.
Much thanks to abelbeck for reporting the vulnerability and providing a patch
for the res_jabber/res_xmpp modules.
Review: https://reviewboard.asterisk.org/r/4096/
ASTERISK-24425 #close
Reported by: abelbeck
Tested by: abelbeck, opsmonitor, gtjoseph
patches:
asterisk-1.8-jabber-tls.patch uploaded by abelbeck (License 5903)
asterisk-11-jabber-xmpp-tls.patch uploaded by abelbeck (License 5903)
AST-2014-011-1.8.diff uploaded by mjordan (License 6283)
AST-2014-011-11.diff uploaded by mjordan (License 6283)
........
Merged revisions 425987 from http://svn.asterisk.org/svn/asterisk/branches/12
........
Merged revisions 425991 from http://svn.asterisk.org/svn/asterisk/branches/13
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@426003 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/tcptls.c')
-rw-r--r-- | main/tcptls.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/main/tcptls.c b/main/tcptls.c index fd6d5016e..1930d61cf 100644 --- a/main/tcptls.c +++ b/main/tcptls.c @@ -747,6 +747,8 @@ static int __ssl_setup(struct ast_tls_config *cfg, int client) cfg->enabled = 0; return 0; #else + int disable_ssl = 0; + if (!cfg->enabled) { return 0; } @@ -762,22 +764,21 @@ static int __ssl_setup(struct ast_tls_config *cfg, int client) if (client) { #ifndef OPENSSL_NO_SSL2 if (ast_test_flag(&cfg->flags, AST_SSL_SSLV2_CLIENT)) { + ast_log(LOG_WARNING, "Usage of SSLv2 is discouraged due to known vulnerabilities. Please use 'tlsv1' or leave the TLS method unspecified!\n"); cfg->ssl_ctx = SSL_CTX_new(SSLv2_client_method()); } else #endif if (ast_test_flag(&cfg->flags, AST_SSL_SSLV3_CLIENT)) { + ast_log(LOG_WARNING, "Usage of SSLv3 is discouraged due to known vulnerabilities. Please use 'tlsv1' or leave the TLS method unspecified!\n"); cfg->ssl_ctx = SSL_CTX_new(SSLv3_client_method()); } else if (ast_test_flag(&cfg->flags, AST_SSL_TLSV1_CLIENT)) { cfg->ssl_ctx = SSL_CTX_new(TLSv1_client_method()); } else { - /* SSLv23_client_method() sends SSLv2, this was the original - * default for ssl clients before the option was given to - * pick what protocol a client should use. In order not - * to break expected behavior it remains the default. */ + disable_ssl = 1; cfg->ssl_ctx = SSL_CTX_new(SSLv23_client_method()); } } else { - /* SSLv23_server_method() supports TLSv1, SSLv2, and SSLv3 inbound connections. */ + disable_ssl = 1; cfg->ssl_ctx = SSL_CTX_new(SSLv23_server_method()); } @@ -787,6 +788,17 @@ static int __ssl_setup(struct ast_tls_config *cfg, int client) return 0; } + /* Due to the POODLE vulnerability, completely disable + * SSLv2 and SSLv3 if we are not explicitly told to use + * them. SSLv23_*_method supports TLSv1+. + */ + if (disable_ssl) { + long ssl_opts; + + ssl_opts = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3; + SSL_CTX_set_options(cfg->ssl_ctx, ssl_opts); + } + SSL_CTX_set_verify(cfg->ssl_ctx, ast_test_flag(&cfg->flags, AST_SSL_VERIFY_CLIENT) ? SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT : SSL_VERIFY_NONE, NULL); |