An office building with a locked front door but an unguarded service elevator that talks to anyone in the lobby
O+ Connect ships a local IPC (inter-process communication) endpoint — typically a named pipe, local socket, or COM/LPC interface — used by the privileged service component to take instructions from the user-mode UI. The disclosed flaw (CVE-2026-22078) is that this IPC channel does not authenticate the caller, so any local process running as any user can submit privileged action requests that the service then performs in its own (elevated) security context. Affected builds are everything prior to the vendor-fixed release; check the vendor advisory for the exact branch boundaries, but the CWE-266 classification and AV:L vector are consistent with all shipping versions of the privileged helper being impacted until the patch lands.
Vendor scored this HIGH (7.3). That feels inflated. The vector AV:L/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:H already concedes the attacker must (a) be local on the box, (b) already hold a low-privilege user shell, and (c) get a user to interact with something. The Scope:Changed and Availability:High components push it into HIGH territory, but for a defender managing 10,000 hosts the practical exposure is local privilege escalation on endpoints where a user account is already compromised — that's a MEDIUM in the noisgate model unless O+ Connect is deployed on tier-0 / admin jump hosts, in which case the floor moves up.
5 steps from start to impact.
Attacker obtains a low-privilege foothold on the host
- Code execution as any local user account
- O+ Connect installed with privileged helper service running
- EDR catches the vast majority of commodity loaders before user-mode persistence
- Application allowlisting (WDAC, AppLocker) blocks unsigned local binaries
- Modern Windows token isolation prevents trivial user-to-user pivot
Enumerate the unauthenticated IPC endpoint
- Ability to list local IPC objects (default for any user)
- Knowledge of the IPC method surface (reverse-engineered from the shipping binary)
- Some EDRs flag NtObjectManager / PipeViewer use on production endpoints
- Method surface discovery requires reversing the client binary — non-trivial but a one-time researcher cost
Trigger UI interaction (UI:R)
- Active interactive user session
- User performs the triggering action
- Headless servers and kiosks with no interactive user never satisfy UI:R
- Security-awareness-trained users may decline obvious lures
- Some interpretations of UI:R for IPC bugs are 'an admin must be logged in concurrently' — further narrowing
Invoke the privileged IPC method and escalate
\\.\pipe\<name>.- Steps 1-3 satisfied
- Service running (default on a normal install)
- Even after escalation, EDR catches most post-exploitation tradecraft (token theft, LSASS read)
- Availability:High in the vector suggests the primary outcome may be DoS-of-service rather than full SYSTEM in some method paths — read the advisory carefully
Post-exploitation on a typical endpoint
- Successful local escalation
- Tier-0 administrative accounts should not be cached on user endpoints
- Credential Guard / LSA Protection blunts LSASS-based pivot
- MFA on lateral protocols (RDP, SSH) limits cred-replay reach
- Perimeter firewall / WAF rules — the vulnerability is local-only; no network traffic crosses the perimeter.
- MFA on user logons — the attacker is already inside an authenticated user session by the time this CVE is reachable.
- Disabling the O+ Connect UI — the privileged helper service is the vulnerable component; disabling the UI without uninstalling the service leaves the IPC endpoint listening.
- LSA Protection / Credential Guard — useful for the post-exploitation phase but do not block the LPE primitive itself.
- Network segmentation between hosts — this CVE does not move laterally on its own; segmentation neither helps nor hurts.
The supporting signals.
| In-the-wild exploitation | No public reports as of 2026-06-30. CVE is one day old. |
|---|---|
| Public PoC | None published at time of writing. IPC-auth bugs are typically reproducible in 5–15 lines once method names are known; expect a PoC within 2–6 weeks. |
| EPSS | Not yet scored (CVE is <24h old); expect initial EPSS <1% given local-only vector. |
| KEV status | Not listed. Unlikely to be added given AV:L and no exploitation reports. |
| CVSS vector | AV:L/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:H → local, low-complexity, requires authenticated user + UI interaction; scope-changing impact |
| CWE | CWE-266 — Incorrect Privilege Assignment (here: missing caller authentication on a privileged IPC endpoint) |
| Affected versions | All O+ Connect builds prior to the vendor-fixed release — confirm exact branch boundaries against the vendor advisory |
| Fixed version | Vendor patched build released alongside the 2026-06-29 advisory — vendor advisory is authoritative |
| Exposure data | Not internet-facing. Shodan/Censys/GreyNoise irrelevant. Real exposure is your O+ Connect endpoint install count from your software-inventory tool (SCCM/Intune/Jamf/Tanium). |
| Disclosure / reporter | Coordinated disclosure 2026-06-29; reporter not yet public in vendor advisory |
Sources.
- NVD — CVE-2026-22078 (record placeholder; check for live entry)
- MITRE CVE — CVE-2026-22078
- CWE-266 — Incorrect Privilege Assignment
- CISA Known Exploited Vulnerabilities Catalog
- FIRST EPSS — Exploit Prediction Scoring System
- MITRE ATT&CK T1068 — Exploitation for Privilege Escalation
- James Forshaw — NtObjectManager (IPC enumeration tooling reference)
- Microsoft — Privileged Access Workstations guidance (tier-0 model)
Why this verdict
- Local-only vector (AV:L): Removes the entire unauthenticated-internet attacker population. Real exposure = your installed-base count, not your perimeter.
- Requires existing user foothold (PR:L): This is a privilege amplifier in an active-intrusion chain, not a doorway. Your EDR/initial-access controls are the first and load-bearing line of defense.
- Requires UI interaction (UI:R): Eliminates headless servers and kiosks entirely; further narrows to hosts with active interactive sessions at the moment of attack.
- Role multiplier — typical role (endpoint user app): O+ Connect is an endpoint client. Successful chain → SYSTEM on one workstation. Blast radius = single host. No identity-plane, hypervisor, or CI/CD pivot.
- Role multiplier — high-value role (admin jump host / PAW): If O+ Connect is installed on tier-0 admin workstations, the chain ends in tier-0 credential exposure. This is the worst plausible outcome but is rare by design (PAWs should not run general endpoint apps). Verdict floor stays MEDIUM rather than HIGH because the canonical install base is general endpoints, not PAWs.
- No KEV, no PoC, no in-the-wild reports as of disclosure +1 day. EPSS will start low.
Why not higher?
HIGH would require either (a) internet-facing exposure, (b) no auth/UI prerequisite, or (c) the affected component canonically occupying a high-value role (DC, hypervisor, IdP, CA, backup, kernel agent). None apply: O+ Connect is a user endpoint helper, the chain demands a local foothold AND user interaction, and there is no current evidence of exploitation. If your inventory shows O+ Connect on tier-0 admin workstations, treat THOSE hosts as HIGH and patch in the 30-day window — but the population-wide verdict is MEDIUM.
Why not lower?
LOW would require either no real privilege boundary crossed or a vanishingly small affected population. Neither is true: Scope:Changed and Availability:High in the vector confirm a meaningful privilege boundary is broken, and any commodity malware that lands on a user endpoint can chain this for SYSTEM. IGNORE is wrong because the bug is a real, weaponizable LPE primitive once a PoC drops.
Crowdsourced verification payload.
Run on each target Windows endpoint with local administrator privileges (needed to read the service binary version). Invoke as .\Check-CVE-2026-22078.ps1 -FixedVersion '<vendor-fixed-version>' — replace the placeholder with the exact build string from the O+ Connect advisory. Deploy via Intune, SCCM, or your config-mgmt agent and aggregate results centrally. Outputs VULNERABLE, PATCHED, or UNKNOWN.
#requires -RunAsAdministrator
# Check-CVE-2026-22078.ps1
# Detects vulnerable O+ Connect installations on Windows endpoints.
# Exit codes: 0 = PATCHED, 1 = VULNERABLE, 2 = UNKNOWN / not installed
param(
[Parameter(Mandatory=$true)]
[string]$FixedVersion
)
$ErrorActionPreference = 'Stop'
function Write-Status([string]$s, [int]$code) {
Write-Output $s
exit $code
}
# 1. Locate the service. Adjust ServiceName / DisplayName glob to match the vendor's installed service.
$svc = Get-CimInstance Win32_Service -Filter "Name LIKE '%OPlusConnect%' OR Name LIKE '%O+Connect%' OR DisplayName LIKE '%O+ Connect%'" -ErrorAction SilentlyContinue | Select-Object -First 1
if (-not $svc) {
Write-Status 'UNKNOWN - O+ Connect service not found on this host' 2
}
# 2. Pull binary version from the service ImagePath.
$imagePath = $svc.PathName -replace '^"([^"]+)".*$', '$1' -replace '^(\S+).*$', '$1'
if (-not (Test-Path $imagePath)) {
Write-Status "UNKNOWN - service binary path not resolvable: $imagePath" 2
}
$installed = (Get-Item $imagePath).VersionInfo.FileVersion
if (-not $installed) {
Write-Status 'UNKNOWN - could not read FileVersion from service binary' 2
}
# 3. Compare installed vs fixed version.
try {
$installedV = [version]($installed -replace '[^0-9\.].*$', '')
$fixedV = [version]($FixedVersion -replace '[^0-9\.].*$', '')
} catch {
Write-Status "UNKNOWN - version string parse failed (installed=$installed, fixed=$FixedVersion)" 2
}
if ($installedV -ge $fixedV) {
Write-Status "PATCHED - installed=$installed >= fixed=$FixedVersion" 0
} else {
Write-Status "VULNERABLE - installed=$installed < fixed=$FixedVersion (CVE-2026-22078)" 1
}