# Juju has a resource poisoning vulnerability

Juju resource handler only checks basic authentication, letting any authenticated user or machine overwrite application resources in any model of the controller.

- Payout: Research
- Severity: high
- Program: Juju
- Found by: tlm
- Disclosed: 2026-04-03
- CVE: CVE-2025-68153
- Write-up quality: 7/10
- Original: https://github.com/advisories/GHSA-245v-p8fj-vwm2
- Library page: http://bugbountylibrary.com/r/ghsa%3AGHSA-245v-p8fj-vwm2
- Tags: area:cloud domain:cloud impact:integrity impact:privesc kind:research platform:ghsa sev:high tech:go technique:source-review vuln:access-control vuln:auth-bypass

**Target:** Juju API server resource handler (/:modeluuid/applications/:application/resources/:resources)
**Root cause:** The resource handler's authorizer only verifies the caller is an authenticated user, machine or controller, with no permission check on the controller or target model, and the handler registers no authorizer.
**Steps:**
1. Authenticate to the Juju controller as any user, machine or controller.
2. Obtain the target model UUID; application and resource names are often guessable from the charm name and Charmhub.
3. Send `PUT /:modeluuid/applications/:application/resources/:resources` with a file matching the resource's extension.
4. Handler overwrites the existing cached resource with the uploaded content.
**How found:** Direct code read: noticed the resource handler's authorizer only required basic authentication and that the handler struct declared no authorizer, then traced the PUT path to the cache overwrite in the resource service.
**Exploitation:** A compromised workload holding machine credentials uses them to PUT a trojaned OCI image resource for another model (e.g. a k8s Vault deployment), so the victim workload pulls the attacker image and the attacker gains root and all Vault secrets, then pivots further.
**Escalation:** Poisoned OCI resource yields code execution in another workload, leading to secret theft (Vault) and lateral movement across the controller's models.
**Insight:** When a handler's authorizer only checks 'is authenticated' rather than model/controller permissions, and the route embeds a model UUID, test cross-model writes; guessable charm-derived application/resource names lower the bar to just the model UUID.

