
Эксплойты proof-of-concept для уязвимостей кластера Wazuh CVE-2026-25769 и CVE-2026-25770, демонстрирующие удалённое выполнение кода и повышение привилегий через небезопасную десериализацию и перезапись файлов.
Предупреждение: Этот репозиторий содержит информацию и код, связанные с уязвимостями безопасности. Используйте его только в образовательных целях или в авторизованных средах.
Были выявлены две критические уязвимости в конфигурации кластера Wazuh (версии ≥ 4.0.0). Эти недостатки затрагивают развертывания, использующие несколько узлов для горизонтального масштабирования, балансировки нагрузки и высокой доступности. Такая конфигурация позволяет управлять несколькими агентами без нагрузки на сервер Wazuh.
Позволяет связь между master и worker через запрос DAPi. Worker отправляет объект, используя модуль LocalClient worker; master принимает сообщение и десериализует объект с помощью уязвимой функции as_wazuh_object(), что позволяет выполнять команды на master.
Эта уязвимость дополняет предыдущую, позволяя выполнять команды с помощью тегов <command> и <localfile>. Злоумышленник может выполнять команды каждый раз при загрузке файла конфигурации /var/ossec/etc/ossec.conf.
Обе позволяют [общее воздействие: повышение привилегий, удаленное выполнение и т.д.] в средах, использующих функциональность кластера.
Wazuh manager ≥ 4.0.0 (до исправленной версии X.Y.Z)
Все узлы с ролью master или worker, у которых включена связь между узлами.
Конфигурация кластера используется в развертываниях с большим количеством агентов. Она позволяет:
Горизонтальное масштабирование: добавление дополнительных worker-узлов для распределения нагрузки.
Высокая доступность: если worker-узел выходит из строя, остальные продолжают работать, пока узел восстанавливается.
Балансировка нагрузки: агенты распределяются между worker-узлами.
Эта архитектура, если она не защищена должным образом, может раскрыть векторы атак, такие как описанные здесь.
Master вызывает эту функцию, которая позволяет создать subprocess, выполняющий произвольные команды.
def as_wazuh_object(dct: Dict):
try:
if '__callable__' in dct:
encoded_callable = dct['__callable__']
funcname = encoded_callable['__name__'] #getoutput
if '__wazuh__' in encoded_callable:
# Encoded Wazuh instance method.
wazuh = Wazuh()
return getattr(wazuh, funcname)
else:
# Encoded function or static method.
qualname = encoded_callable['__qualname__'].split('.') # getoutput
classname = qualname[0] if len(qualname) > 1 else None
module_path = encoded_callable['__module__'] # subprocess
module = import_module(module_path) # ARBITRARY IMPORT
if classname is None:
return getattr(module, funcname) # RETURNS ARBITRARY FUNCTION
else:
return getattr(getattr(module, classname), funcname)
Протокол кластера Wazuh (TCP/1516) синхронизирует файлы между узлами с помощью процесса. Этот процесс выполняется от имени непривилегированного пользователя, принимая относительные адреса.
"""Create a file descriptor to store the incoming file.
Parameters
----------
data : bytes
Relative path to the file.
Returns
-------
bytes
Result.
bytes
Response message.
"""
# VULNERABLE LINE: No validation of 'data', no checking for '../', direct file open.
self.in_file[data] = {'fd': open(common.WAZUH_PATH + data.decode(), 'wb'), 'checksum': hashlib.sha256()}
return b"ok ", b"Ready to receive new file"
Используя эту конфигурацию, злоумышленник может перезаписать каталог конфигурации и выполнить команды.
Злоумышленник может:
Повлиять на конфиденциальность, целостность, доступность и повышение привилегий.
Скомпрометировать целостность всей отслеживаемой инфраструктуры.
Оригинальные PoC были разработаны vikman90 и послужили основой для этого анализа. Ниже показан пример эксплуатации:
# 1. init docker compose
docker compose up -d
# 2. wait init all clusters
# 3. Verify cluster is connected
docker exec poc-master /var/ossec/bin/cluster_control -l
# Expected output should show worker01 connected:
# worker01 172.28.0.11 active
# 4. Execute exploit from worker
docker exec poc-worker /var/ossec/framework/python/bin/python3 /scripts/poc.py
# 5. Verify RCE on master
docker exec poc-master cat /var/ossec/etc/ossec.conf