
Wazuh 클러스터 취약점 CVE-2026-25769 및 CVE-2026-25770에 대한 개념 증명 익스플로잇으로, 안전하지 않은 역직렬화와 파일 덮어쓰기를 통한 원격 코드 실행 및 권한 상승을 시연합니다.
경고: 이 저장소는 보안 취약점과 관련된 정보 및 코드를 포함하고 있습니다. 교육 목적 또는 승인된 환경에서만 사용하십시오.
Wazuh 클러스터 구성(버전 ≥ 4.0.0)에서 두 가지 심각한 취약점이 확인되었습니다. 이러한 결함은 수평 확장, 부하 분산 및 고가용성을 위해 여러 노드를 사용하는 배포 환경에 영향을 미칩니다. 이 구성은 Wazuh 서버에 부담을 주지 않으면서 여러 에이전트를 관리할 수 있게 해줍니다.
DAPi 요청을 통해 마스터와 워커 간의 통신을 허용합니다. 워커는 LocalClient 모듈을 사용하여 객체를 전송합니다. 마스터는 메시지를 수락하고 취약한 함수 as_wazuh_object()로 객체를 역직렬화하여 마스터에서 명령을 실행할 수 있게 합니다.
이 취약점은 앞선 취약점을 보완하며, <command> 및 <localfile> 태그를 사용하여 명령 실행을 허용합니다. 공격자는 /var/ossec/etc/ossec.conf 구성 파일이 로드될 때마다 명령을 실행할 수 있습니다.
두 취약점 모두 클러스터 기능을 사용하는 환경에서 [일반적 영향: 권한 상승, 원격 실행 등]을 허용합니다.
Wazuh manager ≥ 4.0.0 (패치된 버전 X.Y.Z까지)
노드 간 통신이 활성화된 master 또는 worker 역할을 가진 모든 노드.
클러스터 구성은 많은 수의 에이전트가 있는 배포 환경에서 사용됩니다. 이를 통해 다음이 가능합니다:
수평 확장: 부하를 분산하기 위해 더 많은 워커 노드를 추가.
고가용성: 워커 노드가 실패하면 노드가 복원되는 동안 다른 노드가 계속 작동.
부하 분산: 에이전트가 워커 간에 분산됩니다.
이 아키텍처는 적절히 보호되지 않으면 여기에 문서화된 것과 같은 공격 벡터에 노출될 수 있습니다.
마스터는 이 함수를 호출하며, 이를 통해 임의의 명령을 실행하는 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