Описание
Starlette has Path Traversal vulnerability in StaticFiles
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([full_path, 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:
And run the Starlette
app with:
And running the commands:
The static1.txt
and the directory static_disallow
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.
Ссылки
- https://github.com/encode/starlette/security/advisories/GHSA-v5gw-mw7f-84px
- https://nvd.nist.gov/vuln/detail/CVE-2023-29159
- https://github.com/encode/starlette/commit/1797de464124b090f10cf570441e8292936d63e3
- https://github.com/encode/starlette/blob/4bab981d9e870f6cee1bd4cd59b87ddaf355b2dc/starlette/staticfiles.py#L172-L174
- https://github.com/encode/starlette/releases/tag/0.27.0
- https://github.com/pypa/advisory-database/tree/main/vulns/starlette/PYSEC-2023-83.yaml
- https://jvn.jp/en/jp/JVN95981715
Пакеты
starlette
>= 0.13.5, < 0.27.0
0.27.0
Связанные уязвимости
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.
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.
Directory traversal vulnerability in Starlette versions 0.13.5 and lat ...
Уязвимость инструментария Starlette для создания асинхронных веб-сервисов на языке Python, связанная с неправильным ограничением имени пути к ограниченному каталогу, позволяющая нарушителю получить доступ к конфиденциальное информации