PraisonAI's template loader accepts GitHub template URIs with refs, for example
github:owner/repo/template@v1.0.0. The resolver stores the user-controlled
template path and ref verbatim, and the cache layer later joins those values into
~/.praison/cache/templates/github/<owner>/<repo>/<template>/<ref> without
normalizing each segment or checking that the final path remains inside the
template cache root.
A crafted ref such as ../../../../../../outside-delete-target therefore
escapes the cache directory. The first load can write .cache_meta.json outside
the cache. If the normal cache hierarchy for the same owner/repo/template has
already been created, the same path reaches shutil.rmtree(cache_path) and
removes an attacker-selected outside directory before replacing it with cache
metadata.
This is distinct from the old template Zip Slip advisory. No malicious archive member is needed, and the PoV disables network access entirely. The bug is in cache-key construction for GitHub template URIs.
Confirmed vulnerable:
v2.6.0v3.9.24v3.9.26v4.5.126v4.5.128v4.6.9v4.6.10v4.6.56v4.6.572f9677abb2ea68eab864ee8b6a828fd0141612e1Recommended affected range: >= 2.6.0, <= 4.6.57.
No fixed version is known at the time of this report.
An attacker who can cause a user or service to load an attacker-supplied PraisonAI GitHub template URI can:
.cache_meta.json outside the template cache directory;Current-head code path:
praisonai/templates/resolver.py: GITHUB_PATTERN captures path and ref
with broad regex groups and returns them without segment validation.
-...4.6.59Exploitability
AV:NAC:LPR:NUI:RScope
S:UImpact
C:NI:HA:H8.1/CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:H