In dtls1_process_out_of_seq_message() the check if the current message  
is already buffered was missing. For every new message was memory  
allocated, allowing an attacker to perform an denial of service attack  
with sending out of seq handshake messages until there is no memory  
left. Additionally every future messege was buffered, even if the  
sequence number made no sense and would be part of another handshake.  
So only messages with sequence numbers less than 10 in advance will be  
buffered.


Thanks to Daniel Mentz for finding this bug!



--- ssl/d1_both.c       2009-04-19 20:03:11.000000000 +0200
+++ ssl/d1_both.c       2009-05-12 10:15:35.000000000 +0200
@@ -561,7 +561,16 @@
        if ((msg_hdr->frag_off+frag_len) > msg_hdr->msg_len)
                goto err;

-       if (msg_hdr->seq <= s->d1->handshake_read_seq)
+       /* Try to find item in queue, to prevent duplicate entries */
+       memset(seq64be,0,sizeof(seq64be));
+       seq64be[6] = (unsigned char) (msg_hdr->seq>>8);
+       seq64be[7] = (unsigned char) msg_hdr->seq;
+       item = pqueue_find(s->d1->buffered_messages, seq64be);
+       
+       /* Discard the message if sequence number was already there, is
+        * too far in the future or the fragment is already in the queue */
+       if (msg_hdr->seq <= s->d1->handshake_read_seq ||
+               msg_hdr->seq > s->d1->handshake_read_seq + 10 || item != NULL)
                {
                unsigned char devnull [256];





______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       [email protected]
Automated List Manager                           [email protected]

Reply via email to