Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Primary rating from Vendor (VulnCheck) · only source for this CVE.
CVSS VectorVendor: VulnCheck
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Lifecycle Timeline
6DescriptionCVE.org
Banana Slides through 0.4.0, patched in commit e8bc490, contains a path traversal vulnerability in the generate_image() function within the AI service backend that allows unauthenticated attackers to read arbitrary image-format files outside the intended uploads directory by exploiting an incomplete path prefix check using os.path.startswith() without a trailing separator. Attackers can supply crafted markdown image references in user-controlled page descriptions that resolve to sibling directories whose names share the uploads folder prefix, bypassing the directory confinement check and causing the application to read files from unintended locations via PIL Image.open().
AnalysisAI
Path traversal in Banana Slides through 0.4.0 allows unauthenticated remote attackers to read arbitrary image-format files outside the uploads directory via the generate_image() function in the AI service backend. The flaw stems from an incomplete prefix check using os.path.startswith() without a trailing separator, letting sibling directories whose names share the uploads folder prefix bypass containment. Publicly available exploit code exists (GitHub issue #429), and a vendor patch has been released in commit e8bc490.
Technical ContextAI
Banana Slides is a Python-based slide generation application with an AI service backend (backend/services/ai_service.py) that processes user-supplied markdown image references of the form '/files/<path>'. The vulnerable code resolved these references against the configured upload_folder using os.path.abspath() and then validated containment with local_path.startswith(os.path.abspath(upload_folder)). Because the check omitted a trailing path separator, a path like '/uploads_secret/flag.png' satisfies startswith('/uploads') and bypasses confinement - a classic CWE-22 (Path Traversal) instance. The resolved path is then passed to PIL Image.open(), so any file that PIL can decode as an image format is exposed to the attacker through the AI image-generation pipeline.
RemediationAI
Upstream fix available (commit e8bc490 via PR #430); a released patched version beyond 0.4.0 is not independently confirmed, so operators should deploy the fixed commit directly from https://github.com/Anionex/banana-slides/commit/e8bc490ec8b4b657e07dc3ab4e94fbedcaade421 or a build that includes it - the fix replaces the prefix check with os.path.realpath() plus os.path.commonpath() and switches existence check to os.path.isfile(). Until the patched code is deployed, restrict network access to the Banana Slides backend so only trusted users can submit page descriptions or markdown image references, and avoid placing sensitive image-format files in directories whose names share a prefix with the uploads folder (the trade-off is that this only mitigates the specific sibling-prefix variant, not symlink or '..' traversal). Reviewing logs for '/files/' references containing '..' or unexpected sibling paths can help detect exploitation attempts.
Same weakness CWE-22 – Path Traversal
View allSame technique Path Traversal
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-33753
GHSA-f757-35w9-6h9q