Someone left the drawbridge mechanism unlocked, and the invaders are already inside the gatehouse
CVE-2026-94127 is a heap-based buffer overflow in the F5 BIG-IP APM OAuth UserInfo handler (/f5-oauth2/v1/userinfo). The handler allocates a fixed 0x4100-byte (16,640-byte) buffer for the HTTP Authorization header but copies the attacker-supplied value without enforcing that limit. An oversized header corrupts adjacent heap memory, overwrites a callback pointer at buffer + 0x4ff8, and hands control to the attacker via a ROP chain. The chain modifies /etc/bigstart/scripts/tmm.finish, and when TMM crashes (triggered by the overflow itself), BIG-IP executes the modified script as root, bypassing SELinux. No authentication, no valid token, no user interaction required. Affected branches: BIG-IP APM 17.1.0–17.1.3, 17.5.0–17.5.1, and 21.1.0. Deployments using APM only as an OAuth *Client* or *Resource Server* — without an OAuth Authorization Server profile on the virtual server — are not vulnerable.
F5's vendor severity of CRITICAL / 9.8 is accurate and, if anything, undersells the operational urgency. The CVSS vector AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H is correct: the attack is unauthenticated, low-complexity, network-reachable, and yields full host compromise. The configuration prerequisite (APM + OAuth AS profile) narrows the *population* of vulnerable devices, but it does not increase *attack complexity* — the attacker simply needs to hit the right endpoint on the right virtual server, and that endpoint is on the data plane (internet-facing by design). With 14,700+ exposed instances per Shadowserver, confirmed in-the-wild exploitation on day zero, a CISA three-day remediation deadline, and F5 BIG-IP's role as a network perimeter appliance routing all inbound traffic, the vendor score matches reality. This is the worst kind of network-edge RCE: pre-auth, data-plane, actively exploited, and the device sits in front of everything else.
5 steps from start to impact.
Identify target virtual server with APM OAuth AS
http.favicon.hash for F5 login pages, or probing /f5-oauth2/v1/userinfo directly). Shadowserver data shows 14,700+ exposed BIG-IP APM instances. The attacker needs only one that returns a valid OAuth error response from the UserInfo endpoint to confirm the target is running an OAuth Authorization Server profile.- Internet-facing BIG-IP APM virtual server
- APM access policy AND OAuth profile configured on the virtual server
- APM operating as OAuth Authorization Server
- Not all BIG-IP deployments use APM
- Not all APM deployments use OAuth Authorization Server profiles
- Some enterprises restrict APM OAuth endpoints via iRules or external WAFs
/f5-oauth2/v1/userinfo from scanning infrastructure. GreyNoise may tag scanning IPs.Send oversized Authorization header to UserInfo endpoint
/f5-oauth2/v1/userinfo with an Authorization header exceeding 16,640 bytes. The TMM (Traffic Management Microkernel) data-plane process copies the header into the fixed 0x4100-byte heap buffer without bounds checking. This corrupts adjacent heap metadata and overwrites a callback function pointer located at buffer + 0x4ff8. No authentication token, session cookie, or valid credential of any kind is required — the overflow occurs before any authentication logic executes.- Network connectivity to the virtual server's data-plane port (typically 443)
- A WAF or IPS inspecting HTTP headers for anomalous length could block this, but the BIG-IP itself IS often the WAF
- Some L7 proxies upstream might truncate oversized headers, but this is uncommon in front of BIG-IP
/var/log/ltm and repeated invalid_token failures in /var/log/apm from a single source IP.Hijack execution via ROP chain
/etc/bigstart/scripts/tmm.finish. This script is executed by the system whenever TMM terminates — and the overflow itself causes TMM to crash with SIGABRT, triggering execution.- Successful heap corruption from step 2
- Knowledge of TMM binary layout for ROP gadgets (static across a version — no ASLR in TMM context)
- ASLR is not effective in the TMM process context, reducing the difficulty of reliable exploitation
- The tmm.finish script execution path bypasses SELinux enforcement
/etc/bigstart/scripts/tmm.finish would catch the modification. Auditd rules for writes to /etc/bigstart/scripts/ directory. Unexpected TMM core dumps with SIGABRT in /var/log/ltm.Achieve root-level command execution on BIG-IP
tmm.finish as root. The attacker's injected commands run with full system privileges on the appliance. From here, the attacker has unrestricted access to the BIG-IP configuration, SSL private keys, session tokens, credential stores, and the internal network segments the BIG-IP bridges. Post-exploitation typically involves installing a persistent backdoor, exfiltrating TLS certificates and APM session credentials, and pivoting into the internal network.- Successful ROP chain execution from step 3
- None — once the ROP chain fires, the lifecycle script runs automatically on TMM crash
tmsh audit. Suspicious commands in /var/log/audit. New or modified files in /etc/bigstart/scripts/. SOC should alert on any BIG-IP initiating connections to external IPs not in approved NTP/DNS/update lists.Pivot into internal network and exfiltrate secrets
- Root access on BIG-IP from step 4
- Internal network segmentation may limit lateral movement from the BIG-IP VLAN
- East-west firewalls or microsegmentation may restrict BIG-IP's internal reach
/f5-oauth2/v1/userinfo to known OAuth client IP ranges only. This reduces the attack surface from the entire internet to a whitelist. However, if the OAuth AS serves public-facing SSO, this control may not be feasible without breaking functionality.tmsh modify ltm virtual <name> profiles delete { <oauth-profile> }. This eliminates the vulnerable code path entirely. Confirm with tmsh list apm oauth server that no OAuth AS profiles remain on data-plane virtual servers. Obviously this breaks OAuth AS functionality — evaluate business impact before applying./var/log/ltm for TMM SIGABRT crashes, (2) /var/log/apm for 10+ invalid_token failures from a single IP, (3) /etc/bigstart/scripts/tmm.finish for unauthorized modifications — compare against a known-good baseline or freshly installed system, (4) /var/log/audit for suspicious command execution, (5) outbound connections from the BIG-IP to unexpected external IPs. Perform this triage today, concurrent with patching.- Upstream WAF header-length rules — In most enterprise deployments, the BIG-IP IS the WAF. There is no upstream L7 inspection point to truncate oversized Authorization headers. If you have a CDN in front (Cloudflare, Akamai), its header-length limits *may* help, but this is not a reliable control because CDN header limits vary and may not apply to Authorization headers specifically.
- BIG-IP management plane lockdown (port 443 on mgmt interface) — This vulnerability is on the data plane, not the management plane. Restricting management GUI access to a jump box does nothing; the attack targets the production virtual server port that must remain open for application traffic.
- TLS client certificate authentication — The heap overflow fires during HTTP header parsing, before any TLS client cert validation occurs at the application layer. mTLS on the virtual server does not prevent exploitation.
- Rate limiting OAuth endpoints — The exploit requires only a single malicious request. Rate limiting will not prevent a one-shot heap overflow.
The supporting signals.
| In-the-Wild Status | Actively exploited. F5 confirmed exploitation at disclosure (2026-09-22). CISA added to KEV same day with a 3-day federal remediation deadline (2026-09-25) under BOD 26-04. No specific threat actor attributed — F5 states exploitation is not linked to a named state-sponsored group, ransomware operation, or commercial surveillance vendor. |
|---|---|
| PoC Availability | No public weaponized exploit. FurkanKAYAPINAR/CVE-2026-94127 on GitHub contains a detection/remediation tool only — not an exploit. Listed on Sploitus as a PoC but confirmed defensive-only. Technical writeup by S. Kheirkhah of watchTowr Labs (2026-09-23) documents the overflow primitive, ROP chain, and tmm.finish persistence mechanism — sufficient detail for a skilled attacker to reproduce. Expect weaponized PoCs within days from hotfix reverse-engineering. |
| EPSS | 0.02226 (2.23%) — 97th+ percentile. High for a vulnerability this fresh. EPSS will likely climb as exploitation broadens and PoC code circulates. |
| KEV Status | Listed 2026-09-22. Due date: 2026-09-25 (3 days). BOD 26-04 forensic triage required for affected federal systems. |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H — 9.8. CVSS v4.0 score: 9.3. Every base metric is at maximum severity. Network-reachable, no auth, no interaction, full CIA impact. The S:U (Unchanged scope) is technically conservative — a compromised BIG-IP impacts everything behind it, which arguably warrants S:C. |
| Affected Versions | BIG-IP APM 17.1.0 – 17.1.3, 17.5.0 – 17.5.1, 21.1.0. Only when configured with an APM access policy + OAuth Authorization Server profile on a virtual server. OAuth Client/Resource Server-only configs are not affected. |
| Fixed Versions | Engineering hotfixes: Hotfix-BIGIP-21.1.0.2.0.30.22-ENG.iso (21.1.x), Hotfix-BIGIP-17.5.1.9.0.160.12-ENG.iso (17.5.x), Hotfix-BIGIP-17.1.3.5.0.41.14-ENG.iso (17.1.x). These are engineering hotfixes requiring F5 Support access — not standard point releases. A vendor-provided iRule is available as a temporary mitigation (contact F5 Support to obtain it). |
| Internet Exposure | Shadowserver: 14,700+ internet-facing BIG-IP APM instances as of disclosure week. This is raw exposure — not all will have OAuth AS configured, but the attack surface is substantial. The vulnerable endpoint (/f5-oauth2/v1/userinfo) is on the data plane, meaning it's reachable on the same port as production traffic (typically 443). |
| Disclosure & Discovery | Disclosed 2026-09-22 by F5 (advisory K000162605). F5 states internal discovery. Technical analysis published 2026-09-23 by S. Kheirkhah, watchTowr Labs, detailing the 0x4100-byte buffer, callback pointer corruption, ROP chain, and tmm.finish persistence vector. |
| Detection Coverage | F5 diagnostic: tmsh show sys version + tmsh list apm oauth server to identify affected configs. Post-exploitation indicators: TMM SIGABRT crashes in /var/log/ltm, 10+ invalid_token failures from same IP in /var/log/apm, writes to /etc/bigstart/scripts/tmm.finish, suspicious commands in /var/log/audit. No public Nuclei template or Metasploit module yet. Qualys/Tenable/Rapid7 plugin coverage expected within days of disclosure. |
Sources.
- F5 Advisory K000162605
- CISA KEV Catalog Entry
- Picus Security — CVE-2026-94127 Heap Overflow Explained
- SOCPrime — CVE-2026-94127 Zero-Day Analysis
- SecPod — F5 BIG-IP APM Zero-Day Under Active Exploitation
- Tech Insider — F5 BIG-IP Zero-Day CVE-2026-94127
- FurkanKAYAPINAR/CVE-2026-94127 Detection Tool (GitHub)
- CISA Alert — Four KEV Additions (2026-09-22)
Why this verdict
- Unauthenticated pre-auth RCE on data plane: The attack requires zero credentials — the heap overflow fires before any authentication logic. The CVSS vector AV:N/AC:L/PR:N/UI:N reflects reality: any host that can reach the virtual server on port 443 can trigger the overflow. No upstream WAF or proxy reliably truncates headers to block this, and the BIG-IP itself is typically the outermost Layer 7 inspection point.
- Active exploitation with KEV listing and 3-day federal deadline: This is not theoretical. F5 confirmed exploitation at disclosure, and CISA's unprecedented 3-day remediation deadline (vs. the typical 21 days) signals that intelligence agencies assessed imminent, broad exploitation. The EPSS of 2.23% at disclosure is already 97th+ percentile and will rise as weaponized PoCs emerge from hotfix diff analysis.
- Configuration prerequisite is real but does not downgrade severity: The vuln requires APM + OAuth Authorization Server profile — not all BIG-IP deployments have this. However, this narrows the *population*, not the *complexity*. For any device that does have the config, the attack is trivially reachable on the data plane. The configuration is not obscure; OAuth AS is a core APM use case for SSO federation.
- Role multiplier: F5 BIG-IP is a canonical network edge appliance. BIG-IP sits at the perimeter by design — ≥80% of BIG-IP installs are internet-facing, and the device bridges external traffic to internal application tiers. A compromised BIG-IP gives the attacker: (1) all TLS private keys for terminated connections, (2) cleartext inspection of all traffic, (3) APM session tokens and SSO credentials, (4) a pivot point into every internal VLAN the device bridges. The blast radius is fleet-scale: one compromised BIG-IP can compromise every application and user behind it. This is definitionally a high-value-role component where the verdict floor is CRITICAL.
- 14,700+ exposed instances per Shadowserver: The internet-facing attack surface is massive. Even if only 20-30% of those run OAuth AS configs, that's 3,000-4,500 directly exploitable appliances sitting in front of enterprise production environments, healthcare systems, financial services, and government networks.
Why not higher?
The CVSS scale maxes at 10.0, and 9.8 with Scope:Unchanged is already at the ceiling. A case could be made for Scope:Changed (compromising the BIG-IP compromises everything behind it), which would push toward 10.0, but F5's Scope:Unchanged assessment is defensible since the initial code execution is confined to the BIG-IP OS itself. There is no higher practical severity than CRITICAL.
Why not lower?
Every downgrade argument fails the floor test. The OAuth AS configuration requirement narrows the population but does not increase attack complexity for affected devices. The lack of a public weaponized PoC is temporary — watchTowr's technical writeup provides sufficient detail for reproduction, and hotfix diffing will yield working exploits imminently. BIG-IP is a canonical network edge appliance; ≥10% of installs are definitionally high-value-role by the component's purpose. Active exploitation, KEV listing, 14,700+ exposed instances, pre-auth data-plane attack vector, and root-level code execution on a perimeter device collectively make any downgrade indefensible.
Crowdsourced verification payload.
Run this script on each BIG-IP appliance via SSH as root (or via tmsh run util bash). Usage: bash check_cve_2026_94127.sh. It checks the running BIG-IP version against affected ranges, verifies whether an OAuth Authorization Server profile is configured on any virtual server, and inspects tmm.finish for signs of tampering.
#!/bin/bash
# check_cve_2026_94127.sh — CVE-2026-94127 Vulnerability & Compromise Check
# Run on BIG-IP appliance as root. Outputs: VULNERABLE / PATCHED / UNKNOWN
# Exit codes: 2=VULNERABLE, 0=PATCHED, 1=UNKNOWN
set -euo pipefail
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
# Get BIG-IP version
VERSION=$(tmsh show sys version | grep -oP 'Version\s+\K[0-9]+\.[0-9]+\.[0-9]+' | head -1 2>/dev/null || echo "")
if [ -z "$VERSION" ]; then
echo -e "${YELLOW}[UNKNOWN]${NC} Could not determine BIG-IP version. Is this a BIG-IP system?"
exit 1
fi
echo "[*] BIG-IP Version: $VERSION"
# Check if version is in affected range
AFFECTED=0
case "$VERSION" in
17.1.[0-3]*) AFFECTED=1; BRANCH="17.1.x" ;;
17.5.[0-1]*) AFFECTED=1; BRANCH="17.5.x" ;;
21.1.0*) AFFECTED=1; BRANCH="21.1.x" ;;
*) AFFECTED=0 ;;
esac
if [ "$AFFECTED" -eq 0 ]; then
echo -e "${GREEN}[PATCHED]${NC} Version $VERSION is not in an affected branch (17.1.0-17.1.3, 17.5.0-17.5.1, 21.1.0)."
exit 0
fi
echo -e "${YELLOW}[*]${NC} Version $VERSION is in affected branch $BRANCH."
# Check for engineering hotfix
HOTFIX=$(tmsh show sys version | grep -i 'Hotfix' | head -1 || echo "")
if echo "$HOTFIX" | grep -qiE '(21\.1\.0\.2\.0\.30\.22|17\.5\.1\.9\.0\.160\.12|17\.1\.3\.5\.0\.41\.14)'; then
echo -e "${GREEN}[PATCHED]${NC} Engineering hotfix detected: $HOTFIX"
exit 0
fi
# Check for OAuth Authorization Server profile on virtual servers
echo "[*] Checking for OAuth Authorization Server profiles on virtual servers..."
OAUTH_AS=$(tmsh list apm oauth server 2>/dev/null || echo "")
if [ -z "$OAUTH_AS" ] || echo "$OAUTH_AS" | grep -q "was not found"; then
echo -e "${GREEN}[PATCHED]${NC} No OAuth Authorization Server profiles found. Version $VERSION is affected but configuration is not vulnerable."
echo " Note: Re-check if OAuth AS profiles are added in the future."
exit 0
fi
echo -e "${RED}[VULNERABLE]${NC} BIG-IP $VERSION with OAuth Authorization Server profile(s) detected."
echo " Affected OAuth AS config:"
echo "$OAUTH_AS" | head -20
# Compromise indicators
echo ""
echo "[*] Checking for compromise indicators..."
TMM_FINISH="/etc/bigstart/scripts/tmm.finish"
if [ -f "$TMM_FINISH" ]; then
FINISH_HASH=$(md5sum "$TMM_FINISH" | awk '{print $1}')
FINISH_MTIME=$(stat -c '%y' "$TMM_FINISH" 2>/dev/null || stat -f '%Sm' "$TMM_FINISH" 2>/dev/null)
echo " tmm.finish hash: $FINISH_HASH"
echo " tmm.finish mtime: $FINISH_MTIME"
# Check for suspicious content (non-standard entries)
if grep -qiE '(curl|wget|nc |ncat|bash -i|/dev/tcp|python|perl|ruby|base64)' "$TMM_FINISH" 2>/dev/null; then
echo -e " ${RED}[!] SUSPICIOUS CONTENT in tmm.finish — possible post-exploitation tampering!${NC}"
fi
fi
# Check for TMM crashes
SIGABRT_COUNT=$(grep -c 'SIGABRT' /var/log/ltm 2>/dev/null || echo "0")
if [ "$SIGABRT_COUNT" -gt 0 ]; then
echo -e " ${YELLOW}[!] $SIGABRT_COUNT SIGABRT entries in /var/log/ltm — review for exploitation attempts.${NC}"
fi
# Check for OAuth brute patterns
INVALID_TOKEN=$(grep -c 'invalid_token' /var/log/apm 2>/dev/null || echo "0")
if [ "$INVALID_TOKEN" -gt 10 ]; then
echo -e " ${YELLOW}[!] $INVALID_TOKEN invalid_token entries in /var/log/apm — review source IPs.${NC}"
fi
echo ""
echo -e "${RED}VULNERABLE${NC} — Apply hotfix for $BRANCH immediately. See F5 K000162605."
exit 2