Leaving a master key under the doormat of the building that controls every lock in your office
CVE-2026-28326 is a CWE-321 (Use of Hard-coded Cryptographic Key) flaw in SolarWinds Access Rights Manager (ARM) versions 2026.2 and all prior releases. The application ships with a static, hard-coded cryptographic key that an unauthenticated attacker on the adjacent network can leverage to achieve arbitrary code execution on the ARM server. Because every installation of the vulnerable version contains the identical key, extracting it from any single copy of the binary — or diffing the 2026.2.1 patch — gives an attacker a universal credential that works against every unpatched ARM instance. The fix is ARM 2026.2.1, released September 17, 2026.
SolarWinds scored this 8.8 HIGH with a CVSS vector of CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H. The AV:A (Adjacent Network) component is the critical limiter — this is not exploitable from the internet. However, the vendor severity is *broadly fair* for the adjacent-network scenario because ARM is an identity governance platform that runs with high-privilege service accounts connected directly to Active Directory. Compromise of the ARM server is functionally equivalent to compromise of AD delegation — the blast radius is domain-scale, not host-scale. The modest downgrade to 8.0 reflects the current absence of public PoC, no in-the-wild exploitation, and the adjacent-network prerequisite, but the deterministic nature of a hard-coded key means weaponization is trivially achievable and the window of safety is narrow.
5 steps from start to impact.
Gain internal network position
- Internal network access or same VLAN/subnet as the ARM server
- Prior initial access via phishing, VPN compromise, or physical access
- Requires a preceding compromise stage — this is a post-initial-access attack
- Network segmentation (if properly implemented) limits reachable hosts
Extract or obtain the hard-coded key
- Access to any copy of the ARM binary (installer, existing compromised host, or public download)
- No public PoC or key extraction tool exists as of 2026-09-20
- Requires reverse engineering skill or a published advisory with key details
Craft weaponized request using the key
AC:L (Attack Complexity: Low) and PR:N (Privileges Required: None), no additional conditions or credentials are needed beyond network reachability and knowledge of the key. The request triggers code execution on the ARM server.- Network reachability to ARM service port
- Knowledge of the hard-coded cryptographic key
- Without the key, this step is blocked entirely
- ARM's service ports may be firewalled to specific management hosts
Achieve SYSTEM-level code execution on ARM server
- Successful exploitation from Step 3
- EDR/AV on the ARM server may detect post-exploitation activity
- Application allowlisting may block attacker payloads
Pivot to Active Directory via ARM service accounts
- ARM service account has the delegated AD permissions it was designed to have
- Attacker has SYSTEM on the ARM host
- Credential Guard / LSA protection may limit credential harvesting
- Tiered administration model may limit service account scope (rare in practice)
The supporting signals.
| In-the-Wild Exploitation | None reported. SolarWinds advisory makes no mention of exploitation. No CISA alerts or threat intel reports reference active campaigns targeting CVE-2026-28326. |
|---|---|
| Proof-of-Concept | No public PoC as of 2026-09-20. No exploit code found on GitHub (checked nomi-sec/PoC-in-GitHub, SecureWithUmer/CVE-2026-PoCs). However, CWE-321 vulnerabilities are trivially weaponized once the key is extracted from the binary or patch diff — expect PoC within weeks. |
| EPSS Score | 0.00548 (0.548%) — approximately 55th percentile. Low predicted exploitation probability, consistent with the adjacent-network requirement and absence of public tooling. |
| KEV Status | Not listed in CISA's Known Exploited Vulnerabilities catalog as of 2026-09-20. |
| CVSS Vector | CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H — The AV:A (Adjacent Network) is the critical differentiator from a 9.8. Full CIA impact, no auth, no interaction, but requires LAN adjacency. |
| Affected Versions | SolarWinds Access Rights Manager ≤ 2026.2 (all prior versions affected) |
| Fixed Version | ARM 2026.2.1 (released 2026-09-17). No distro backports apply — ARM is a proprietary Windows application distributed directly by SolarWinds. |
| Scanning/Exposure | ARM is an internal-only application. SolarWinds documentation explicitly states: *install on a server that is neither public, nor internet-facing.* No ARM instances indexed on Shodan/Censys/FOFA. Attack surface is limited to internal network segments. |
| Disclosure Date | 2026-09-17 — SolarWinds coordinated disclosure. Only 3 days old at time of assessment. |
| Reporting Researcher | Kai Huang of Armadin security research team. SolarWinds ARM has a history of similar findings: CVE-2024-28990 (hardcoded RabbitMQ credential), CVE-2024-28991 (deserialization with auth bypass), CVE-2023-35182 (unauthenticated deserialization → SYSTEM). |
Why this verdict
- Adjacent-network vector limits initial reachability: AV:A means this is a post-initial-access vulnerability. The attacker must already be inside the network on the same segment as the ARM server. This is already reflected in the vendor CVSS (8.8 vs. 9.8 for AV:N), but operationally it means your perimeter defenses are a real gate — no drive-by exploitation from the internet.
- No PoC, no exploitation, low EPSS: As of 3 days post-disclosure, there is no public exploit code, no observed campaigns, and EPSS sits at the 55th percentile. This provides a narrow but real patching window before weaponization. However, CWE-321 (hardcoded key) is inherently deterministic — the key can be extracted from any binary copy — so this window will close faster than a typical RCE.
- Role multiplier — identity/access governance tier (CRITICAL floor consideration): ARM is *by definition* a high-value identity-management component. 100% of ARM installations exist to manage AD permissions, file server ACLs, and SharePoint access rights. ARM service accounts hold delegated AD write permissions. Compromise of ARM → domain-scale access rights manipulation → effective Domain Admin. This sets a HIGH floor that cannot be overridden by friction alone. The floor does not reach CRITICAL because the AV:A vector means no external reachability, ARM is not itself a domain controller, and the blast radius requires a pivot step (credential harvesting from the ARM server) rather than direct AD control.
- SolarWinds ARM's vulnerability history compounds urgency: This is the third hardcoded-credential or deserialization RCE in ARM in three years (CVE-2024-28990, CVE-2024-28991, CVE-2023-35182). Threat actors familiar with ARM's attack surface will prioritize examining the patch diff. SolarWinds products are also high-value targets for nation-state actors given the SUNBURST precedent.
- Net assessment: Downgrade from 8.8 to 8.0 reflects the current absence of weaponization and the adjacent-network gate, but the identity-tier blast radius and deterministic key extraction keep this firmly at HIGH. The 0.8-point reduction accounts for temporal factors only — the base risk profile is severe for any organization running ARM.
Why not higher?
This does not reach CRITICAL because the attack vector is Adjacent Network (AV:A), not Network (AV:N). ARM is never internet-facing by design, and no Shodan/Censys exposure exists. The chain requires prior internal compromise as a prerequisite, meaning this is a privilege-escalation/lateral-movement tool rather than an initial-access vector. While the blast radius through AD delegation is severe, the attacker must still pivot from the ARM server to AD — it is not a single-step domain takeover like Zerologon.
Why not lower?
Downgrading below HIGH would ignore the canonical identity-management role of this component. ARM exists solely to manage AD access rights; its service accounts hold the keys to domain-wide permission changes. A hardcoded cryptographic key is deterministic — unlike a memory corruption bug that needs exploit development, CWE-321 requires only binary analysis to weaponize. SolarWinds ARM's repeated vulnerability history (3 critical-class bugs in 3 years) and the SolarWinds brand's attractiveness to sophisticated threat actors mean the exploitation window will close quickly. Any internal attacker or red team with LAN access can trivially reach this.
What to do — in priority order.
- Isolate ARM server to a dedicated management VLAN with strict ACLs — Since AV:A requires network adjacency, the single most effective compensating control is network segmentation. Restrict inbound connections to the ARM server to only known management workstations and AD infrastructure hosts. Deploy within the noisgate mitigation SLA of 30 days for HIGH severity.
- Upgrade to ARM 2026.2.1 immediately — The patch eliminates the hard-coded key entirely. Given the deterministic nature of CWE-321 and ARM's identity-tier role, prioritize this within the noisgate remediation SLA of 180 days, but realistically aim for 30 days given the likely speed of PoC development.
- Enable host-based firewall rules on the ARM server — Configure Windows Firewall to allow inbound connections to ARM service ports only from specific IP addresses (admin workstations, AD DCs). This provides defense-in-depth even if VLAN segmentation is imperfect.
- Deploy or verify EDR coverage on the ARM server — Ensure EDR is installed, active, and monitoring the ARM server for post-exploitation behaviors: child process spawning from the ARM service, credential dumping, lateral movement. This won't prevent exploitation but will detect it.
- Audit ARM service account permissions — Review the delegated AD permissions granted to ARM service accounts. Apply least-privilege principles — remove any permissions beyond what ARM operationally requires. This limits blast radius if the server is compromised.
- Monitor ARM service account activity in SIEM — Create detection rules for ARM service account logins outside normal operational patterns, permission changes initiated by the service account, and any interactive logon using the service account credentials.
- WAF or reverse proxy — ARM is not a web application served through a WAF. It uses proprietary protocols on internal service ports. A WAF provides zero coverage.
- MFA on ARM console — While MFA on the ARM admin console is good hygiene, this vulnerability is *unauthenticated* RCE via the hard-coded key. MFA does not gate the vulnerable code path.
- Patching the underlying OS — This is an application-layer vulnerability in the ARM binary itself. Windows patches do not address the hard-coded key. Only the ARM 2026.2.1 update resolves it.
- Disabling RabbitMQ — While ARM uses RabbitMQ and had a prior hardcoded credential issue there (CVE-2024-28990), this CVE is in ARM's own cryptographic handling, not RabbitMQ. Disabling RabbitMQ would break ARM functionality without addressing this vulnerability.
Crowdsourced verification payload.
Run this script on the ARM server itself as a local administrator. Execute with: powershell -ExecutionPolicy Bypass -File .\Check-CVE-2026-28326.ps1. Requires read access to the ARM installation directory and the Windows registry.
#Requires -RunAsAdministrator
<#
.SYNOPSIS
Checks whether SolarWinds Access Rights Manager is vulnerable to CVE-2026-28326.
.DESCRIPTION
Detects installed ARM version via registry and file version info.
Versions <= 2026.2 are VULNERABLE. Version 2026.2.1+ is PATCHED.
.OUTPUTS
VULNERABLE, PATCHED, or UNKNOWN with exit codes 1, 0, 2 respectively.
#>
$ErrorActionPreference = 'Stop'
# Known registry paths for ARM installation
$regPaths = @(
'HKLM:\SOFTWARE\SolarWinds\AccessRightsManager',
'HKLM:\SOFTWARE\WOW6432Node\SolarWinds\AccessRightsManager',
'HKLM:\SOFTWARE\SolarWinds\ARM'
)
$installPath = $null
$detectedVersion = $null
# Attempt registry detection
foreach ($rp in $regPaths) {
if (Test-Path $rp) {
try {
$installPath = (Get-ItemProperty -Path $rp -ErrorAction SilentlyContinue).InstallPath
$detectedVersion = (Get-ItemProperty -Path $rp -ErrorAction SilentlyContinue).Version
} catch { }
if ($installPath) { break }
}
}
# Fallback: check common install directories
if (-not $installPath) {
$commonPaths = @(
"$env:ProgramFiles\SolarWinds\Access Rights Manager",
"$env:ProgramFiles(x86)\SolarWinds\Access Rights Manager",
"$env:ProgramFiles\SolarWinds\ARM"
)
foreach ($cp in $commonPaths) {
if (Test-Path $cp) {
$installPath = $cp
break
}
}
}
# Check if ARM is installed
if (-not $installPath -or -not (Test-Path $installPath)) {
Write-Host 'UNKNOWN - SolarWinds Access Rights Manager not detected on this host.'
exit 2
}
Write-Host "ARM installation found at: $installPath"
# Try to get version from main executable
$exeCandidates = @(
(Join-Path $installPath 'ARM.Server.exe'),
(Join-Path $installPath 'SolarWinds.ARM.Server.exe'),
(Join-Path $installPath 'AccessRightsManager.exe')
)
foreach ($exe in $exeCandidates) {
if (Test-Path $exe) {
try {
$fileVer = (Get-Item $exe).VersionInfo.ProductVersion
if ($fileVer) {
$detectedVersion = $fileVer
Write-Host "Detected version from binary: $fileVer"
break
}
} catch { }
}
}
if (-not $detectedVersion) {
# Attempt to read version from any DLL in install path
$dll = Get-ChildItem -Path $installPath -Filter 'SolarWinds.ARM*.dll' -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1
if ($dll) {
$detectedVersion = $dll.VersionInfo.ProductVersion
Write-Host "Detected version from DLL: $detectedVersion"
}
}
if (-not $detectedVersion) {
Write-Host 'UNKNOWN - ARM installed but version could not be determined. Manual inspection required.'
exit 2
}
Write-Host "ARM Version: $detectedVersion"
# Parse version for comparison
# Vulnerable: <= 2026.2 (i.e., 2026.2.0 and all prior)
# Patched: >= 2026.2.1
try {
# Normalize version string
$cleanVer = $detectedVersion -replace '[^0-9.]', ''
$parts = $cleanVer.Split('.')
$major = [int]$parts[0]
$minor = if ($parts.Count -ge 2) { [int]$parts[1] } else { 0 }
$patch = if ($parts.Count -ge 3) { [int]$parts[2] } else { 0 }
if ($major -lt 2026) {
Write-Host "VULNERABLE - ARM $detectedVersion is below 2026.2.1. CVE-2026-28326 applies."
exit 1
} elseif ($major -eq 2026 -and $minor -lt 2) {
Write-Host "VULNERABLE - ARM $detectedVersion is below 2026.2.1. CVE-2026-28326 applies."
exit 1
} elseif ($major -eq 2026 -and $minor -eq 2 -and $patch -lt 1) {
Write-Host "VULNERABLE - ARM $detectedVersion is below 2026.2.1. CVE-2026-28326 applies."
exit 1
} elseif ($major -ge 2026 -and $minor -ge 2 -and $patch -ge 1) {
Write-Host "PATCHED - ARM $detectedVersion is 2026.2.1 or later. CVE-2026-28326 is fixed."
exit 0
} else {
Write-Host "PATCHED - ARM $detectedVersion appears to be at or above the fixed version."
exit 0
}
} catch {
Write-Host "UNKNOWN - Could not parse version string '$detectedVersion'. Manual verification needed."
exit 2
}- SolarWinds Trust Center Advisory — CVE-2026-28326
- The Hacker News — SolarWinds Patches ARM Hard-Coded Key Flaw Enabling Unauthenticated RCE
- OpenCVE — CVE-2026-28326 Details
- OffSeq Threat Radar — CVE-2026-28326 Live Intelligence
- Strix.ai — CVE-2026-28326 Analysis
- SolarWinds ARM Installation Guide — Deployment Recommendations
- Canadian Centre for Cyber Security — SolarWinds Advisory AV26-549
- Mallory.ai — Unauthenticated RCE Affects SolarWinds ARM
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.