Microsoft has issued an emergency, out-of-band security update for the .NET developer platform addressing two newly disclosed vulnerabilities — including a critical buffer overflow flaw — as well as weaknesses that were not fully remediated by a previous security release. That last point is the one that should make every security leader sit up: organizations that believed they were protected by applying the earlier patch may still be exposed right now.
Out-of-band releases from Microsoft are rare by design. The vendor only breaks its Patch Tuesday cadence when a vulnerability carries enough risk that waiting weeks for the next cycle is unacceptable — typically because exploitation is imminent, a bypass of an existing fix has been identified, or the affected component sits in the attack path of a massive install base. .NET meets all three criteria. The runtime underpins millions of line-of-business applications, ASP.NET Core web services, IIS-hosted workloads, cloud functions, and third-party enterprise software. A critical memory corruption flaw in this stack is not a developer inconvenience — it is an enterprise risk event.
If you operate any Windows server hosting IIS with .NET applications, any self-hosted ASP.NET Core service, or any workstation/VDI environment running .NET-dependent software, this update belongs at the top of your change queue this week, not in next month's maintenance window.
Technical Analysis
What We Know From the Disclosure
Based on the reporting and Microsoft's advisory structure for this release, the update addresses:
- Two newly disclosed vulnerabilities in the .NET platform. At least one is a critical buffer overflow — a memory corruption condition where attacker-controlled input overruns an allocated buffer, enabling code execution or process crash depending on the write primitive and mitigations in place.
- Incomplete fixes from an earlier release. This is the classic "patch gap" scenario: an original update mitigated a vulnerability but did not close all code paths or all affected runtime variants, leaving a residual attack surface that researchers (or attackers) subsequently mapped.
Affected Products and Platforms
While exact version matrices should be confirmed against Microsoft's advisory and the Microsoft Security Response Center (MSRC) update guide, defenders should assume the blast radius includes:
- .NET Framework (in-box Windows runtime, serviced via Windows Update / WSUS / Microsoft Update Catalog)
- Modern .NET (formerly .NET Core) — runtime and SDK, self-contained and framework-dependent deployments
- ASP.NET Core hosting models — including apps hosted behind IIS via the ASP.NET Core Module (ANCM) and Kestrel self-hosted services
- Visual Studio / build servers where vulnerable SDK components are present
- Third-party software that bundles or depends on a vulnerable shared runtime — a frequently missed vector
A critical inventory nuance: .NET applications can be deployed framework-dependent (using the machine-wide runtime) or self-contained (bundling the runtime into the application directory). Patching the OS-level runtime does not fix self-contained deployments — those must be rebuilt and redeployed by the application owner. This is where most remediation programs silently fail.
How a Buffer Overflow in .NET Is Exploited
From a defender's perspective, the exploitation chain for a network-reachable .NET buffer overflow typically looks like this:
- Delivery: The attacker sends a crafted request or payload to an application built on the vulnerable runtime — commonly an HTTP request to an ASP.NET endpoint, a malformed file processed by a .NET service, or a crafted input to a deserialization or parsing component.
- Trigger: The vulnerable component copies the oversized or malformed input into a fixed-size buffer without adequate bounds checking, corrupting adjacent memory.
- Outcome: Depending on mitigations (ASLR, DEP, Control Flow Guard), the result ranges from an application pool crash (denial of service) to arbitrary code execution in the security context of the host process.
That last sentence is why process context matters so much operationally. An IIS-hosted application compromised via this class of flaw executes code as the w3wp.exe worker process — typically running under an application pool identity. A self-hosted ASP.NET Core app executes as dotnet.exe under whatever service account launched it. Your detection and containment strategy must be built around those two process trees.
Exploitation Status
At the time of publication, Microsoft has characterized the flaws as critical and shipped fixes outside the normal cycle — a strong signal of elevated risk. Defenders should treat network-exposed .NET applications as priority-one until patched, regardless of whether public proof-of-concept code has surfaced yet. Historically, memory corruption flaws in widely deployed frameworks move from disclosure to weaponization quickly, and the existence of an incomplete prior fix means attack surface analysis has already been done for the adversary. Monitor the MSRC advisory and CISA's Known Exploited Vulnerabilities (KEV) catalog daily; if a KEV entry lands, federal remediation deadlines (typically 3 weeks for civilian agencies, and a de facto standard for everyone else) apply.
Detection & Response
There is no signature for the overflow itself that will survive contact with a production environment — the crash or exploit occurs inside legitimate processes. The durable detection strategy is post-exploitation behavior: what does an attacker do after they land code execution inside w3wp.exe or dotnet.exe? They enumerate, they spawn shells, they drop payloads. Those behaviors are high-fidelity because web server worker processes and .NET runtimes have almost no legitimate reason to spawn command interpreters.
Sigma Rules
---
title: IIS Worker Process Spawning Command Shell or Scripting Engine
id: 8f2c4a91-3b6d-4e7f-9a1c-5d2e8f4b6a30
status: experimental
description: Detects w3wp.exe spawning cmd.exe, powershell, or other LOLBins — a strong indicator of post-exploitation following compromise of an ASP.NET application, consistent with weaponized .NET vulnerabilities.
references:
- https://www.infosecurity-magazine.com/news/microsoft-patch-update-net-flaw/
- https://attack.mitre.org/techniques/T1190/
author: Security Arsenal
date: 2026/01/15
tags:
- attack.initial_access
- attack.t1190
- attack.execution
- attack.t1059
logsource:
category: process_creation
product: windows
detection:
selection_parent:
ParentImage|endswith: '\w3wp.exe'
selection_child:
Image|endswith:
- '\cmd.exe'
- '\powershell.exe'
- '\pwsh.exe'
- '\cscript.exe'
- '\wscript.exe'
- '\mshta.exe'
- '\rundll32.exe'
- '\regsvr32.exe'
- '\certutil.exe'
- '\bitsadmin.exe'
- '\whoami.exe'
- '\net.exe'
- '\nltest.exe'
condition: selection_parent and selection_child
falsepositives:
- Legacy applications shelling out to system commands by design (inventory these and suppress by command line hash, never by parent alone)
- Application pool health monitoring scripts (rare; usually run under different parentage)
level: high
---
title: .NET Runtime Process Spawning Suspicious Child Process
id: 3e7b9d42-6a1f-4c8e-b5d9-2f4a7c1e8b35
status: experimental
description: Detects dotnet.exe spawning command interpreters or reconnaissance utilities, indicating code execution achieved within a self-hosted .NET application — relevant to exploitation of the patched .NET buffer overflow flaws.
references:
- https://www.infosecurity-magazine.com/news/microsoft-patch-update-net-flaw/
- https://attack.mitre.org/techniques/T1190/
author: Security Arsenal
date: 2026/01/15
tags:
- attack.initial_access
- attack.t1190
- attack.execution
logsource:
category: process_creation
product: windows
detection:
selection_parent:
ParentImage|endswith: '\dotnet.exe'
selection_child:
Image|endswith:
- '\cmd.exe'
- '\powershell.exe'
- '\pwsh.exe'
- '\mshta.exe'
- '\rundll32.exe'
- '\whoami.exe'
- '\ipconfig.exe'
- '\systeminfo.exe'
- '\quser.exe'
- '\netstat.exe'
condition: selection_parent and selection_child
falsepositives:
- Build agents and CI/CD runners invoking dotnet build pipelines (scope out build server hosts, not the behavior)
- Developer workstations during debugging sessions
level: high
---
title: IIS Application Pool Crash Followed by Worker Process Respawn
id: 5c1a8f36-9d4b-4e2a-a7c3-1f8b6d2e9a41
status: experimental
description: Detects w3wp.exe abnormal termination or crash events potentially caused by a buffer overflow trigger against a .NET application, including rapid respawn patterns indicative of repeated exploitation attempts.
references:
- https://www.infosecurity-magazine.com/news/microsoft-patch-update-net-flaw/
- https://attack.mitre.org/techniques/T1499/
author: Security Arsenal
date: 2026/01/15
tags:
- attack.impact
- attack.t1499
logsource:
category: application
product: windows
detection:
selection:
Provider_Name:
- 'Application Error'
- 'Windows Error Reporting'
- '.NET Runtime'
Message|contains:
- 'w3wp.exe'
- 'dotnet.exe'
- 'clr.dll'
- 'coreclr.dll'
condition: selection
falsepositives:
- Buggy application code causing legitimate managed exceptions (correlate with patching timeline and external request volume before dismissing)
level: medium
KQL Hunt (Microsoft Sentinel / Defender)
This query hunts for the core post-exploitation pattern — web server and .NET runtime processes spawning children they should never spawn — joined against recent process crash telemetry to help you spot both successful exploitation and failed attempts (crashes from a fuzzing attacker or unreliable exploit).
// Hunt: .NET/IIS post-exploitation behavior and crash artifacts
let suspiciousChildren = dynamic(["cmd.exe","powershell.exe","pwsh.exe","mshta.exe","rundll32.exe","regsvr32.exe","certutil.exe","bitsadmin.exe","whoami.exe","net.exe","nltest.exe","wscript.exe","cscript.exe"]);
let exploitation = DeviceProcessEvents
| where TimeGenerated > ago(14d)
| where InitiatingProcessFileName in~ ("w3wp.exe", "dotnet.exe")
| where FileName in~ (suspiciousChildren)
| project ExploitTime=TimeGenerated, DeviceName, AccountName=InitiatingProcessAccountName,
ParentProcess=InitiatingProcessFileName, ChildProcess=FileName,
ChildCommandLine=ProcessCommandLine, InitiatingProcessCommandLine, SHA256;
let crashes = DeviceProcessEvents
| where TimeGenerated > ago(14d)
| where FileName in~ ("WerFault.exe", "WerFaultSecure.exe")
| where InitiatingProcessFileName in~ ("w3wp.exe", "dotnet.exe")
| project CrashTime=TimeGenerated, DeviceName, CrashedProcess=InitiatingProcessFileName, AccountName=InitiatingProcessAccountName;
exploitation
| join kind=fullouter crashes on DeviceName
| extend CorrelatedEvent = iff(isnotempty(ExploitTime) and isnotempty(CrashTime), "Crash + Post-Exploit Activity", iff(isnotempty(ExploitTime), "Post-Exploit Activity", "Crash Only - Possible Failed Exploit"))
| order by ExploitTime desc
Run the same hunt over your IIS request logs if you ingest them via W3CIISLog: look for requests with abnormally long URIs, query strings, or headers immediately preceding application pool recycles — that temporal pairing is your strongest pre-execution signal for a buffer overflow trigger.
Velociraptor VQL
This artifact triages suspected compromised web servers by enumerating the full process tree ancestry of running w3wp.exe and dotnet.exe instances, surfacing any that descend from (or parent) unexpected processes, alongside their loaded execution context.
-- Triage: enumerate .NET/IIS process trees and flag anomalous children
LET targets = SELECT Pid, Ppid, Name, Exe, CommandLine, Username, CreateTime
FROM pslist()
WHERE Name =~ '(?i)w3wp|dotnet'
SELECT Pid, Ppid, Name, Exe, CommandLine, Username, CreateTime,
get(item=pslist(pid=Ppid), field='Name') AS ParentName,
get(item=pslist(pid=Ppid), field='CommandLine') AS ParentCommandLine
FROM targets
UNION ALL
SELECT Pid, Ppid, Name, Exe, CommandLine, Username, CreateTime,
get(item=pslist(pid=Ppid), field='Name') AS ParentName,
get(item=pslist(pid=Ppid), field='CommandLine') AS ParentCommandLine
FROM pslist()
WHERE Ppid IN (SELECT Pid FROM targets)
AND Name =~ '(?i)cmd|powershell|pwsh|mshta|rundll32|regsvr32|certutil|whoami|net\.exe|nltest'
Any rows returned by the second half of that UNION on a production web tier should be treated as a confirmed-compromise triage event until proven otherwise: isolate the host, capture memory (the .NET CLR holds a wealth of forensic artifacts in managed heaps), and preserve IIS logs before rotation.
Remediation and Verification Script
Use this PowerShell to inventory installed .NET runtimes, enumerate pending Windows Updates applicable to .NET, identify self-contained deployments that OS patching will miss, and confirm the hotfix state. Run elevated.
# Inventory installed .NET Framework release (OS-serviced runtime)
$fxKey = 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full'
if (Test-Path $fxKey) {
$release = (Get-ItemProperty $fxKey).Release
Write-Host "[+] .NET Framework 4.x Release DWORD: $release" -ForegroundColor Cyan
# Cross-reference Release value against Microsoft's published version table
}
# Inventory modern .NET runtimes and SDKs
Write-Host "[+] Installed .NET runtimes:" -ForegroundColor Cyan
& dotnet --list-runtimes 2>$null
Write-Host "[+] Installed .NET SDKs:" -ForegroundColor Cyan
& dotnet --list-sdks 2>$null
# Find runtime installations on disk (catches non-standard/patch-missed locations)
Get-ChildItem 'C:\Program Files\dotnet\shared','C:\Program Files (x86)\dotnet' -ErrorAction SilentlyContinue |
Select-Object FullName | Format-Table -AutoSize
# CRITICAL: locate self-contained deployments — these are NOT fixed by OS patching
Write-Host "[!] Scanning for self-contained .NET deployments (must be rebuilt by app owners):" -ForegroundColor Yellow
Get-ChildItem -Path 'C:\inetpub','C:\Apps','D:\' -Recurse -Filter 'coreclr.dll' -ErrorAction SilentlyContinue |
ForEach-Object {
$ver = (Get-Item $_.FullName).VersionInfo.ProductVersion
Write-Host " $($_.DirectoryName) -> coreclr $ver"
}
# Enumerate recently installed updates and pending .NET-related patches
Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 10 | Format-Table -AutoSize
# Trigger and report applicable updates via Windows Update API (review before auto-installing)
$session = New-Object -ComObject Microsoft.Update.Session
$searcher = $session.CreateUpdateSearcher()
$result = $searcher.Search("IsInstalled=0 and Type='Software'")
$result.Updates | Where-Object { $_.Title -match '\.NET' } |
ForEach-Object { Write-Host "[PENDING] $($_.Title)" -ForegroundColor Red }
# IIS sanity check: list app pools and identities for exposure scoping
Import-Module WebAdministration -ErrorAction SilentlyContinue
Get-ChildItem IIS:\AppPools -ErrorAction SilentlyContinue |
Select-Object Name, State, @{N='Identity';E={$_.processModel.identityType}} | Format-Table -AutoSize
The self-contained deployment scan is the highest-value step here. Every mature IR program we've run has found at least one line-of-business app bundling a years-old runtime that no OS patch will ever touch. If the scan returns results, hand them to the application owners with a rebuild deadline — that is a remediation task, not an IT task.
Remediation
- Apply the emergency update immediately. Obtain the correct packages from the Microsoft Security Response Center advisory linked from Microsoft's security update guide (https://msrc.microsoft.com/update-guide) and the InfoSecurity Magazine coverage of this release. For .NET Framework, updates flow through Windows Update, WSUS, and the Microsoft Update Catalog; for modern .NET, download updated runtimes and SDKs from https://dotnet.microsoft.com/download or your Linux distribution's package feeds.
- Do not assume the earlier patch protected you. A core element of this advisory is that prior fixes were incomplete. Validate the current update is installed — check the installed runtime version against the version listed as fixed in the MSRC advisory, not merely the presence of the older KB.
- Patch all runtime variants. Windows Server and client OS (.NET Framework), modern .NET runtimes, SDKs on build servers, and Visual Studio instances all carry independent patch requirements.
- Remediate self-contained deployments. Inventory applications bundling their own runtime (the script above), and require application teams to rebuild against the patched SDK and redeploy. Track this to closure — it is the most commonly skipped step.
- Restart what you patch. .NET runtime updates do not protect running processes until application pools and services are recycled. Schedule IISRESET / app pool recycles and service restarts as part of the change, and validate post-restart that the loaded runtime version reflects the patch (inspect loaded module versions for coreclr.dll / clr.dll).
- Reduce exposure while patching. For internet-facing ASP.NET applications that cannot be patched within 24 hours, apply compensating controls: WAF rules to block abnormally large request bodies, headers, and query strings; network segmentation isolating web tiers from domain controllers and data stores; and least-privilege application pool identities (never run app pools as SYSTEM, Administrator, or a domain account with broad rights — use the default virtual accounts or gMSAs).
- Monitor CISA KEV. If these flaws are added to the Known Exploited Vulnerabilities catalog, remediation deadlines become binding for federal civilian agencies and should be treated as the de facto standard for private industry. Check https://www.cisa.gov/known-exploited-vulnerabilities-catalog daily until this cycle closes.
- Hunt retroactively. Apply the detection content above against at least 14–30 days of retained telemetry. A patch applied today does nothing about an attacker who landed last week and established persistence under a legitimate service account.
The Bigger Lesson
Incomplete patches are an underappreciated category of enterprise risk. Your vulnerability management program is not done when the KB installs — it is done when the fix is verified complete, all deployment variants are covered, and retro-hunting confirms no pre-patch compromise. Out-of-band releases for core runtime platforms like .NET should trigger your highest-severity patch SLA automatically, with CISO-level visibility into completion. If your organization measures patch velocity in weeks for critical, network-reachable flaws, this is the advisory to cite when you renegotiate that SLA.
Related Resources
Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub
Is your security operations ready?
Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.