flawopen.com/Teardowns/cve-2014-0160-heartbleed
CVE-2014-0160 (Heartbleed) का पंक्ति-दर-पंक्ति तकनीकी पैच विश्लेषण: OpenSSL के tls1_process_heartbeat में गायब सीमा जांच जिसने प्रति अनुरोध 64KB सर्वर मेमोरी उजागर कर दी थी।
कल्पना कीजिए कि आप एक प्रशिक्षित तोते को 4 अक्षरों का शब्द 'BIRD' भेजते हैं और कहते हैं: 'मेरे इस शब्द को दोहराओ, लेकिन अपने जवाब को 64,000 अक्षरों जितना लंबा बनाओ।' तोता 'BIRD' बोलता है और तुरंत अपनी हालिया याददाश्त में जमा अगले 63,996 अक्षरों को बड़बड़ाना शुरू कर देता है—जिसमें अन्य आगंतुकों द्वारा बोले गए गुप्त पासवर्ड, निजी चाबियां (private keys) और बैंक खाते शामिल हैं। Heartbleed में, OpenSSL ने पैकेट के वास्तविक आकार की जांच किए बिना क्लाइंट द्वारा बताए गए संदेश आकार पर भरोसा कर लिया, जिससे सर्वर की संवेदनशील मेमोरी सीधे हमलावर के पास लीक हो गई।
Open Source SystemsCWE-SecurityDefense-in-Depthमूल कारण ओपन सोर्स सिस्टम में अनसत्यापित सीमा पैरामीटर हैं, जिससे स्थिति का असंतुलन और सुरक्षा नियंत्रणों को बायपास किया जा सकता है।
Attacker connects to a TLS server and sends a Heartbeat Request containing a 1-byte payload ('A').
Attacker sets the length field to the maximum possible value: 0xFFFF (65,535 bytes).
The server allocates a 64KB response buffer based on the client's claimed size and calls memcpy().
The memory copy overreads past the end of the packet, dumping private SSL keys, user passwords, and active session tokens.
/* Read 16-bit length directly from client packet without bounds check */
n2s(p, payload);
pl = p;
/* Allocate reply buffer based on client's claimed size */
buffer = OPENSSL_malloc(1 + 2 + payload + padding);
bp = buffer;
/* BUG: Copies up to 64KB of adjacent server heap memory! */
memcpy(bp, pl, payload);
r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding);
/* Read 16-bit length from packet */
n2s(p, payload);
pl = p;
/* FIX: Validate that claimed payload does not exceed actual received record length */
if (1 + 2 + payload + 16 > s->s3->rrec.length)
return 0; /* Silently discard malformed heartbeat */
buffer = OPENSSL_malloc(1 + 2 + payload + padding);
bp = buffer;
memcpy(bp, pl, payload);
memcpy().:।