
مختبر Heartbleed (CVE-2014-0160) قائم بذاته: يبني إصدار OpenSSL 1.0.1f القابل للاستغلال في Docker ويتضمن أداة إثبات مفهوم (PoC) بلغة Python لتسريب الذاكرة لأغراض الاختبار المصرّح به.
مختبر صغير ومكتفٍ ذاتيًا لـ CVE-2014-0160 (Heartbleed) — تجاوز القراءة في نبضة TLS في OpenSSL 1.0.1–1.0.1f. يقوم ببناء OpenSSL المصاب فعليًا من مصدر upstream مثبّت في حاوية مؤقتة، ويشغّله، ويتضمن عميل إثبات مفهوم يقوم بتسريب ذاكرة العملية الحية منه.
للاستخدام المخبري المصرّح به فقط. كل ما هنا يستهدف
localhost/ حاوية تشغّلها بنفسك. لا توجّه PoC نحو أي مضيف لا تملكه وليس لديك إذن صريح باختباره — الاستخدام غير المصرّح به لـ Heartbleed ضد أنظمة حية جريمة في معظم الولايات القضائية. تم إصلاح Heartbleed في OpenSSL 1.0.1g (أبريل 2014)؛ هذا المختبر موجود لفهم العلّة، لا لمهاجمة أي أحد.
| المسار | ما هو |
|---|---|
Dockerfile | يبني OpenSSL 1.0.1f من مصدر upstream مثبّت ببصمة تحقق مع تمكين heartbeats، ويولّد شهادة مؤقتة، ويشغّل openssl s_server — الخادم المصاب الحقيقي. |
exploit/heartbleed.py | PoC بلغة Python 3. يرسل نبضة heartbeat مشوّهة ويطبع بتنسيق hexdump الذاكرة التي يسرّبها الخادم. يخرج بـ 0 إذا كان الهدف مصابًا، و1 إذا كان مُرقّعًا. |
demo/server.py | محاكاة ساذجة بلغة Python خالصة — لا يتدخل OpenSSL. يردّ بشكل أعمى بـ 64 KB ولا يسرّب شيئًا حقيقيًا؛ محفوظ فقط لإظهار شكل رد تجاوز القراءة. |
demo/gen-cert.sh | يعيد توليد شهادة localhost المؤقتة للعرض التوضيحي. |
لا توجد مفاتيح خاصة مُودعة — تُولَّد الشهادات محليًا (انظر .gitignore).
# 1. Build and start the vulnerable server (needs Docker)
docker build -t heartbleed-lab .
docker run --rm -p 8443:8443 heartbleed-lab
# 2. In another terminal, bleed it
python3 exploit/heartbleed.py 127.0.0.1 -p 8443
يطبع الخادم المصاب hexdump للذاكرة المسرّبة. أعد تشغيل PoC عدة مرات — كل طلب يعيد شريحة مختلفة من الـ heap، وهذا بالضبط سبب خطورة Heartbleed: ملفات تعريف ارتباط الجلسة، وبيانات النماذج، ومواد المفتاح الخاص كلها تعيش هناك.
cd demo
./gen-cert.sh
python3 server.py
هذا ليس الـ CVE — إنه نموذج تعليمي يرد دائمًا بـ 64 KB من حرف A.
يحمل طلب نبضة TLS حمولة payload مع حقل طول. يثق OpenSSL المصاب بالطول الذي يقدمه
المهاجم ويقوم بـ memcpy لهذا العدد من البايتات من مخزن الطلب إلى الاستجابة — لكن
الطلب لم يحتوِ أبدًا على هذا القدر من البيانات، لذا تتجاوز القراءة حدوده إلى أي ذاكرة
عملية مجاورة. الإصلاح في 1.0.1g هو فحص حدود:
if (1 + 2 + payload + 16 > s->s3->rrec.length) return 0; — يتجاهل بصمت أي نبضة
heartbeat تدّعي أكثر مما أُرسل فعليًا.
-DOPENSSL_NO_HEARTBEATS.