← Back to Feed CACHED · 2026-09-20 10:39:36 · CACHE_KEY CVE-2026-28326
CVE-2026-28326 · CWE-321 · Disclosed 2026-09-17

SolarWinds Access Rights Manager was reported to be affected by an unauthenticated remote code execution…

ASSESSED — NOISGATE
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

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.

"Hardcoded key in your AD rights manager is a post-breach skeleton key to the domain"
02 · The Attack Path

5 steps from start to impact.

STEP 01

Gain internal network position

The attacker must first compromise a host on the same network segment as the ARM server, or already have internal access (VPN, rogue device, compromised workstation). The CVSS vector specifies AV:A, meaning the attacker must be on the adjacent network — not the public internet. ARM is explicitly documented by SolarWinds as a product that should never be internet-facing.
Conditions required:
  • Internal network access or same VLAN/subnet as the ARM server
  • Prior initial access via phishing, VPN compromise, or physical access
Where this breaks in practice:
  • Requires a preceding compromise stage — this is a post-initial-access attack
  • Network segmentation (if properly implemented) limits reachable hosts
Detection/coverage: Network IDS/IPS monitoring east-west traffic; NAC solutions detecting rogue devices on management VLANs
STEP 02

Extract or obtain the hard-coded key

The attacker obtains the static cryptographic key embedded in the ARM binary. Because this is CWE-321, the key is identical across all installations of the same version. It can be extracted by reverse-engineering the ARM binary, diffing the 2026.2 → 2026.2.1 patch, or referencing a future public disclosure. No authentication is needed to extract the key — only access to a copy of the software.
Conditions required:
  • Access to any copy of the ARM binary (installer, existing compromised host, or public download)
Where this breaks in practice:
  • No public PoC or key extraction tool exists as of 2026-09-20
  • Requires reverse engineering skill or a published advisory with key details
STEP 03

Craft weaponized request using the key

With the static key in hand, the attacker crafts a network request to the ARM service that leverages the hard-coded cryptographic material to bypass authentication. Because 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.
Conditions required:
  • Network reachability to ARM service port
  • Knowledge of the hard-coded cryptographic key
Where this breaks in practice:
  • Without the key, this step is blocked entirely
  • ARM's service ports may be firewalled to specific management hosts
Detection/coverage: Application-layer IDS rules for ARM protocol anomalies; SolarWinds ARM audit logs (if enabled)
STEP 04

Achieve SYSTEM-level code execution on ARM server

The ARM service typically runs as SYSTEM or under a high-privilege service account. Successful exploitation grants the attacker arbitrary code execution at this privilege level. This is the foothold — the attacker now controls the ARM server process and its credentials.
Conditions required:
  • Successful exploitation from Step 3
Where this breaks in practice:
  • EDR/AV on the ARM server may detect post-exploitation activity
  • Application allowlisting may block attacker payloads
Detection/coverage: EDR behavioral detection of child process spawning from ARM service; Windows event logs for unusual service account activity
STEP 05

Pivot to Active Directory via ARM service accounts

ARM's service accounts are configured with delegated rights to read and modify AD permissions, file server ACLs, and SharePoint access controls. The attacker harvests these credentials from memory (e.g., via Mimikatz or LSASS dump) or uses the ARM application itself to directly modify access rights across the domain. This converts a single-host compromise into domain-wide access rights manipulation — effectively a privilege escalation to Domain Admin equivalent.
Conditions required:
  • ARM service account has the delegated AD permissions it was designed to have
  • Attacker has SYSTEM on the ARM host
Where this breaks in practice:
  • Credential Guard / LSA protection may limit credential harvesting
  • Tiered administration model may limit service account scope (rare in practice)
Detection/coverage: AD audit logs for permission changes; SIEM correlation of ARM service account activity; MDI (Microsoft Defender for Identity) detecting unusual directory service operations
03 · Intelligence Metadata

The supporting signals.

In-the-Wild ExploitationNone reported. SolarWinds advisory makes no mention of exploitation. No CISA alerts or threat intel reports reference active campaigns targeting CVE-2026-28326.
Proof-of-ConceptNo 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 Score0.00548 (0.548%) — approximately 55th percentile. Low predicted exploitation probability, consistent with the adjacent-network requirement and absence of public tooling.
KEV StatusNot listed in CISA's Known Exploited Vulnerabilities catalog as of 2026-09-20.
CVSS VectorCVSS: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 VersionsSolarWinds Access Rights Manager ≤ 2026.2 (all prior versions affected)
Fixed VersionARM 2026.2.1 (released 2026-09-17). No distro backports apply — ARM is a proprietary Windows application distributed directly by SolarWinds.
Scanning/ExposureARM 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 Date2026-09-17 — SolarWinds coordinated disclosure. Only 3 days old at time of assessment.
Reporting ResearcherKai 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).
04 · The Call

Final Verdict
= UNCHANGED to HIGH (8.0/10)

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.

05 · Compensating Control

What to do — in priority order.

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
What doesn't work
  • 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.
06 · Verification

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.

noisgate-verify.ps1
POWERSHELLREAD-ONLYSAFE
#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
}
07 · Sources

Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.