CVE-2026-85272 in openedx
Summary
by MITRE • 09/18/2026
Open edX Platform enables the authoring and delivery of online learning at any scale. From Aspen.1 until Ulmo and Verawood.1, openedx/core/lib/extract_archive.py uses _is_bad_path to validate safe_extractall targets by comparing resolved path strings with startswith instead of comparing path components. A course author or staff user with course import permission can submit a crafted .tar.gz archive through the import_olx flow initiated by cms.djangoapps.contentstore.views.import_export.import_handler. An archive member can therefore escape into a sibling course staging directory whose name shares the attacker's base64 directory prefix, causing limited cross-tenant file corruption. Zip archives are not practically affected because ZipFile.extractall strips parent traversal segments, and the advisory does not establish arbitrary filesystem writes, file reads, or direct code execution. This issue is fixed in Ulmo and Verawood.1.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.
Analysis
by VulDB Data Team • 09/18/2026
The Open edX platform serves as a comprehensive solution for authoring and delivering online learning content at scale, supporting multiple institutions through its multi-tenant architecture. Within this ecosystem, the core library function extract_archive.py plays a critical role in processing uploaded course materials. Specifically, from version Aspen.1 up to Ulmo and Verawood.1, the validation mechanism used to ensure safe extraction of archive contents relies on string comparison rather than robust path normalization. The vulnerability stems from the _is_bad_path function which validates targets by comparing resolved path strings using a startswith check against allowed directories. This approach is fundamentally flawed because it fails to account for subtle variations in path representation that can occur during resolution, allowing crafted inputs to bypass security checks designed to contain file operations within designated tenant boundaries.
A course author or staff user possessing course import permissions can exploit this flaw by submitting a specially constructed .tar.gz archive through the import_olx flow initiated by cms.djangoapps.contentstore.views.import_export.import_handler. The attacker crafts an archive member with a path that, when resolved, shares a base64-encoded directory prefix with a sibling tenant's staging directory. Because the validation logic compares string prefixes rather than normalized path components, it incorrectly identifies the malicious target as safe. This allows the extraction process to write files into a directory belonging to another tenant or course context. The primary operational impact is limited cross-tenant file corruption, where an attacker can overwrite or inject arbitrary files into shared infrastructure directories used by other tenants during their import processes.
It is important to note that this vulnerability does not extend to Zip archives in practice. The Python standard library's ZipFile.extractall method inherently strips parent traversal segments such as .. from paths before extraction, effectively neutralizing similar path traversal attempts for zip formats. Furthermore, the advisory clarifies that this issue does not lead to arbitrary filesystem writes outside of these staging directories, nor does it enable direct file reads or remote code execution on the server itself. The risk is primarily confined to data integrity within the specific context of course import operations and cross-tenant isolation failures in temporary storage areas.
From a classification perspective, this vulnerability aligns with CWE-22 Improper Limitation of a Pathname to a Restricted Directory, as it involves path traversal leading to unauthorized access or modification of files outside intended directories. In terms of the MITRE ATT&CK framework, this behavior corresponds to T1564.008 Host File System Discovery and potentially T1499 Endpoint Denial of Service if the corruption causes service disruption for other tenants. The vulnerability highlights a common pitfall in security implementation where string-based path validation is used instead of canonicalization functions that resolve all symbolic links, relative references, and special characters to their absolute forms before comparison.
Mitigation strategies involve upgrading to Ulmo or Verawood.1 and later versions where the _is_bad_path function has been corrected to compare normalized path components rather than raw strings. For organizations unable to upgrade immediately, strict input validation on uploaded archive contents can provide a temporary layer of defense, although this is less reliable than fixing the underlying logic. Administrators should also ensure that staging directories are isolated with appropriate file system permissions and monitor for unusual file creation patterns in shared import paths. Regular audits of course import logs can help detect potential exploitation attempts before they result in significant data corruption or service disruption across multiple tenants.