Skip to main content
CVE Vulnerability Database
Vulnerability Database/CVE-2026-48544

CVE-2026-48544: Taipy Path Traversal Vulnerability

CVE-2026-48544 is a path traversal flaw in Taipy 4.1.1 that allows attackers to access unauthorized files outside the intended library directory. This article covers the technical details, affected versions, and mitigation.

Published:

CVE-2026-48544 Overview

CVE-2026-48544 is a path traversal vulnerability [CWE-22] in Taipy 4.1.1, a Python framework for building data-driven web applications. The flaw resides in the ElementLibrary.get_resource() method located in taipy/gui/extension/library.py. The method performs an incomplete directory containment check using str.startswith() without a trailing path separator. Unauthenticated remote attackers can craft GET requests containing path traversal segments that target a prefix-matching sibling directory on disk. Flask's path converter and Werkzeug's WSGI layer preserve traversal segments, while the resolved path still satisfies the flawed comparison. The result is unauthorized file access outside the intended library directory. The issue is fixed in commit 129fd40.

Critical Impact

Unauthenticated attackers can read arbitrary files from prefix-matching sibling directories outside the intended Taipy extension library boundary, exposing sensitive application data and source code.

Affected Products

  • Taipy 4.1.1
  • Taipy GUI extension library (taipy/gui/extension/library.py)
  • Fixed in upstream commit 129fd40

Discovery Timeline

  • 2026-05-27 - CVE-2026-48544 published to NVD
  • 2026-05-27 - Last updated in NVD database

Technical Details for CVE-2026-48544

Vulnerability Analysis

The vulnerability stems from an unsafe string-based path containment check inside ElementLibrary.get_resource(). The method resolves a user-supplied resource name against a base class folder and then verifies the resolved path with str(file).startswith(str(base)). Because startswith() performs pure prefix string matching and does not enforce a path separator after base, any sibling directory whose name begins with the same prefix as base satisfies the check. For example, if base resolves to /opt/app/lib, a path like /opt/app/lib_secrets/config.env passes the containment test even though it sits outside the intended library directory.

The Flask route uses a path converter, and the Werkzeug WSGI layer preserves traversal segments rather than normalizing them away before they reach Taipy. Combined with the prefix-only string check, an attacker can request crafted resource paths that escape the intended module boundary while still appearing valid to Taipy's containment logic.

Root Cause

The root cause is the use of lexical string prefix comparison for filesystem path containment. Path containment must be evaluated on path components, not raw strings. The patched version replaces the check with Path.is_relative_to(), which performs a component-aware comparison and rejects sibling directories that merely share a name prefix.

Attack Vector

Exploitation requires only network access to the Taipy GUI endpoint serving extension library resources. No authentication and no user interaction are needed. An attacker sends a crafted GET request whose resource path includes traversal segments referencing a prefix-matching sibling directory. Because the WSGI layer preserves traversal segments and the resolved absolute path still satisfies the flawed startswith() comparison, Taipy returns the contents of the unauthorized file.

python
         """  # noqa: E501
         base = self.__get_class_folder()
         file = (base / name).resolve()
-        if str(file).startswith(str(base)) and file.exists():
+        if file.is_relative_to(base) and file.exists():
             return file
         else:
             raise FileNotFoundError(f"Cannot access resource {file}.")

Source: GitHub Commit 129fd40. The patch replaces the prefix string comparison with Path.is_relative_to(), eliminating the sibling-directory bypass.

Detection Methods for CVE-2026-48544

Indicators of Compromise

  • HTTP GET requests to Taipy extension library resource endpoints containing ../ or URL-encoded traversal sequences such as %2e%2e%2f.
  • Successful 200 responses for resource paths that resolve outside the registered extension library directory.
  • FileNotFoundError exceptions in Taipy logs referencing paths in sibling directories that share a prefix with a registered library folder.

Detection Strategies

  • Inspect web access logs for requests targeting Taipy GUI extension routes that include traversal segments or unusual path components.
  • Correlate Taipy application logs for repeated get_resource calls resolving to files outside expected library directories.
  • Add web application firewall rules that decode and normalize request paths before applying traversal-pattern matching.

Monitoring Recommendations

  • Monitor the host filesystem for read access to sensitive files by the Taipy process user outside registered extension directories.
  • Track Taipy version inventory and alert on any host still running 4.1.1 or earlier without the 129fd40 fix applied.
  • Forward Flask and Werkzeug request logs to a centralized log platform for retroactive hunting on traversal patterns.

How to Mitigate CVE-2026-48544

Immediate Actions Required

  • Upgrade Taipy to a version that includes commit 129fd40 or later.
  • If immediate upgrade is not possible, restrict network exposure of the Taipy GUI to trusted networks only.
  • Audit logs for prior requests containing path traversal sequences against extension library endpoints.

Patch Information

The fix is implemented in Taipy commit 129fd40 and tracked in pull request #2871 and issue #2868. The patch replaces the str.startswith() comparison with Path.is_relative_to() in ElementLibrary.get_resource(). Additional context is available in the VulnCheck Advisory.

Workarounds

  • Place a reverse proxy in front of Taipy that normalizes request paths and rejects traversal sequences before they reach the WSGI layer.
  • Run the Taipy process under a least-privilege user account that cannot read sensitive files in sibling directories.
  • Relocate extension library directories so no sibling directory shares a name prefix that could satisfy the flawed containment check.
bash
# Upgrade Taipy to a patched build that includes commit 129fd40
pip install --upgrade "taipy>4.1.1"

# Verify the installed version
python -c "import taipy; print(taipy.__version__)"

Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

Default Legacy - Prefooter | Experience the World’s Most Advanced Cybersecurity Platform

Experience the Most Advanced Cybersecurity Platform

See how the world’s most intelligent, autonomous cybersecurity platform can protect your organization today and into the future.