Severity by source
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Unauthenticated network trigger (PR:N per the v4.2.1 auth gap) with low complexity, but Gin recovery keeps the process alive so impact is only per-request degradation, hence A:L not A:H.
Primary rating from GitHub Advisory.
CVSS VectorGitHub Advisory
Lifecycle Timeline
3DescriptionGitHub Advisory
Summary
free5GC's PCF POST /npcf-smpolicycontrol/v1/sm-policies handler (HandleCreateSmPolicyRequest) panics with a nil-pointer dereference when a downstream OpenAPI consumer call (UDR lookup) returns 404 Not Found and the consumer wrapper returns err != nil together with a nil response struct. The handler logs the OpenAPI error and continues executing instead of returning, then dereferences the nil response struct on a subsequent line and panics. Gin recovery converts the panic into HTTP 500, so a single attacker-shaped POST returns 500 instead of a clean 4xx whenever the downstream lookup fails. The PCF process keeps running.
The trigger is a single POST containing input that causes the downstream UDR lookup to fail (e.g. an unknown DNN). In v4.2.1 this endpoint is also reachable WITHOUT an Authorization header because the PCF Npcf_SMPolicyControl route group is mounted without inbound auth middleware (see free5gc/free5gc#844). So in the validation lab the trigger is fully unauthenticated.
Details
Validated against the PCF container in the official Docker compose lab.
- free5GC version:
v4.1.0(originally reported on v4.1.0; same defect present in v4.2.1) - PCF endpoint:
http://10.100.200.9:8000
Vulnerable handler path (paraphrased from the captured stack trace):
[INFO][PCF][SMpolicy] Handle CreateSmPolicy
[ERRO][PCF][Consumer] openapi error: 404, Not Found
[ERRO][PCF][GIN] panic: runtime error: invalid memory address or nil pointer dereference
github.com/free5gc/pcf/internal/sbi/processor.(*Processor).HandleCreateSmPolicyRequest
/go/src/free5gc/NFs/pcf/internal/sbi/processor/smpolicy.go:82 +0x562
github.com/free5gc/pcf/internal/sbi.(*Server).HTTPCreateSMPolicy
/go/src/free5gc/NFs/pcf/internal/sbi/api_smpolicy.go:86 +0x405The handler's UDR-failure branch logs the OpenAPI error but does not return; the next line dereferences the nil response struct.
Code evidence (paths in free5gc/pcf):
- Panic site:
NFs/pcf/internal/sbi/processor/smpolicy.go:82- Route dispatch:
NFs/pcf/internal/sbi/api_smpolicy.go:86
PoC
Reproduced end-to-end against the running PCF at http://10.100.200.9:8000.
Send a single POST whose dnn is unknown to UDR -- this drives the downstream OpenAPI call to return 404 Not Found, which then triggers the nil-deref panic:
curl -sS -X POST 'http://10.100.200.9:8000/npcf-smpolicycontrol/v1/sm-policies' \
-H 'Content-Type: application/json' \
-d '{
"supi":"imsi-208930000000003",
"pduSessionId":1,
"dnn":"internet-bad",
"sliceInfo":{"sst":1,"sd":"010203"},
"servingNetwork":{"mcc":"208","mnc":"93"},
"accessType":"3GPP_ACCESS",
"notificationUri":"http://smf.free5gc.org:8000/npcf-smpolicycontrol/v1/notify"
}'Observed response: HTTP 500 Internal Server Error with empty body.
PCF container logs show:
[INFO][PCF][SMpolicy] Handle CreateSmPolicy
[ERRO][PCF][Consumer] openapi error: 404, Not Found
[ERRO][PCF][GIN] panic: runtime error: invalid memory address or nil pointer dereference
...HandleCreateSmPolicyRequest at smpolicy.go:82...The Gin recovery middleware catches the panic (the captured stack trace runs inside ginRecover.func2.1), so the PCF process keeps serving other requests; the realized impact is per-request HTTP 500 on this endpoint whenever the downstream lookup fails.
Impact
NULL pointer dereference (CWE-476) caused by improper handling of an exceptional branch (CWE-754): the UDR-failure branch logs the OpenAPI error but does not return, then dereferences the nil response struct. The intended behavior is to return a controlled 4xx/5xx ProblemDetails and stop processing.
Gin recovery catches the panic, so the PCF process is NOT killed and other endpoints continue serving. The realized impact is per-request: any unauthenticated POST that drives the downstream UDR lookup to a 404 returns HTTP 500 (with empty body and a stack trace in PCF logs) instead of a controlled error response.
No Confidentiality impact (the response is 500 with empty body). No persistent Integrity impact (the panic happens before any state mutation). Availability impact is limited to per-request degradation. The endpoint remains reachable to unauthenticated attackers via the route-group auth gap separately tracked in free5gc/free5gc#844.
Affected: free5gc v4.2.1 (originally reported against v4.1.0; same defect present).
Upstream issue: https://github.com/free5gc/free5gc/issues/803 Upstream fix: https://github.com/free5gc/pcf/pull/62
AnalysisAI
Denial-of-service (degraded per-request) in free5GC's PCF component (versions before 4.2.2 / pcf < 1.4.2) lets remote attackers force HTTP 500 responses on the Npcf_SMPolicyControl endpoint by submitting a crafted sm-policy POST whose DNN cannot be resolved by UDR. The UDR-failure branch in HandleCreateSmPolicyRequest logs the OpenAPI 404 error but fails to return, then dereferences a nil response struct (CWE-476), which Gin recovery converts into a 500 with an empty body. Publicly available exploit code exists (a single curl PoC in the GHSA advisory); there is no active exploitation reported and EPSS is negligible at 0.05%.
Technical ContextAI
The affected component is the Policy Control Function (PCF) of free5GC, an open-source 5G core network implementation written in Go and typically run via the official Docker-compose lab. The PCF exposes the 3GPP Service-Based Interface endpoint POST /npcf-smpolicycontrol/v1/sm-policies. Internally, the handler makes a downstream OpenAPI consumer call to the UDR to fetch SM policy data. When UDR returns 404 Not Found, the consumer wrapper returns a non-nil error together with a nil response struct. The root cause is CWE-754 (improper handling of exceptional conditions): the error branch logs but does not return, so control falls through to smpolicy.go:82 where the nil response is dereferenced (CWE-476), causing a Go nil-pointer panic. Gin's recovery middleware catches the panic and maps it to HTTP 500, so the process survives. The affected package is identified in CPE/purl form as pkg:go/github.com/free5gc/pcf.
RemediationAI
Vendor-released patch: upgrade free5GC to 4.2.2 or later (pcf 1.4.2 or later), which adds the missing return/guard in the UDR-failure branch of HandleCreateSmPolicyRequest - see https://github.com/free5gc/pcf/pull/62 and commit df535f5524314620715e842baf9723efbeb481a7. If immediate upgrade is not possible, restrict network reachability of the PCF SBI (http://<pcf>:8000/npcf-smpolicycontrol) to trusted 5G core NFs only via network segmentation or firewall rules, since the endpoint should never be exposed beyond the internal service mesh; the trade-off is none for legitimate traffic if peer NFs are correctly enumerated. Additionally address the related route-group authentication gap (free5gc/free5gc#844) so the Npcf_SMPolicyControl group enforces inbound auth middleware - this removes the unauthenticated reachability that makes the trigger trivial, at the cost of ensuring all legitimate SMF callers present valid credentials.
An issue was discovered in Appsmith before 1.52. Rated critical severity (CVSS 9.8), this vulnerability is remotely expl
runc through version 1.0-rc6 (used in Docker before 18.09.2) contains a container escape vulnerability that allows attac
Netmaker makes networks with WireGuard. Rated high severity (CVSS 7.5), this vulnerability is remotely exploitable, no a
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
The News & Blog Designer Pack - WordPress Blog Plugin - (Blog Post Grid, Blog Post Slider, Blog Post Carousel, Blog Post
Path traversal in JFrog Artifactory (CWE-22) enables an authenticated low-privilege user to write data outside the inten
Docker 1.3.2 allows remote attackers to execute arbitrary code with root privileges via a crafted (1) image or (2) build
Remote code execution in Gogs through 0.14.2 allows authenticated users (and unauthenticated attackers on default-config
Remote code execution in Flowise before 3.1.2 allows any authenticated user (or API caller with chatflow view/update per
Remote code execution in NocoBase Workflow Script Node (npm @nocobase/plugin-workflow-javascript) allows authenticated l
Docker Desktop Community Edition before 2.1.0.1 allows local users to gain privileges by placing a Trojan horse docker-c
Vasion Print (formerly PrinterLogic) Virtual Appliance Host prior to version 25.2.169 and Application prior to version 2
Same weakness CWE-476 – NULL Pointer Dereference
View allSame technique Denial Of Service
View allVendor StatusVendor
SUSE
Severity: Important| Product | Status |
|---|---|
| SUSE Linux Enterprise Server 16.1 | Affected |
| SUSE Linux Enterprise Server for SAP applications 16.1 | Affected |
| SUSE Linux Enterprise Module for Package Hub 15 SP5 | Affected |
| SUSE Linux Enterprise Module for Package Hub 15 SP6 | Affected |
| openSUSE Leap 15.5 | Affected |
| openSUSE Leap 15.6 | Affected |
Share
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-32552
GHSA-wr8j-6chw-gm6p