отступы об OpenSSL Heartbleed

Я что-то не понимаю в части сердцебиения в openSSL. В коде openssl 1.0.1g это выглядит следующим образом:

n2s(p, payload);
if (1 + 2 + payload + 16 > s->s3->rrec.length)
    return 0; /* silently discard per RFC 6520 sec. 4 */
pl = p;

Он показывает, что длина заполнения равна 16, однако в RFC6520 говорится, что длина заполнения составляет не менее 16 байтов. Тогда, если клиент отправит пульс с заполнением (32 байта или больше), есть ли уязвимость в коде OpenSSL?


person iceKing    schedule 22.04.2014    source источник


Ответы (1)


1 + 2 + payload + 16 — минимальная длина сообщения; она может быть меньше соответствующей длины сообщения, но не может быть больше. Таким образом, тест говорит, что если это вычисленное значение больше, чем фактическая длина сообщения, что несовместимо с хорошо построенным сердцебиением, сообщение следует отбросить, чтобы предотвратить ошибку.

person Warren Dew    schedule 22.04.2014
comment
Спасибо, я это вижу. Когда мы отправляем пульс, я вижу утверждение OPENSSL_assert(len ‹= SSL3_RT_MAX_PLAIN_LENGTH); а SSL3_RT_MAX_PLAIN_LENGTH — 16 КБ, почему 16 КБ? В записи SSL для записи длины используется 3 байта, почему бы не больше? - person iceKing; 22.04.2014
comment
@ceKing - сообщение HeartBeatRequest имеет поле uint16 payload_length. Таким образом, сообщение пульса не может быть больше 2^16 или SSL3_RT_MAX_PLAIN_LENGTH. Есть случай, в котором говорится, что сообщение пульса не может быть больше 2^14, но я не знаком с этим случаем. - person jww; 22.04.2014