untrusted comment: signature from openbsd 6.0 base secret key
RWSho3oKSqgLQ111xX2lFlJ3LCcKBI85hpABi/RjQa8d6h4VhhaqLR+RX5noSq5d7ruQbfgXkxJ5E20drXrdr5BzvuS+XWePSAk=
OpenBSD 6.0 errata 15, Nov 5, 2016:
Avoid continual processing of an unlimited number of TLS records.
And then rebuild and install libssl:
cd /usr/src/lib/libssl
make obj
make depend
make
make install
Index: lib/libssl/src/ssl/s3_pkt.c
===================================================================
retrieving revision 1.58
retrieving revision 1.58.2.1
diff -u -p -r1.58 -r1.58.2.1
--- lib/libssl/src/ssl/s3_pkt.c 10 Jul 2016 23:07:34 -0000 1.58
+++ lib/libssl/src/ssl/s3_pkt.c 3 Nov 2016 16:28:36 -0000 1.58.2.1
@@ -839,10 +839,11 @@ ssl3_write_pending(SSL *s, int type, con
int
ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
{
- int al, i, j, ret;
+ void (*cb)(const SSL *ssl, int type2, int val) = NULL;
+ int al, i, j, ret, rrcount = 0;
unsigned int n;
SSL3_RECORD *rr;
- void (*cb)(const SSL *ssl, int type2, int val) = NULL;
+ BIO *bio;
if (s->s3->rbuf.buf == NULL) /* Not initialized yet */
if (!ssl3_setup_read_buffer(s))
@@ -896,7 +897,27 @@ ssl3_read_bytes(SSL *s, int type, unsign
return (-1);
}
}
+
start:
+ /*
+ * Do not process more than three consecutive records, otherwise the
+ * peer can cause us to loop indefinitely. Instead, return with an
+ * SSL_ERROR_WANT_READ so the caller can choose when to handle further
+ * processing. In the future, the total number of non-handshake and
+ * non-application data records per connection should probably also be
+ * limited...
+ */
+ if (rrcount++ >= 3) {
+ if ((bio = SSL_get_rbio(s)) == NULL) {
+ SSLerr(SSL_F_SSL3_READ_BYTES, ERR_R_INTERNAL_ERROR);
+ return -1;
+ }
+ BIO_clear_retry_flags(bio);
+ BIO_set_retry_read(bio);
+ s->rwstate = SSL_READING;
+ return -1;
+ }
+
s->rwstate = SSL_NOTHING;
/*
@@ -1050,7 +1071,6 @@ start:
if (!(s->mode & SSL_MODE_AUTO_RETRY)) {
if (s->s3->rbuf.left == 0) {
/* no read-ahead left? */
- BIO *bio;
/* In the case where we try to read application data,
* but we trigger an SSL handshake, we return -1 with
* the retry option set. Otherwise renegotiation may