\n\n\n\n\n\n\n\n\n\n\n
flawopen.com/सिमुलेटर/हार्टब्लीड बफर ओवररीड
ब्राउज़र-आधारित इंटरैक्टिव मेमोरी मॉडल और पैकेट सिमुलेटर जो दर्शाता है कि अमान्य टीएलएस हार्टबीट लंबाई हेडर सर्वर हीप मेमोरी से संवेदनशील डेटा कैसे लीक करता है।
कल्पना कीजिए कि आप एक प्रशिक्षित तोते को 4 अक्षरों का शब्द 'BIRD' बोलते हैं और कहते हैं: 'मेरा शब्द दोहराओ, लेकिन तुम्हारा उत्तर 64,000 अक्षरों का होना चाहिए।' तोता 'BIRD' बोलता है और फिर तुरंत अपनी स्मृति में संग्रहीत अगले 63,996 अक्षरों को बोलना शुरू कर देता है—जिसमें अन्य लोगों के गुप्त पासवर्ड, निजी एसएसएल कुंजियां और बैंक विवरण शामिल हैं। हार्टब्लीड में, OpenSSL ने क्लाइंट द्वारा बताए गए आकार पर आंख मूंदकर भरोसा किया बिना यह जांचे कि पैकेट वास्तव में कितना बड़ा था, और सर्वर की निजी मेमोरी सीधे हमलावर को वापस भेज दी।
हमलावर केवल 1 बाइट ('A') का पेलोड भेजता है लेकिन लंबाई हेडर 65,535 बाइट (0xFFFF) घोषित करता है।
OpenSSL n2s(p, payload) के जरिए लंबाई पढ़ता है लेकिन यह नहीं जांचता कि 1 + 2 + payload + 16 <= rrec.length है या नहीं।
सर्वर क्लाइंट के दावे पर भरोसा करके मेमोरी में पूरा 64KB बफर आरक्षित कर लेता है।
memcpy() कॉल 1-बाइट पैकेट के आगे बढ़कर सर्वर हीप से निजी कुंजियां और टोकन हमलावर को वापस भेज देता है।
/* बिना सीमा जांच के सीधे पैकेट से 16-बिट लंबाई पढ़ें */
n2s(p, payload);
pl = p;
/* क्लाइंट द्वारा दावा किए गए आकार पर उत्तर बफर आवंटित करें */
buffer = OPENSSL_malloc(1 + 2 + payload + padding);
bp = buffer;
/* खामी: सर्वर हीप से 64KB तक निकटवर्ती मेमोरी को कॉपी कर देता है! */
memcpy(bp, pl, payload);
r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding);
/* पैकेट से 16-बिट लंबाई पढ़ें */
n2s(p, payload);
pl = p;
/* सुधार: जांचें कि दावा किया गया पेलोड वास्तविक प्राप्त रिकॉर्ड से अधिक न हो */
if (1 + 2 + payload + 16 > s->s3->rrec.length)
return 0; /* विकृत पैकेट को चुपचाप त्याग दें */
buffer = OPENSSL_malloc(1 + 2 + payload + padding);
bp = buffer;
memcpy(bp, pl, payload);