Here's a quick demonstration of what I'm talking about with net/prosody, using
testssl.sh[1]:
$ testssl.sh -t xmpp -R example.com:5222
[ snip... ]
Testing for Renegotiation vulnerabilities
Secure Renegotiation (RFC 5746) supported (OK)
Secure Client-Initiated Renegotiation VULNERABLE (NOT ok), potential DoS
threat
I've found this issue in two ports so far (net/prosody, telephony/coturn) and
suspect it may be in others due to the nature of the problem, which I'll get
into more in a moment. Upstream for net/prosody patched it May 12th of 2021[2],
so I was led to believe that it might be a local problem.
net/prosody relies on security/luasec to deal with TLS. In certmanager.lua[3],
it's
clear that it means to disable renegotiation based on these two lines in the
source (in different sections).
no_renegotiation = test_option("no_renegotiation");
no_renegotiation = luasec_has.options.no_renegotiation;
However, the problem is that security/luasec expects the option to be named
SSL_OP_NO_RENEGOTIATION and it's actually named SSL_OP_NO_CLIENT_RENEGOTIATION
in the OpenBSD source tree. This is shown in options.c[4] and in
lib/libssl/ssl.h[5].
#if defined(SSL_OP_NO_RENEGOTIATION)
{"no_renegotiation", SSL_OP_NO_RENEGOTIATION},
#endif
/* Disallow client initiated renegotiation. */
#define SSL_OP_NO_CLIENT_RENEGOTIATION 0x00020000L
Though, in the case of security/luasec, there's a promising comment in options.c
that says:
/* If you need to generate these options again, see options.lua */
As I said before, I'm making an educated guess that some other ports may have
this issue as well. In fact, even the OpenBSD source tree has some mentions of
SSL_OP_NO_RENEGOTIATION in unbound and nsd sections (I'm using textproc/ripgrep
from ports to search here).
$ rg 'SSL_OP_NO_RENEGOTIATION'
usr.sbin/unbound/smallapp/unbound-control.c
541:#if defined(SSL_OP_NO_RENEGOTIATION)
543: if((SSL_CTX_set_options(ctx, SSL_OP_NO_RENEGOTIATION) &
544: SSL_OP_NO_RENEGOTIATION) != SSL_OP_NO_RENEGOTIATION)
545: ssl_err("could not set SSL_OP_NO_RENEGOTIATION");
usr.sbin/unbound/util/net_help.c
992:#if defined(SSL_OP_NO_RENEGOTIATION)
994: if((SSL_CTX_set_options(ctx, SSL_OP_NO_RENEGOTIATION) &
995: SSL_OP_NO_RENEGOTIATION) != SSL_OP_NO_RENEGOTIATION) {
996: log_crypto_err("could not set SSL_OP_NO_RENEGOTIATION");
1228:#if defined(SSL_OP_NO_RENEGOTIATION)
1230: if((SSL_CTX_set_options(ctx, SSL_OP_NO_RENEGOTIATION) &
1231: SSL_OP_NO_RENEGOTIATION) != SSL_OP_NO_RENEGOTIATION) {
1232: log_crypto_err("could not set SSL_OP_NO_RENEGOTIATION");
usr.sbin/nsd/server.c
2006:#if defined(SSL_OP_NO_RENEGOTIATION)
2008: if((SSL_CTX_set_options(ctx, SSL_OP_NO_RENEGOTIATION) &
2009: SSL_OP_NO_RENEGOTIATION) != SSL_OP_NO_RENEGOTIATION) {
2010: log_crypto_err("could not set SSL_OP_NO_RENEGOTIATION");
usr.sbin/nsd/nsd-control.c
187:#if defined(SSL_OP_NO_RENEGOTIATION)
189: if((SSL_CTX_set_options(ctx, SSL_OP_NO_RENEGOTIATION) &
190: SSL_OP_NO_RENEGOTIATION) != SSL_OP_NO_RENEGOTIATION)
191: ssl_err("could not set SSL_OP_NO_RENEGOTIATION");
sbin/unwind/libunbound/util/net_help.c
992:#if defined(SSL_OP_NO_RENEGOTIATION)
994: if((SSL_CTX_set_options(ctx, SSL_OP_NO_RENEGOTIATION) &
995: SSL_OP_NO_RENEGOTIATION) != SSL_OP_NO_RENEGOTIATION) {
996: log_crypto_err("could not set SSL_OP_NO_RENEGOTIATION");
1228:#if defined(SSL_OP_NO_RENEGOTIATION)
1230: if((SSL_CTX_set_options(ctx, SSL_OP_NO_RENEGOTIATION) &
1231: SSL_OP_NO_RENEGOTIATION) != SSL_OP_NO_RENEGOTIATION) {
1232: log_crypto_err("could not set SSL_OP_NO_RENEGOTIATION");
I don't exactly know what the best way to deal with this is, but I felt it was
important to bring to people's attention nonetheless.
[1]: https://github.com/drwetter/testssl.sh
[2]: https://prosody.im/security/advisory_20210512/
[3]: https://hg.prosody.im/0.12/file/tip/core/certmanager.lua
[4]: https://github.com/brunoos/luasec/blob/v1.0.1/src/options.c
[5]:
https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/lib/libssl/ssl.h?rev=1.230&content-type=text/plain