Skip to main content

free5GC AUSF CVE-2026-55784

HIGH
Race Condition (CWE-362)
2026-08-28 https://github.com/free5gc/free5gc GHSA-334q-h5g3-fpxv
7.5
CVSS 3.1 · Vendor: https://github.com/free5gc/free5gc
Share

Severity by source

Vendor (https://github.com/free5gc/free5gc) PRIMARY
7.5 HIGH
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
vuln.today AI
7.5 HIGH

Default AUSF binds to 0.0.0.0 with OAuth2 disabled, enabling unauthenticated network access; impact is pure availability DoS with no confidentiality or integrity exposure.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (https://github.com/free5gc/free5gc).

CVSS VectorVendor: https://github.com/free5gc/free5gc

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
None
Availability
High

Lifecycle Timeline

3
Source Code Evidence Fetched
Aug 28, 2026 - 22:52 vuln.today
Analysis Generated
Aug 28, 2026 - 22:52 vuln.today
CVE Published
Aug 28, 2026 - 22:24 github-advisory
HIGH 7.5

DescriptionCVE.org

Summary

The AUSF component of free5GC stores per-subscriber authentication state in a global sync.Map keyed only by SUPI. Every incoming authentication request creates a new AusfUeContext and stores it under that SUPI key without checking whether an authentication procedure is already in progress and without generating a per-session unique identifier.

An attacker with access to the AUSF SBI/N12 interface can send concurrent POST /nausf-auth/v1/ue-authentications requests for the same target SUPI. Each request is accepted and overwrites the previous authentication context. A valid EAP-AKA' response for an earlier challenge is then verified against the latest overwritten context, whose K_aut, XRES, and EapID no longer match the challenge. The result is a targeted authentication denial of service for that SUPI while the request flood is maintained.

This issue was confirmed on github.com/free5gc/ausf v1.4.4 and current main as of June 2026.

Details

The vulnerable context pool is defined in internal/context/context.go.

UePool is a sync.Map, which makes individual map operations safe, but it does not make the authentication procedure state safe. The problem is the session design: the key is only the SUPI, and Store() unconditionally replaces any active context for that SUPI.

go
type AUSFContext struct {
    suciSupiMap sync.Map
    UePool      sync.Map
    // ...
}

type AusfUeContext struct {
    Supi string
    // ...

    // for EAP-AKA'
    K_aut    string
    XRES     string
    Rand     string
    EapID    uint8
    Resynced bool
}

func NewAusfUeContext(identifier string) (ausfUeContext *AusfUeContext) {
    ausfUeContext = new(AusfUeContext)
    ausfUeContext.Supi = identifier
    return ausfUeContext
}

func AddAusfUeContextToPool(ausfUeContext *AusfUeContext) {
    ausfContext.UePool.Store(ausfUeContext.Supi, ausfUeContext)
}

The vulnerable sequence is executed for every authentication request in internal/sbi/processor/ue_authentication.go:

go
ueid := authInfoResult.Supi
ausfUeContext := ausf_context.NewAusfUeContext(ueid)
ausfUeContext.ServingNetworkName = snName
ausfUeContext.AuthStatus = models.AusfUeAuthenticationAuthResult_ONGOING
ausfUeContext.UdmUeauUrl = udmUrl
ausf_context.AddAusfUeContextToPool(ausfUeContext)

There is no guard such as LoadOrStore, no AUTHENTICATION_IN_PROGRESS response, no rate limit per SUPI, and no unique authentication-session ID in the context URL. For EAP-AKA', the returned context URL is derived directly from the SUCI/SUPI path:

text
/nausf-auth/v1/ue-authentications/{suci}/eap-session

All concurrent authentication attempts for the same subscriber therefore point to the same logical context URL, while the backing AusfUeContext in UePool is repeatedly replaced.

When the EAP response is later processed, the AUSF looks up the current context by SUPI:

go
currentSupi := ausf_context.GetSupiFromSuciSupiMap(eapSessionID)
ausfCurrentContext := ausf_context.GetAusfUeContext(currentSupi)

The EAP-AKA' response is then verified against the current context's K_aut and XRES:

go
K_autStr := ausfCurrentContext.K_aut
XMAC := CalculateAtMAC(K_aut, decodeEapAkaPrimePkt.MACInput)
MAC := decodeEapAkaPrimePkt.Attributes[ausf_context.AT_MAC_ATTRIBUTE].Value
XRES := ausfCurrentContext.XRES
RES := hex.EncodeToString(decodeEapAkaPrimePkt.Attributes[ausf_context.AT_RES_ATTRIBUTE].Value)

if !bytes.Equal(MAC, XMAC) {
    eapOK = false
    eapErrStr = "EAP-AKA' integrity check fail"
} else if XRES == RES {
    logger.AuthELog.Infoln("Correct RES value, EAP-AKA' auth succeed")
    // ...
}

If another request has overwritten the context between challenge issuance and response processing, the legitimate response is checked against the wrong K_aut and fails the AT_MAC verification.

Attack flow

The attack is selective for a target SUPI:

  1. The legitimate procedure starts and the AUSF stores ctx_LEGIT under UePool[target_supi].
  2. The attacker sends many concurrent authentication requests for the same target SUCI/SUPI.
  3. Each request obtains a new authentication vector and stores a new context under the same SUPI key.
  4. ctx_LEGIT is overwritten by ctx_ATTACK.
  5. The legitimate EAP response, computed with K_aut_LEGIT, reaches /eap-session.
  6. The AUSF retrieves ctx_ATTACK by SUPI and computes XMAC with K_aut_ATTACK.
  7. AT_MAC verification fails and the AUSF returns an EAP-AKA' notification failure.

When later contexts carry different session material, a continuous flood prevents the target subscriber from completing authentication because the AUSF's stored context keeps changing before the response is processed.

PoC and evidence

The issue was reproduced in two phases in a controlled free5GC lab.

Phase 1: context overwrite

Experiment:

  • 3 rounds of 8 concurrent POST /nausf-auth/v1/ue-authentications requests.
  • Same target SUCI: suci-0-001-01-0-0-0-0000000002.
  • AUSF listening on 0.0.0.0:8100; PoC connected to 127.0.0.1:8100.

Observed result:

  • 24/24 requests returned HTTP 201.
  • 24 distinct EapIDs were issued:
text
[131, 11, 157, 99, 182, 232, 127, 228, 119, 36, 104, 10,
 107, 61, 66, 26, 110, 9, 210, 202, 53, 224, 237, 86]
  • All responses used the same auth context URL:
text
/nausf-auth/v1/ue-authentications/suci-0-001-01-0-0-0-0000000002/eap-session
  • AUSF logs showed repeated context creation for the same SUCI/SUPI in a short interval:
text
Add SuciSupiPair (suci-0-001-01-0-0-0-0000000002, imsi-001010000000002) to map.
Use EAP-AKA' auth method
| 201 | POST | /nausf-auth/v1/ue-authentications
...

This confirms that concurrent authentication requests for the same SUPI are accepted independently but collapse onto one shared context key.

Phase 2: valid EAP response fails after overwrite

The second PoC used a mock UDM with h2c support that returns different EAP-AKA' vectors by request counter for the same SUCI. This makes the overwrite directly observable:

RequestVector classXRESEffect
1stLEGIT0102030405060708response client computes AT_MAC with K_aut_LEGIT
2nd and laterATTACKdeadbeefcafe0000flood overwrites AUSF context with K_aut_ATTACK

Baseline without flood:

text
POST /ue-authentications
  -> EapID=120, context with K_aut_LEGIT stored

POST /eap-session with AT_MAC(K_aut_LEGIT)
  -> AUSF log: Correct RES value, EAP-AKA' auth succeed
  -> HTTP 200, EAP success

Race condition run:

text
POST /ue-authentications
  -> EapID=243, context with K_aut_LEGIT stored

20 concurrent POST /ue-authentications requests for the same SUCI
  -> 20/20 accepted
  -> K_aut_ATTACK overwrites K_aut_LEGIT in UePool

POST /eap-session with AT_MAC(K_aut_LEGIT)
  -> AUSF validates against K_aut_ATTACK
  -> AUSF log: EAP-AKA' failure: EAP-AKA' integrity check fail
  -> HTTP 200, EAP notification failure

Critical AUSF log excerpt:

text
Add SuciSupiPair (suci-0-001-01-0-0-0-0000000002, imsi-001010000000002) to map.
... repeated for the same SUCI/SUPI ...
EapAuthComfirmRequest
[WARN] EAP-AKA' failure: EAP-AKA' integrity check fail
| 200 | 127.0.0.1 | POST | /nausf-auth/v1/ue-authentications/.../eap-session |

Baseline and attack logs are in the private evidence bundle:

text
hallazgos/finding13-ausf-auth-race/evidencia/20260527-195933-race-condition-p2-final/

The final PoC uses a Python client that constructs a protocol-valid synthetic EAP-AKA' response from known vectors. It is not a full UERANSIM/AMF trace, and the P2 run uses a mock UDM returning distinct LEGIT/ATTACK vectors to make the overwrite observable. The synthetic response is sufficient to prove the AUSF state bug because the baseline succeeds with the same client and vectors, while the flood run fails at the exact AT_MAC check predicted by the code.

Impact

The confirmed impact is targeted denial of authentication service for a chosen SUPI.

An attacker with access to the AUSF SBI/N12 interface can keep a subscriber from authenticating by continuously overwriting that subscriber's AUSF context. The AUSF process remains running; this is not a process crash and does not expose authentication material to the attacker. The availability impact is on the AUSF's primary security function for the targeted subscriber.

In the default free5GC deployment observed in the lab, the AUSF reported OAuth2 disabled and listened on 0.0.0.0:8100. In a production deployment with strict SBI isolation, mTLS, OAuth2, or firewalling, the attacker would need access to the internal SBA network or control of a network function that can send AUSF authentication requests.

Suggested remediation

The most robust fix is to stop using SUPI as the sole authentication-session key.

Recommended design:

  1. Generate a unique session identifier for every authentication request.
  2. Store the AusfUeContext under that session identifier.
  3. Return the session identifier in the auth context URL.
  4. On /eap-session or /5g-aka-confirmation, retrieve the exact session context by session ID rather than by SUPI.

Conceptual example:

go
sessionID := uuid.New().String()
ausfUeContext := ausf_context.NewAusfUeContext(sessionID)
ausfUeContext.Supi = ueid
// populate context...
ausf_context.AddAusfUeContextToPool(ausfUeContext)

// Return:
// /nausf-auth/v1/ue-authentications/{sessionID}/eap-session

If the intended behavior is to allow only one active authentication procedure per SUPI, use an atomic check-and-insert operation and reject concurrent attempts explicitly:

go
if existing, loaded := ausf_context.LoadOrStoreAusfUeContext(ueid, newCtx); loaded {
    if existing.AuthStatus == models.AusfUeAuthenticationAuthResult_ONGOING {
        c.JSON(http.StatusConflict, models.ProblemDetails{
            Status: http.StatusConflict,
            Cause:  "AUTHENTICATION_IN_PROGRESS",
        })
        return
    }
}

A mutex inside AusfUeContext alone is not sufficient if new requests are still allowed to replace the global map entry for the same SUPI.

Additional hardening:

  • Apply per-SUPI rate limiting on POST /ue-authentications.
  • Enable and enforce OAuth2/mTLS for SBI access in deployments.
  • Add tests for concurrent authentication requests targeting the same SUPI.

Prior art / non-duplication note

Known related issues appear to be different:

  • CVE-2026-33063 / GHSA-4jrw-92fg-4jwx affects free5GC AUSF, but concerns a nil interface conversion / DoS in GetSupiFromSuciSupiMap. It does not cover authentication context overwrite by concurrent requests.
  • CVE-2026-44318 affects free5GC BSF and concerns a different concurrency issue in a different NF. It does not cover AUSF UePool authentication state keyed by SUPI.

AnalysisAI

Authentication denial of service in free5GC AUSF v1.4.4 and current main allows an attacker with access to the AUSF SBI/N12 interface to permanently block a target subscriber from completing 5G authentication by flooding the AUSF with concurrent POST /nausf-auth/v1/ue-authentications requests for the same SUPI. Each concurrent request silently overwrites the active EAP-AKA' session context stored under that SUPI key, so the legitimate UE's EAP response is validated against mismatched cryptographic material (K_aut, XRES) and fails AT_MAC verification. …

Unlock full vulnerability intelligence

  • Risk assessment & exploitation conditions
  • Attack chain visualization
  • Remediation with exact patch versions
  • Threat intelligence from 22 sources
  • Personal watchlist & email alerts

Free forever · No credit card required

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata

Recon
technique details hidden
Delivery
technique details hidden
Exploit
technique details hidden
Install
technique details hidden
C2
technique details hidden
Execute
technique details hidden
Impact
technique details hidden

Vulnerability AssessmentAI

Exploitation The attacker must have network access to the AUSF SBI/N12 HTTP interface, which defaults to TCP port 8100 bound on 0.0.0.0. … Additional conditions and limiting factors are described in the full assessment.
Risk Assessment The CVSS 3.1 vector (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H, score 7.5) reflects the default free5GC configuration where OAuth2 is disabled and the AUSF binds to 0.0.0.0:8100, making the SBI endpoint reachable without authentication. … Full risk analysis with EPSS, KEV, and SSVC signal comparison available after sign-in.
Exploit Scenario Full exploit scenario with step-by-step reproduction available after sign-in.
Remediation No vendor-released patch has been identified at time of analysis. … Detailed patch versions, workarounds, and compensating controls in full report.

Recommended ActionAI

Within 24 hours: Identify all free5GC AUSF deployments running versions 1.4.4 or later and assess your network's exposure to the AUSF SBI/N12 interfaces. …

Sign in for detailed remediation steps and compensating controls.

Threat intelligence, references, and detailed analysis are available after sign-in.

More in Python

View all
CVE-2025-24016 CRITICAL POC
9.9 Feb 10

Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t

CVE-2025-27520 CRITICAL POC
9.8 Apr 04

BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser

CVE-2025-2945 CRITICAL POC
9.9 Apr 03

pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi

CVE-2013-5093 MEDIUM POC
6.8 Sep 27

The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python

CVE-2025-32375 CRITICAL POC
9.8 Apr 09

BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica

CVE-2014-0224 HIGH POC
7.4 Jun 05

OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph

CVE-2024-21644 HIGH POC
7.5 Jan 08

pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.

CVE-2026-33017 CRITICAL POC
9.3 Mar 17

Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301

CVE-2017-9462 HIGH POC
8.8 Jun 06

In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse

CVE-2026-39987 CRITICAL POC
9.3 Apr 08

Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/

CVE-2024-21645 MEDIUM POC
5.3 Jan 08

pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne

CVE-2026-55255 HIGH POC
8.4 Jun 19

Cross-user flow execution in Langflow (< 1.9.1) lets any authenticated API-key holder run another user's flow by passing

Share

CVE-2026-55784 vulnerability details – vuln.today

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy