2014-04-22 6 views
0

openSSL에서 하트 비트의 패딩 부분에 대해 이해할 수없는 부분이 있습니다. 은 OpenSSL 1.0.1g의 코드에서 , 그것은 다음과 같이 나타낸다 :OpenSSL에 대한 패딩이 heartbleed

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

그것은 패딩의 길이 그러나 RFC6520에서 16임을 나타내고, 상기 패딩의 길이가 적어도 16 바이트임을 말한다. 그런 다음 클라이언트가 패딩 (32 바이트 이상)으로 하트 비트를 보내는 경우 OpenSSL 코드에 여전히 취약점이 있습니까?

답변

1

1 + 2 + payload + 16은 최소 메시지 길이입니다. 해당 메시지 길이보다 작을 수도 있지만 더 클 수는 없습니다. 따라서 계산 된 값이 잘 구성된 하트 비트와 일치하지 않는 실제 메시지 길이보다 큰 경우 메시지를 버려서 버그를 방지해야합니다.

+0

감사합니다. 하트 비트를 보내면 "OPENSSL_assert (len <= SSL3_RT_MAX_PLAIN_LENGTH);"라는 어설 션을 볼 수 있습니다. SSL3_RT_MAX_PLAIN_LENGTH가 16k라면 왜 16k입니까? SSL 레코드에서 3 바이트를 사용하여 길이를 기록합니다. 왜 더 크지 않습니까? – iceKing

+0

@ceKing - 'HeartBeatRequest' 메시지의 필드는'uint16 payload_length'입니다. 따라서 하트 비트 메시지는 2^16 또는'SSL3_RT_MAX_PLAIN_LENGTH'보다 클 수 없습니다. 하트 비트 메시지가 2^14보다 클 수는 없지만이 경우에 익숙하지 않은 경우가 있습니다. – jww

+0

@jww 감사합니다. – iceKing