CVE-2023-29159: Path Traversal

Published May 17, 2023
·
Updated

Summary When using StaticFiles, if there's a file or directory that starts with the same name as the StaticFiles directory, that file or directory is also exposed via StaticFiles which is a path traversal vulnerability.

Details The root cause of this issue is the usage of os.path.commonprefix(): https://github.com/encode/starlette/blob/4bab981d9e870f6cee1bd4cd59b87ddaf355b2dc/starlette/staticfiles.py#L172-L174

As stated in the Python documentation (https://docs.python.org/3/library/os.path.html#os.path.commonprefix) this function returns the longest prefix common to paths.

When passing a path like /static/../static1.txt, os.path.commonprefix([fullpath, directory]) returns ./static which is the common part of ./static1.txt and ./static, It refers to /static/../static1.txt because it is considered in the staticfiles directory. As a result, it becomes possible to view files that should not be open to the public.

The solution is to use os.path.commonpath as the Python documentation explains that os.path.commonprefix works a character at a time, it does not treat the arguments as paths.

PoC In order to reproduce the issue, you need to create the following structure:

├── static │ ├── index.html ├── staticdisallow │ ├── index.html └── static1.txt

And run the Starlette app with:

py import uvicorn from starlette.applications import Starlette from starlette.routing import Mount from starlette.staticfiles import StaticFiles

routes = [ Mount("/static", app=StaticFiles(directory="static", html=True), name="static"), ]

app = Starlette(routes=routes)

if name == "main": uvicorn.run(app, host="0.0.0.0", port=8000)

And running the commands:

shell curl --path-as-is 'localhost:8000/static/../staticdisallow/' curl --path-as-is 'localhost:8000/static/../static1.txt' The static1.txt and the directory staticdisallow are exposed.

Impact Confidentiality is breached: An attacker may obtain files that should not be open to the public.

Credits Security researcher Masashi Yamane of LAC Co., Ltd reported this vulnerability to JPCERT/CC Vulnerability Coordination Group and they contacted us to coordinate a patch for the security issue.

Other sources

Directory traversal vulnerability in Starlette versions 0.13.5 and later and prior to 0.27.0 allows a remote unauthenticated attacker to view files in a web service which was built using Starlette.

Encode Starlette could allow a remote attacker to traverse directories on the system, caused by improper validation of user request when using StaticFiles. An attacker could send a specially crafted URL request containing "dot dot" sequences (/../) to view arbitrary files on the system.

IBM

Affected Software

2 affected componentsFixes available
pip/starlette>=0.13.5<0.27.0
0.27.0
Encode Starlette python>=0.13.5<0.27.0

Event History

May 17, 2023
Advisory Published
via GitHub·03:49 AM
Jun 1, 2023
CVE Published
via MITRE·12:00 AM
Data Sourced
via MITRE·12:00 AM
DescriptionWeakness
Data Sourced
02:15 AM
Description
Feb 2, 2024
Data Sourced
via IBM·12:00 AM
DescriptionSeverityAffected Software

Parent advisories

This vulnerability appears in the following advisories.

Free Weekly Intel

Don't miss critical vulnerabilities

Join thousands of security professionals who receive our weekly digest of trending CVEs, zero-days, and exploited vulnerabilities.

No spam. Unsubscribe anytime.

Frequently Asked Questions

1

What is the vulnerability ID?

The vulnerability ID is CVE-2023-29159.

2

What is the severity of CVE-2023-29159?

The severity of CVE-2023-29159 is high with a score of 7.5.

3

Which versions of Starlette are affected by CVE-2023-29159?

Starlette versions 0.13.5 and later and prior to 0.27.0 are affected by CVE-2023-29159.

4

How can I fix CVE-2023-29159?

To fix CVE-2023-29159, update Starlette to version 0.27.0 or later.

5

What is the CWE-ID for CVE-2023-29159?

The CWE-ID for CVE-2023-29159 is CWE-22.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203