
Provas de conceito de exploração para vulnerabilidades do cluster Wazuh CVE-2026-25769 e CVE-2026-25770, demonstrando execução remota de código e escalonamento de privilégios por meio de desserialização insegura e sobrescrita de arquivos.
Aviso: Este repositório contém informações e código relacionados a vulnerabilidades de segurança. Use-o apenas para fins educacionais ou em ambientes autorizados.
Foram identificadas duas vulnerabilidades críticas na configuração de cluster do Wazuh (versões ≥ 4.0.0). Essas falhas afetam implantações que utilizam múltiplos nós para escalabilidade horizontal, balanceamento de carga e alta disponibilidade. Essa configuração permite o gerenciamento de vários agentes sem que o servidor Wazuh sofra.
Permite a comunicação entre o master e o worker por meio de uma solicitação DAPi. O worker envia um objeto utilizando o módulo LocalClient do worker; o master aceita a mensagem e desserializa o objeto com a função vulnerável as_wazuh_object(), o que permite executar comandos no master.
Esta vulnerabilidade complementa a anterior, permitindo executar comandos por meio das tags <command> e <localfile>. Um atacante pode executar comandos sempre que o arquivo de configuração /var/ossec/etc/ossec.conf for carregado.
Ambas permitem [impacto geral: escalada de privilégios, execução remota, etc.] em ambientes que utilizam a funcionalidade de cluster.
Wazuh manager ≥ 4.0.0 (até a versão corrigida X.Y.Z)
Todos os nós com função master ou worker que tenham a comunicação entre nós habilitada.
A configuração de cluster é utilizada em implantações com um grande número de agentes. Ela permite:
Escalabilidade horizontal: adicionar mais nós workers para distribuir a carga.
Alta disponibilidade: se um nó worker falhar, os demais continuam operando enquanto o nó é restaurado.
Balanceamento de carga: os agentes são distribuídos entre os workers.
Essa arquitetura, se não estiver adequadamente protegida, pode expor vetores de ataque como os aqui documentados.
O master chama esta função, que permite criar o processo subprocess que executa comandos arbitrariamente.
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)
O Protocolo de Cluster Wazuh (TCP/1516) sincroniza arquivos entre nós utilizando o processo. Este processo é executado como usuário não privilegiado, aceitando endereços relativos.
"""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"
Usando essa configuração, o atacante poderia sobrescrever o diretório de configuração e chegar a executar comandos.
Um atacante poderia:
Afetar a confidencialidade, integridade, disponibilidade e escalada de privilégios.
Comprometer a integridade de toda a infraestrutura monitorada.
Os PoCs originais foram desenvolvidos por vikman90 e serviram como base para esta análise. A seguir, um exemplo de exploração:
# 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