Imagine leaving your master key safe on the sidewalk with the combination taped to the lid — that's what an unpatched BeyondTrust RS appliance is right now
CVE-2026-102764 is an improper origin validation flaw (CWE-290) in an internal messaging component of BeyondTrust Remote Support. Because the component never checks *where* an inbound message actually comes from, an unauthenticated, remote attacker can forge messages that trigger arbitrary file operations on the appliance — including writing a web shell. Exploitation takes seconds: the ARMORY CASTLE campaign went from initial POST request to SAWFLY web shell drop in roughly 11 minutes, then to full root control shortly after. All supported versions through 26.2.3 are affected; the BT26-05-RS patch covers versions 24.3.1 – 26.2.3. Older unsupported branches require a full upgrade before patching.
The vendor rates this CRITICAL at 9.8 (CVSS 3.1) and 9.3 (CVSS 4.0), and for once the vendor severity is dead-on — possibly even underselling it when you factor in the post-exploitation blast radius. This is a network-reachable, zero-click, unauth file-write primitive on an appliance that is *designed* to be internet-facing and that holds or brokers every credential in your privileged session infrastructure. Mandiant's IR confirmed attackers escalated to root, dumped the credential vault via the native bt-secrets CLI, planted reboot-persistent backdoors, modified HAProxy configs for covert tunneling, and pivoted into downstream systems through BeyondTrust's own Jump Item infrastructure. The attack chain requires no authentication, no user interaction, and exploits a low-complexity network vector. There is no daylight between the vendor label and reality.
6 steps from start to impact.
Forge origin on internal messaging component
- Network reachability to the BeyondTrust RS appliance on HTTPS (port 443)
- Appliance running version ≤ 26.2.3 without BT26-05-RS patch
- None meaningful — the appliance is internet-facing by design; Shodan shows ~11,000 exposed instances
Arbitrary file write → web shell drop
/app_84304470%2Ephp, then within ~11 minutes created the primary SAWFLY web shell (mangoapi.php) in the Laravel public directory. SAWFLY uses custom Base32 + RC4 encryption and returns HTTP 404 to any request missing the secret _c94mfe parameter, evading automated scanners.- Successful origin validation bypass (Step 1)
- No additional friction — file write is the direct consequence of the origin bypass
G_Hunting_Webshell_SAWFLY_1 (Google TIG). WAF/reverse-proxy logging for unknown .php paths outside the standard RS path set. IDS signatures for Base32-encoded POST bodies.Privilege escalation via SUID shell
/bin/sh to /usr/bin/dbus-authd, sets root ownership (chown root), and enables the SUID bit (chmod u+s). This gives any execution of dbus-authd root-level privileges. The binary name mimics a legitimate D-Bus component to avoid casual detection.- Web shell execution on appliance (Step 2)
- Ability to write to /usr/bin and invoke chown/chmod (appliance filesystem permissions allow this from the service account context)
- Appliance hardening could theoretically restrict write to /usr/bin, but default BeyondTrust RS appliance configuration permits it
chmod u+s on shell binaries.Credential vault exfiltration
/ns/sbin/bt-secrets get vault to dump the appliance's credential store. This vault contains API secrets, session credentials, endpoint passwords, and any secrets managed through BeyondTrust Vault. The attacker also deletes bt-secrets.log to cover tracks. This single step gives the adversary credentials for every system the appliance manages.- Root-level access on the appliance (Step 3)
- None — bt-secrets is a native appliance utility; there is no secondary auth gate protecting the vault from a root user
bt-secrets outside of scheduled backup windows. Alert on deletion of bt-secrets.log files.Persistence via sudoers template + startup script
/home/bomgar/sbin/post_boot.d/zz-root-persist, a startup script that appends %SITE_SERVICE_ACCOUNT% ALL=(ALL) NOPASSWD: ALL to /ns/config/sudoers.template and invokes bt-sysconfig --no-restart misc to rebuild /etc/sudoers. This survives reboots AND configuration resets because it targets the template, not the active config. Combined with the SUID backdoor, the attacker maintains two independent persistence channels.- Root-level access on the appliance (Step 3)
- Configuration resets do not remove post_boot.d scripts — by design, this directory persists
Lateral movement via Jump Items + BARECLAW tunneling
ingredi_ws), a custom C-based SOCKS5 proxy tunneler using WebSockets, and routes it through the appliance's HAProxy config on a custom /uidchanarge endpoint. This provides a covert tunnel into the internal network that is invisible to external port scans (bound to 127.0.0.1:19800, fronted by HAProxy).- Valid admin credentials from vault dump (Step 4)
- Root access for HAProxy config modification (Step 3)
- Network segmentation downstream of the appliance could limit lateral reach, but the appliance is typically positioned to reach all managed endpoints by design
G_Hunting_Backdoor_BARECLAW_1 (Google TIG). Monitor for user_changed events raising Jump Item roles. Detect unknown WebSocket upgrade paths in HAProxy/reverse proxy logs. Alert on new HAProxy backend configurations./appliance management interface. If running a version below 24.3.1, upgrade to a supported branch first, then patch. SaaS customers were auto-patched by October 9 — confirm via your BeyondTrust portal. Per the noisgate mitigation SLA for CRITICAL, deploy within 3 days. Given active APT exploitation and KEV listing, treat this as patch immediately, within hours..php paths and WebSocket upgrades to non-standard endpoints. Apply IP allowlisting if your support model permits (e.g., restrict /appliance and /login to corporate VPN ranges). This does NOT fix the vulnerability but raises the bar for exploitation. Deploy within 3 days per noisgate mitigation SLA.mangoapi.php (SAWFLY), dbus-authd SUID binary in /usr/bin, scripts in /home/bomgar/sbin/post_boot.d/, unexpected entries in sudoers.template, HAProxy backend modifications (look for /uidchanarge), and ingredi_ws (BARECLAW). Check web server logs for POST requests to /app_84304470%2Ephp. If ANY indicator is found, treat the appliance as fully compromised — isolate, preserve forensics, and rebuild from a clean patched image. Rotate ALL credentials stored in or brokered by the appliance.- EDR on the appliance — BeyondTrust RS runs on a proprietary Linux-based appliance with no support for third-party endpoint agents. You cannot install CrowdStrike, SentinelOne, or Defender on it.
- Network IDS/IPS signature-based detection — SAWFLY's C2 traffic uses custom Base32 + RC4 encryption over standard HTTPS, making it indistinguishable from legitimate appliance traffic without TLS inspection at the appliance itself.
- Appliance configuration reset — ARMORY CASTLE specifically targeted the sudoers *template* and
post_boot.ddirectory, which survive configuration resets. A reset does NOT remove persistence; only a full rebuild from clean image does. - Disabling the messaging component — The vulnerable messaging subsystem is integral to Remote Support functionality. Disabling it would break the product entirely.
The supporting signals.
| In-the-Wild Exploitation | Confirmed active since August 29, 2026. ARMORY CASTLE (PRC-nexus, formerly UNC5221) exploited this as a zero-day against at least two targets — one BeyondTrust-hosted SaaS instance and one self-hosted appliance. Mandiant/Google TIG published full IR analysis on October 15, 2026. Post-exploitation included root access, credential vault dump, SAWFLY web shell, BARECLAW tunneler, and lateral movement via Jump Items. |
|---|---|
| PoC Availability | No public PoC. Checked pocindex.io, GitHub (CVE-2026-102764), ExploitDB, and Nuclei templates — no repositories or exploit code found as of October 18, 2026. However, the Mandiant/Google TIG report provides sufficient technical detail (HTTP POST to messaging component, file write primitive, SAWFLY web shell mechanics) that a competent attacker could reconstruct a working exploit. Weaponized exploit exists in ARMORY CASTLE's toolkit. |
| EPSS Score | 0.00601 (approximately 60th percentile). This is misleadingly low — EPSS is a 30-day forward-looking probability and has not yet caught up with the confirmed active exploitation. Do not use EPSS to deprioritize this CVE. |
| CISA KEV Status | Listed October 16, 2026 — one day after public disclosure. CISA alert issued same day. Federal agencies bound by BOD 22-01 remediation deadline. |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H — 9.8 CRITICAL. Network-reachable, low complexity, no privileges required, no user interaction. Full CIA impact. CVSS 4.0 score is 9.3. The vector accurately reflects the attack: unauthenticated remote file write with trivial exploitation conditions. |
| Affected Versions | BeyondTrust Remote Support all versions through 26.2.3. BeyondTrust Privileged Remote Access (PRA) also potentially affected per vendor advisory scope. Unsupported versions below 24.3.1 are vulnerable but have no patch — upgrade required. |
| Fixed Version / Patch | BT26-05-RS patch, applicable to versions 24.3.1 – 26.2.3. SaaS instances were automatically patched by October 9, 2026. Self-hosted customers must apply via /appliance management interface or confirm auto-update applied. Versions < 24.3.1 must upgrade to a supported branch first. |
| Internet Exposure | Shodan identifies approximately ~11,000 internet-facing BeyondTrust RS/PRA instances, including ~8,500 on-premise deployments. The appliance is *architecturally designed* to be internet-facing (it brokers remote support sessions over HTTPS). 75% of Fortune 100 are BeyondTrust customers. |
| Threat Actor Attribution | ARMORY CASTLE (Google/Mandiant designation), formerly UNC5221. Suspected PRC-nexus espionage group active since October 2023. Known for zero-day exploitation of edge appliances — previously exploited Ivanti CVE-2023-46805 and CVE-2024-21887. Deploys custom tooling: SAWFLY (PHP web shell), BARECLAW (C SOCKS5 tunneler). Targets wide range of countries and verticals. |
| Disclosure & Reporting | Exploited in the wild: August 29, 2026. BeyondTrust identified the defect: September 28, 2026. Patch distribution began: before October 15. Public disclosure: October 15, 2026. CISA KEV listing: October 16, 2026. Mandiant/Google TIG report: October 15, 2026. Reported by BeyondTrust internal security and Mandiant incident response. |
Sources.
- Mandiant/Google TIG — ARMORY CASTLE Exploits BeyondTrust (full technical analysis)
- CISA Alert — Urges Patching Critical Vulnerability in BeyondTrust Remote Support
- BeyondTrust Security Advisory BT26-05
- BleepingComputer — BeyondTrust patches zero-day exploited in attacks since August
- The Hacker News — China-Linked Hackers Exploited BeyondTrust Zero-Day
- SecurityWeek — Chinese APT Exploited BeyondTrust Vulnerability as Zero-Day
- SOCRadar — CVE-2026-102764 BeyondTrust Zero-Day Exploited
- Tenable — CVE-2026-102764
Why this verdict
- Zero friction on the network vector: The appliance is internet-facing by design — ~11,000 instances confirmed on Shodan. The attack requires no authentication, no user interaction, and low complexity. There is literally no prerequisite the attacker must overcome beyond TCP reachability to port 443. No friction deduction.
- Confirmed nation-state zero-day exploitation: ARMORY CASTLE has been exploiting this since August 29, 2026 — 47 days before public disclosure. This is not theoretical risk; the exploit is weaponized, tested, and proven against production targets. KEV-listed within 24 hours of disclosure.
- Full chain demonstrated to worst-case outcome: The observed attack chain goes from unauthenticated HTTP request → file write → web shell → root → credential vault dump → persistence → lateral movement to all managed endpoints. Every step was executed in the wild. Time from initial access to root: minutes.
- Role multiplier: BeyondTrust Remote Support is canonically a PAM / privileged remote access appliance. By definition, ≥95% of its installs occupy the high-value role — it IS the credential vault, it IS the remote access broker, it IS the jump server infrastructure. Compromise of a single RS appliance yields: (1) every credential in the vault, (2) remote session access to every managed endpoint via Jump Items, (3) a covert tunnel into the internal network via BARECLAW. Blast radius is fleet-scale (all managed endpoints) and identity-scale (all stored credentials). This is equivalent to compromising the PAM tier — the verdict floor is CRITICAL per the deployment-role rule, and no friction exists to pull it down.
- No compensating architecture limits blast radius by default: Unlike a vulnerability in a general-purpose OS where segmentation might limit impact, the BeyondTrust appliance is *designed* to have broad network reach to managed endpoints. Network segmentation downstream does not help because the appliance's legitimate function requires that connectivity.
Why not higher?
There is no severity level above CRITICAL. A 9.8 CVSS 3.1 score is the maximum practical score for this vector class. The only theoretical increase would be Scope change (S:C), but the appliance itself is the security boundary being violated — downstream pivot is post-exploitation lateral movement, not a scope change in CVSS terms.
Why not lower?
Every friction-reducing factor is absent here. The appliance is internet-facing by design (no 'requires internal access' deduction). The attack is unauthenticated (no 'requires valid credentials' deduction). No user interaction is needed (no 'requires phishing' deduction). Complexity is low (no 'requires race condition' deduction). The target is a PAM appliance by definition, so the high-value-role floor is CRITICAL with no installed-base exception possible. Active exploitation by a capable nation-state APT with demonstrated full-chain compromise removes any theoretical-only discount. There is no defensible argument for anything below CRITICAL.
Crowdsourced verification payload.
Run this script from an auditor workstation with curl and network access to each BeyondTrust RS appliance. Pass the appliance FQDN as the argument: bash check_cve_2026_102764.sh appliance.example.com. No authentication is required — it performs a remote version fingerprint via the public login page. For IOC checks, SSH access to the appliance as root is required (uncomment the IOC section).
#!/usr/bin/env bash
# check_cve_2026_102764.sh — BeyondTrust Remote Support CVE-2026-102764 checker
# Usage: bash check_cve_2026_102764.sh <appliance-fqdn>
# Exit codes: 1=VULNERABLE, 0=PATCHED, 2=UNKNOWN
set -euo pipefail
if [ $# -lt 1 ]; then
echo "Usage: $0 <appliance-fqdn>"
exit 2
fi
TARGET="$1"
URL="https://${TARGET}/login"
echo "[*] Checking BeyondTrust Remote Support at ${TARGET}..."
# Fetch login page and look for version string
RESPONSE=$(curl -sk --connect-timeout 10 --max-time 15 "${URL}" 2>/dev/null || true)
if [ -z "$RESPONSE" ]; then
echo "[!] Could not reach ${URL}"
echo "UNKNOWN"
exit 2
fi
# BeyondTrust RS login pages typically expose version in page source or headers
# Look for version patterns like 26.2.3, 24.3.1, etc.
VERSION=$(echo "$RESPONSE" | grep -oP '(?:version|build|product.version)[":\s]*([0-9]+\.[0-9]+\.[0-9]+)' | grep -oP '[0-9]+\.[0-9]+\.[0-9]+' | head -1)
# Also check Server header and X-headers
HEADERS=$(curl -skI --connect-timeout 10 --max-time 15 "${URL}" 2>/dev/null || true)
HDR_VERSION=$(echo "$HEADERS" | grep -oiP '(?:x-app-version|x-build)[:\s]*([0-9]+\.[0-9]+\.[0-9]+)' | grep -oP '[0-9]+\.[0-9]+\.[0-9]+' | head -1)
DETECTED_VERSION="${VERSION:-$HDR_VERSION}"
if [ -z "$DETECTED_VERSION" ]; then
echo "[!] Could not extract version from login page."
echo "[*] Manual check required: log into ${TARGET}/appliance and check Status > Software Version."
echo "[*] Vulnerable if version <= 26.2.3 without BT26-05-RS patch."
echo "UNKNOWN"
exit 2
fi
echo "[*] Detected version: ${DETECTED_VERSION}"
# Compare versions — vulnerable if <= 26.2.3
# Note: presence of version alone doesn't confirm patch status;
# BT26-05-RS is a hotfix that may not change the base version string.
IFS='.' read -r MAJ MIN PAT <<< "$DETECTED_VERSION"
if [ "$MAJ" -lt 24 ]; then
echo "[!] Version ${DETECTED_VERSION} is BELOW supported range (24.3.1+)."
echo "[!] No patch available for this version — upgrade required."
echo "VULNERABLE"
exit 1
elif [ "$MAJ" -eq 24 ] && [ "$MIN" -lt 3 ]; then
echo "[!] Version ${DETECTED_VERSION} is BELOW supported range (24.3.1+)."
echo "VULNERABLE"
exit 1
elif [ "$MAJ" -gt 26 ]; then
echo "[+] Version ${DETECTED_VERSION} is above the affected range."
echo "PATCHED"
exit 0
elif [ "$MAJ" -eq 26 ] && [ "$MIN" -gt 2 ]; then
echo "[+] Version ${DETECTED_VERSION} is above 26.2.x — likely patched."
echo "PATCHED"
exit 0
elif [ "$MAJ" -eq 26 ] && [ "$MIN" -eq 2 ] && [ "$PAT" -gt 3 ]; then
echo "[+] Version ${DETECTED_VERSION} is above 26.2.3 — likely patched."
echo "PATCHED"
exit 0
else
echo "[!] Version ${DETECTED_VERSION} is in the vulnerable range (<= 26.2.3)."
echo "[!] Check /appliance > Updates to confirm BT26-05-RS patch is installed."
echo "[*] If BT26-05-RS is listed in installed patches, the appliance is PATCHED."
echo "[*] If BT26-05-RS is NOT listed, the appliance is VULNERABLE."
echo "VULNERABLE"
exit 1
fi