LF Edge eKuiper CVE-2025-24979
MEDIUMSeverity by source
AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:L/A:N
Network-accessible management API requires high-privilege authentication (PR:H); SSRF leaks internal credentials (C:H) and may interact with writable internal APIs (I:L); no availability impact.
Primary rating from GitHub Advisory.
CVSS VectorGitHub Advisory
Lifecycle Timeline
3DescriptionGitHub Advisory
Summary
Server-side request forgery (SSRF) vulnerability in eKuiper allows an attacker with permissions to register external services or create rules to induce the eKuiper server to make requests to unintended network locations, such as internal services, loopback interfaces (localhost), or cloud metadata endpoints.
Details
Prior to v2.4.0, eKuiper external service registrations and HTTP invocations did not validate destination IP addresses. An attacker with access to the eKuiper management API could register an external service pointing to an internal address (such as http://127.0.0.1:9081 or other internal network services) and trigger queries using service functions (e.g. SELECT tsschemaless(...) FROM demo). This allows probing internal networks, leaking sensitive information (such as internal endpoints/credentials), or interacting with internal APIs accessible to the eKuiper host.
PoC
- Create an external service with an address pointing to an internal network / localhost:
{
"interfaces": {
"tsschemaless": {
"address": "http://127.0.0.1:9081",
"protocol": "rest",
"options": {
"insecureSkipVerify": true,
"headers": {
"Accept-Charset": "utf-8"
}
},
"schemaless": true
}
}
}- Load it to eKuiper and create a rule invoking it, e.g.:
SELECT tsschemaless("get", "/metadata/sources/yaml/mqtt", *) FROM demo. - Run the rule. When data flows through the stream, the response from the internal service is retrieved and can be routed to an external sink or inspected.
Impact
Server-Side Request Forgery (SSRF) allowing unauthorized access / probing of internal network services.
Remediation & Patches
- Upgrade to eKuiper >= 2.4.0: Starting with v2.4.0, SSRF protection (
httpx.GetSSRFDialContext) is enabled by default across HTTP clients, blocking requests to private, loopback, link-local, multicast, and unspecified IP addresses.
Workarounds (for versions < 2.4.0)
If unable to upgrade immediately:
- Restrict Management API Access: Restrict access to the eKuiper REST API (port 9081) and CLI using network firewalls, reverse proxies, and authentication so only trusted administrators can create or update services and rules.
- Egress Network Filtering: Use firewall / iptables rules or container network isolation to block outbound requests from eKuiper to private subnets, loopback addresses, and cloud metadata endpoints (
169.254.169.254). - Audit Service Definitions: Regularly review registered external services (
GET /servicesorbin/kuiper show services) to verify target hosts.
Notes for Users Upgrading to >= 2.4.0
- In v2.4.0 and later,
basic.enablePrivateNetinkuiper.yamldefaults tofalse(blocking private network access). - If a developer's deployment legitimately requires eKuiper to communicate with internal REST services or private networks, they can explicitly opt in by setting
basic.enablePrivateNet: true(or via environment variableKUIPER__BASIC__ENABLEPRIVATENET=true). Ensure eKuiper's API is protected before enabling this setting.
Reported by Alexey Kosmachev, Bi.Zone
AnalysisAI
Server-Side Request Forgery in LF Edge eKuiper (all versions prior to 2.4.0) allows authenticated high-privilege users with management API access to register external service definitions targeting internal network addresses - including loopback (127.0.0.1), RFC1918 private subnets, and cloud metadata endpoints (169.254.169.254) - and trigger outbound requests to those addresses by executing SQL processing rules. Successful exploitation enables probing internal services, exfiltrating sensitive configuration data such as MQTT credentials exposed via eKuiper's own REST API, and interacting with internal APIs reachable from the eKuiper host. No public exploit or CISA KEV listing exists at time of analysis, but a detailed proof-of-concept is embedded in the GitHub security advisory GHSA-pqqc-8v73-9gg2.
Technical ContextAI
eKuiper is an LF Edge project providing an edge-native SQL stream processing engine used in IoT and industrial edge deployments. Its external service registration feature allows users to define REST endpoints callable as SQL user-defined functions (e.g., SELECT tsschemaless(...) FROM demo). Prior to v2.4.0, neither the service registration subsystem nor the HTTP invocation clients validated destination IP addresses against private, loopback, link-local, multicast, or unspecified address ranges - a textbook CWE-918 (SSRF) root cause. The fix in v2.4.0 introduces httpx.GetSSRFDialContext applied globally across all HTTP clients, blocking such address classes by default. A new configuration key basic.enablePrivateNet in kuiper.yaml (also settable via KUIPER__BASIC__ENABLEPRIVATENET=true) allows explicit opt-in for deployments that legitimately communicate with internal REST services. The affected package identifier is pkg:go/github.com_lf-edge_ekuiper_v2 for versions prior to 2.4.0.
RemediationAI
Upgrade to eKuiper >= 2.4.0, which enables SSRF protection via httpx.GetSSRFDialContext by default, blocking all outbound requests to private, loopback, link-local, multicast, and unspecified IP address ranges; see the release at https://github.com/lf-edge/ekuiper/releases/tag/v2.4.0. If immediate upgrade is not feasible, apply three compensating controls: first, restrict access to the eKuiper REST API (port 9081) and CLI using network firewalls, reverse proxies, or authentication middleware so only trusted administrators can register external services or create rules (this is the highest-impact workaround); second, apply egress iptables or container network policy rules on the eKuiper host blocking outbound connections to 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16, and ::1/128 (note: this may break legitimate internal connectivity); third, regularly audit registered external services via GET /services or bin/kuiper show services and alert on any registration targeting non-public IP addresses. After upgrading to v2.4.0, if the deployment legitimately requires eKuiper to reach internal REST services, enable basic.enablePrivateNet: true in kuiper.yaml only after ensuring the management API is protected.
Same weakness CWE-918 – Server-Side Request Forgery (SSRF)
View allShare
External POC / Exploit Code
Leaving vuln.today
GHSA-pqqc-8v73-9gg2