Goploy: Arbitrary File Read via Path Traversal in /deploy/fileDiff allows Remote Server Compromise
CVE-2026-114665 · CVE-2026-53553 · GHSA-4g5x-hcwm-82jw · GO-2026-5938 · published 7 Jul 2026
How serious is it
- Severity: high, CVSS score 7.7 out of 10.
- No exploit prediction (EPSS) score yet.
- Not on the CISA list of exploited vulnerabilities.
- No public exploit in Exploit-DB.
Is your app affected by CVE-2026-114665?
Paste this prompt into Claude Code, Cursor or any AI coding tool: it runs a free Shippable scan of your project and fixes what it finds. Built with Lovable, Bolt or v0? Scan your live app. Or upload your package file.
Who is affected
github.com/zhenorzz/goploy(Go) <= 1.17.5
How to check
- Run
go list -m github.com/zhenorzz/goployin your project to see the installed version, including copies pulled in by other packages. - Or paste your lockfile into the checker: it lists every package with a known vulnerability, this one included.
How to fix
Copies a prompt for Claude Code, Cursor or Codex: it checks your lockfiles for this and upgrades it.
- Upgrade
github.com/zhenorzz/goployto 1.18.0 or later, commit the lockfile and redeploy. - If a vulnerable version was live, check your logs and rotate the secrets that server could read.
The advisory
# Goploy System Arbitrary File Read Vulnerability
## Basic Information
- **Vulnerability Name**: Goploy Endpoints Arbitrary File Read via Path Traversal
- **Affected Product**: Goploy
- **Known Affected Versions**: <=1.17.5
## Vulnerability Description
Goploy is an open-source automation deployment system. A severe path traversal vulnerability exists in its backend API endpoints, specifically `/deploy/fileDiff` (File Compare), when handling file paths provided by the client.
The original logic of this endpoint is to read a local project file and compare it with a file on a remote target server. However, due to insufficient validation and sanitization of the `filePath` parameter, and the lack of security constraints on the final absolute file path, malicious paths containing `../` are directly executed within the system.
This leads to a **dual arbitrary file read** issue:
1. **Local Host File Read**: `os.ReadFile` is tricked by the directory traversal payload to read any file via its absolute path on the Goploy local host (returned in the `srcText` field of the response body).
2. **Remote Controlled Server File Read**: Subsequently, the same payload is utilized via the SFTP protocol on the target server pointed to by the `serverID`. Influenced similarly by the directory traversal, it reads any file on the configured remote server (returned in the `distText` field of the response body).
**The threshold for exploiting this vulnerability is extremely low, and the conditions are very easily met.** The system comes with a built-in `member` role upon default installation, which is **granted the "File Compare" permission by default**. This means that as long as a normal low-privileged user is added to the system, they inherently possess the basic privileges required to call the vulnerable endpoint. The only prerequisite for the attack is that at least one project and one associated server are configured in the system.
An attacker only needs to specify the correct namespace header (e.g., `G-N-ID: 1`) via a packet capture tool to bypass simple restrictions. By enumerating available `serverId` parameters, the attacker can successfully execute path traversal via this endpoint, reading arbitrary files on both the local Goploy host and **all remote target servers managed by Goploy**.
## Steps to Reproduce (Proof of Concept)
### Theoretical Steps (See concrete steps below)
1. **Obtain Normal User Privileges**
Log in to the system using any registered low-privileged account to obtain valid authentication credentials (Cookie/Token) and its corresponding authorized Namespace ID.
2. **Construct Malicious Request**
Send a POST request containing the directory traversal characters `../` to the target endpoint `/deploy/fileDiff`, while including the `G-N-ID` header.
**PoC Example (Reading `/etc/passwd` and enumerating `serverId`):**
```bash
curl -s -X POST -b "goploy_token=<valid_cookie>" \
-H "Content-Type: application/json" \
-H "G-N-ID: 1" \
-d '{"projectId":1,"serverId":1,"filePath":"../../../../../../../../../../etc/passwd"}' \
"http://<target-host>/deploy/fileDiff"
```
3. **Reproduction Result**
The server will return the complete contents of the `/etc/passwd` file from both the host and the remote server.
### Concrete Steps
1. **Environment Setup**
Published an arbitrary project using the super admin account:
<img width="1919" height="428" alt="image" src="https://github.com/user-attachments/assets/8618a038-9088-45b4-804a-5541e243c6a8" />
Configured two managed remote servers:
<img width="1896" height="399" alt="image-1(1)" src="https://github.com/user-attachments/assets/89cfa086-d20b-448e-9cf7-1af5798e3cfe" />
Created a normal user and assigned the `member` role (which includes File Compare permission):
<img width="1910" height="343" alt="image-2" src="https://github.com/user-attachments/assets/b8dda364-c23d-4496-a555-ff477c511d31" />
<img width="951" height="364" alt="image-3" src="https://github.com/user-attachments/assets/0e20cbed-7341-484c-b0a7-0fcd6ca2fea6" />
2. **Obtain Normal User Privileges**
Log in to the system using the registered `test` account to obtain valid authentication credentials (Cookie/Token).
<img width="1916" height="712" alt="image-4(1)" src="https://github.com/user-attachments/assets/a269b79f-a666-4f3a-95c4-40621e1fbbc2" />
3. **Execute poc.py (See below)**
* **Parameter Explanation:**
`-u` : Target URL
`-t` : Target Cookie/Token to use
`-f` : File to read
`-s` : ID of the managed server to read from
* **Reading from the first managed server (Server ID: 1):**
```bash
python poc.py -u http://192.168.x.x:8080 -t eyJhbGxxxxxxxxxx... -f /etc/passwd -s 1
```
<img width="1173" height="608" alt="image-6(1)" src="https://github.com/user-attachments/assets/e442c247-3ebf-449f-94df-2b2b533b9449" />
<img width="870" height="190" alt="image-5" src="https://github.com/user-attachments/assets/9e53b13a-915c-4f5e-b1bc-f0b3c0b64656" />
* **Reading from the second managed server (Server ID: 2):**
```bash
python poc.py -u http://192.168.x.x:8080 -t eyJhbGxxxxxxxxxx... -f /etc/passwd -s 2
```
<img width="1173" height="231" alt="image-8(1)" src="https://github.com/user-attachments/assets/54e77e8a-259d-4f74-bf31-1a9625bcbe52" />
4. **Reproduction Result**
The server successfully returns the full contents of the `/etc/passwd` file from both the Goploy host and the designated remote servers.
## Impact
Through this vulnerability, an attacker can bypass authorization to read any sensitive files on the host machine as well as all managed target servers. For example:
- Read `/etc/passwd` or `/etc/shadow` on the local or remote target servers to obtain host system user information.
- Read users' SSH private keys (e.g., `~/.ssh/id_rsa`) across different systems, enabling passwordles…
Check your whole app
Dependencies are only half of it. Free and read-only: before you push, run npx shippable-dev scan localhost:3000 in your project folder, no account needed. For your live app, you prove it's yours with a one-line tag first.
References
- github.com/zhenorzz/goploy/security/advisories/GHSA-4g5x-hcwm-82jw
- github.com/zhenorzz/goploy
- nvd.nist.gov/vuln/detail/CVE-2026-53553
- github.com/zhenorzz/goploy/commit/d51aa15ebc0a474d9d71d6c453a0fe798dd5e007
- github.com/zhenorzz/goploy/releases/tag/v1.18.0
- github.com/advisories/GHSA-4g5x-hcwm-82jw
Merged from OSV, GitHub Advisory Database. Last updated 28 Oct 2026. All vulnerabilities · RSS · JSON