A malformed DHCP option lands SYSTEM on the box that hands out every laptop's IP address
CVE-2026-50518 is a heap-based buffer overflow in the Windows DHCP Server role. The vulnerable code path fails to validate the size of a domain-name field inside an incoming DHCP request/relay message; an attacker on the same broadcast domain (or reachable via a DHCP relay agent) can craft a packet that overwrites heap metadata in the DHCP Server service and pivot to code execution as NT AUTHORITY\SYSTEM. Affects the DHCP Server role on Windows Server 2012 R2 through Windows Server 2025 — the DHCP *Client* is a separate CVE and not in scope here.
The vendor's CVSS 9.8 is *arithmetically* correct — AV:N/AC:L/PR:N/UI:N maps to 9.8 by the book. But the vector is misleading in real deployments: DHCP/UDP-67 is never internet-exposed on a sane network, and Microsoft's own guidance is that the service should live on trusted subnets or behind IP-helper relays. In practice this is an internal, post-initial-access vulnerability that ends in fleet-scale identity leverage. HIGH is the honest bucket; CRITICAL only applies to the negligible fraction of orgs running DHCP on an exposed edge.
4 steps from start to impact.
Attacker reaches the DHCP listener
ip-helper / DHCP relay to the target, or a rogue relay agent. No credentials required.- Foothold on any client subnet served by the target scope
- Or control of a device that can spoof a DHCP relay agent (giaddr)
- UDP/67 reachable from that position
- DHCP is never exposed to the public internet in normal deployments
- DHCP snooping on managed switches blocks rogue relays
- Segmented management VLANs limit which hosts can even see the DHCP service
Craft the malformed domain-name option
scapy DHCP builder or a fork of the classic dhcpd-fuzzer harnesses.- Working knowledge of the DHCP option TLV structure
- Ability to shape heap layout — likely via option-order priming across multiple packets
- Modern Windows heap hardening (LFH randomization, HEAP guard pages, CFG) makes reliable RCE hard on first shot
- The service will often just crash → DoS before code exec, which is still bad but recoverable
dhcp_server_bof scanner check within 2-3 weeks if a working exploit is published.Achieve SYSTEM on the DHCP server
dhcpserver.exe-hosted service, which executes as SYSTEM. The attacker now owns a Windows Server that is typically domain-joined and frequently co-located on a domain controller (a Microsoft-supported and extremely common small/mid-enterprise topology).- Reliable exploit primitive from step 2
- Service not sandboxed (it isn't)
- EDR (Defender for Endpoint, CrowdStrike, SentinelOne) will flag anomalous child processes of
svchost.exe -k DHCPServer - Service auto-restart on crash gives multiple attempts but each generates 1000/1001 crash events
svchost.exe (DHCPServer), Sysmon EID 1 anomalous children of that svchost instance.Pivot from DHCP server to domain
- SYSTEM on the DHCP host from step 3
- Understanding of local topology
- Tier-0 admins who don't co-host DHCP on DCs
- Split DHCP failover pairs on dedicated VMs limit blast to the DHCP tier
- Perimeter firewalls — the attack originates from inside the network by definition; the perimeter never sees the packet.
- WAF / IDS on HTTP — DHCP is UDP/67, no HTTP stack involved.
- MFA / conditional access — the vulnerable service does not authenticate; PR:N means credentials are irrelevant.
- Disabling DHCP failover — failover is unrelated to the parser bug; both partners are equally vulnerable and disabling it just breaks HA.
- Running DHCP as a non-admin service account — the service must run as SYSTEM/Network Service to bind privileged ports and update AD; changing this breaks the role and doesn't remove the heap primitive.
The supporting signals.
| In-the-wild exploitation | None observed as of 2026-07-15. Microsoft rates *Exploitation More Likely* on the exploitability index. |
|---|---|
| Public PoC | No public PoC at disclosure. Historically, Windows DHCP heap bugs (CVE-2019-0725, CVE-2021-38667, CVE-2023-28231) took 2–8 weeks before working exploits surfaced; expect the same window. |
| EPSS | Fresh CVE — EPSS < 1% today, will climb into the 5–15% band within 30 days based on comparable Windows RCEs. |
| KEV status | Not listed. CISA typically adds Windows RCEs only after confirmed in-the-wild abuse. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = 9.8. Arithmetically Critical; contextually gated by internal-only reachability. |
| Affected versions | Windows Server 2012 R2, 2016, 2019, 2022, 2022 23H2, 2025 — Server Core and full installs — when the DHCP Server role is installed and enabled. |
| Fixed in | July 2026 Patch Tuesday cumulative updates. Verify by installed KB per OS build; the July 2026 rollup is the authoritative fix. |
| Exposure population | Shodan/Censys surface essentially zero internet-exposed Microsoft DHCP servers on UDP/67 — the protocol is broadcast-scoped and firewalled by default. Internal exposure is universal in AD environments. |
| Disclosure | 2026-07-14, Microsoft Patch Tuesday. Reporter credit not published in the initial MSRC entry. |
| Related | One of multiple DHCP RCEs in the July 2026 release per ZDI's Patch Tuesday review; treat the DHCP cluster as a single patching campaign. |
Sources.
Why this verdict
- Reachability collapses the CVSS Network vector. The 9.8 assumes AV:N is meaningful; in practice UDP/67 is L2/relay-scoped, so the attacker is already inside. That's one full severity bucket of adjustment down.
- Role multiplier — standalone DHCP member server: chain ends at SYSTEM on one utility host. Blast radius: host-level. Bad but contained.
- Role multiplier — DHCP co-hosted on a Domain Controller (very common in SMB/mid-market): chain ends in Domain Admin. Blast radius: entire AD forest. This is why the floor stays at HIGH and does not fall to MEDIUM.
- Role multiplier — DHCP standalone but AD-integrated with scope-option control of clients: attacker can push malicious WPAD/DNS/PXE to every client renewal. Blast radius: fleet-wide credential capture / MITM. Also holds the HIGH floor.
- No KEV, no public PoC, no observed campaigns today — pulls urgency down from 'patch tonight' to 'patch within the 30-day HIGH SLA'.
- Exploitation-More-Likely rating from Microsoft + historic precedent (DHCP heap bugs consistently get weaponized within 2 months) keeps this out of the MEDIUM bucket.
Why not higher?
CRITICAL requires either internet-scale reachability (absent — service is never internet-exposed) or an active exploitation campaign (none observed). The chain requires a prior foothold on a serviced subnet or a relay-capable device; that's post-initial-access, which is by definition not CRITICAL for a broadly deployed product. If KEV lists it or a wormable PoC drops, re-rate to CRITICAL immediately.
Why not lower?
MEDIUM is off the table because of the role-multiplier floor: on any co-hosted or AD-integrated deployment the chain terminates in domain compromise or fleet-wide client MITM. Downgrading below HIGH would ignore the deployment-role blast radius rule — a bug in a component that hands DHCP options to every workstation on the network cannot be treated as ordinary hygiene.
Crowdsourced verification payload.
Run on each Windows Server with the DHCP Server role, as a local administrator. Example: .\Check-CVE-2026-50518.ps1. It confirms the role is installed, then checks the July 2026 KB is present for the running OS build. Outputs VULNERABLE / PATCHED / UNKNOWN and sets a matching exit code (0/1/2).
#requires -RunAsAdministrator
# Check-CVE-2026-50518.ps1
# Detects patch state for Windows DHCP Server heap buffer overflow (July 2026)
$ErrorActionPreference = 'Stop'
function Write-Result([string]$state, [string]$msg) {
Write-Host "[$state] $msg"
switch ($state) {
'VULNERABLE' { exit 1 }
'PATCHED' { exit 0 }
default { exit 2 }
}
}
# 1) Is DHCP Server role even installed?
try {
$svc = Get-Service -Name DHCPServer -ErrorAction Stop
} catch {
Write-Result 'PATCHED' 'DHCP Server role not installed on this host — not applicable.'
}
if ($svc.Status -ne 'Running') {
Write-Host "[INFO] DHCPServer service present but not running (Status=$($svc.Status))."
}
# 2) Resolve the July 2026 fix KB for this OS build.
# Update this table from MSRC as new builds are patched.
$build = [System.Environment]::OSVersion.Version.Build
$ubr = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -Name UBR).UBR
$os = (Get-CimInstance Win32_OperatingSystem).Caption
# Placeholder mapping — replace <KBxxxxxxx> with the actual July 2026 rollup KB IDs
# from https://msrc.microsoft.com/update-guide/vulnerability/CVE-2026-50518
$fixMap = @{
26100 = 'KB5062553' # Server 2025 — verify from MSRC
20348 = 'KB5062554' # Server 2022 — verify from MSRC
17763 = 'KB5062555' # Server 2019 — verify from MSRC
14393 = 'KB5062556' # Server 2016 — verify from MSRC
9600 = 'KB5062557' # Server 2012 R2 — verify from MSRC
}
if (-not $fixMap.ContainsKey($build)) {
Write-Result 'UNKNOWN' "Unmapped OS build $build ($os). Check MSRC advisory manually."
}
$targetKb = $fixMap[$build]
# 3) Check installed hotfixes and quick-fix engineering entries
$installed = @()
$installed += (Get-HotFix -ErrorAction SilentlyContinue | Select-Object -ExpandProperty HotFixID)
try {
$installed += (Get-WmiObject -Class Win32_QuickFixEngineering -ErrorAction Stop | Select-Object -ExpandProperty HotFixID)
} catch { }
$installed = $installed | Sort-Object -Unique
if ($installed -contains $targetKb) {
Write-Result 'PATCHED' "$targetKb present on $os (build $build.$ubr)."
} else {
Write-Result 'VULNERABLE' "$targetKb NOT found on $os (build $build.$ubr). Apply July 2026 rollup."
}