CVE-2025-58161
MobSF Path Traversal in GET /download/<filename> using absolute filenames
MobSF is a mobile application security testing tool used. In version 4.4.0, the GET /download/ route uses string path verification via os.path.commonprefix, which allows an authenticated user to download files outside the DWD_DIR download directory from "neighboring" directories whose absolute paths begin with the same prefix as DWD_DIR (e.g., .../downloads_bak, .../downloads.old). This is a Directory Traversal (escape) leading to a data leak. This issue has been patched in version 4.4.1.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- Low
- Integrity
- None
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
1.3
MobSF Path Traversal in GET /download/<filename> using absolute filenames
MobSF is a mobile application security testing tool used. In version 4.4.0, the GET /download/ route uses string path verification via os.path.commonprefix, which allows an authenticated user to download files outside the DWD_DIR download directory from "neighboring" directories whose absolute paths begin with the same prefix as DWD_DIR (e.g., .../downloads_bak, .../downloads.old). This is a Directory Traversal (escape) leading to a data leak. This issue has been patched in version 4.4.1.
- Record
CVE-2025-58161- CVSS 4.0
- 1.3 Low
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N/E:U - Weakness
- CWE-22
- Updated
- 2026-11-02
EUVDEUVD-2025-26369
1.3
MobSF is a mobile application security testing tool used. In version 4.4.0, the GET /download/ route uses string path verification via os.path.commonprefix, which allows an authenticated user to download files outside the DWD_DIR download directory from "neighboring" directories whose absolute paths begin with the same prefix as DWD_DIR (e.g., .../downloads_bak, .../downloads.old). This is a Directory Traversal (escape) leading to a data leak. This issue has been patched in version 4.4.1.
- Record
EUVD-2025-26369- CVSS 4.0
- 1.3 Low
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N/E:U - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-ccc3-fvfx-mw3v
1.3
MobSF Path Traversal in GET /download/<filename> using absolute filenames
Summary
The GET /download/<filename> route uses string path verification via os.path.commonprefix, which allows an authenticated user to download files outside the DWD_DIR download directory from "neighboring" directories whose absolute paths begin with the same prefix as DWD_DIR (e.g., .../downloads_bak, .../downloads.old). This is a Directory Traversal (escape) leading to a data leak.
Details
def is_safe_path(safe_root, check_path):
safe_root = os.path.realpath(os.path.normpath(safe_root))
check_path = os.path.realpath(os.path.normpath(check_path))
return os.path.commonprefix([check_path, safe_root]) == safe_root
commonprefix compares raw strings, not path components. For:
safe_root = /home/mobsf/.MobSF/downloads
check_path = /home/mobsf/.MobSF/downloads_bak/test.txt
the function returns True, incorrectly treating downloads_bak as inside downloads. Download handler:
# MobSF/views/home.py
@login_required
def download(request):
root = settings.DWD_DIR
filename = request.path.replace('/download/', '', 1)
dwd_file = Path(root) / filename # absolute 'filename' ignores 'root'
if '../' in filename or not is_safe_path(root, dwd_file):
return HttpResponseForbidden(...)
ext = dwd_file.suffix
if ext in settings.ALLOWED_EXTENSIONS and dwd_file.is_file():
return file_download(dwd_file, ...)
If the client supplies an absolute path in filename (starts with / or C:/), Path(root) / filename resolves to that absolute path; the flawed is_safe_path then accepts any sibling directory whose absolute path shares the same string prefix. The ../ check does not catch this.
Which file types are retrievable: Whatever is allowed by settings.ALLOWED_EXTENSIONS
PoC
Prereqs: authenticated user; standard install. Assume:
settings.DWD_DIR = /home/mobsf/.MobSF/downloads
Prepare a sibling directory with the same string prefix and a test file:
mkdir -p /home/mobsf/.MobSF/downloads_bak
echo "test" > /home/mobsf/.MobSF/downloads_bak/test.txt
As an authenticated user, request (note the leading / in the filename and the double/triple slash after /download/ to preserve it):
GET /download///home/mobsf/.MobSF/downloads_bak/test.txt HTTP/1.1
Host: <HOST>
Cookie: sessionid=<YOUR_SESSION>
Other working sibling directory names (if present):
…/downloads.old/...
…/downloads_backup/...
…/downloads1/...
…/downloads-archive/...
…/downloads 2024/... (URL-encoded space: downloads%202024)
Impact
Any authenticated user can download files (with allowed extensions) from sibling directories whose absolute paths start with the same string prefix as DWD_DIR.
- Record
GHSA-ccc3-fvfx-mw3v- CVSS 4.0
- 1.3 Low
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N/E:U - Weakness
- CWE-22
- Updated
- 2026-11-02
NVD
1.3
MobSF is a mobile application security testing tool used. In version 4.4.0, the GET /download/ route uses string path verification via os.path.commonprefix, which allows an authenticated user to download files outside the DWD_DIR download directory from "neighboring" directories whose absolute paths begin with the same prefix as DWD_DIR (e.g., .../downloads_bak, .../downloads.old). This is a Directory Traversal (escape) leading to a data leak. This issue has been patched in version 4.4.1.
- Record
CVE-2025-58161- CVSS 4.0
- 1.3 Low
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N/E:U/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 - CVSS 3.1
- 4.3 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-22
- Updated
- 2026-11-02
OSV
1.3
MobSF Path Traversal in GET /download/<filename> using absolute filenames
MobSF is a mobile application security testing tool used. In version 4.4.0, the GET /download/ route uses string path verification via os.path.commonprefix, which allows an authenticated user to download files outside the DWD_DIR download directory from "neighboring" directories whose absolute paths begin with the same prefix as DWD_DIR (e.g., .../downloads_bak, .../downloads.old). This is a Directory Traversal (escape) leading to a data leak. This issue has been patched in version 4.4.1.
- Record
CVE-2025-58161- CVSS 4.0
- 1.3 Low
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N/E:U - Weakness
- CWE-22
- Updated
- 2026-11-02
OSVGHSA-ccc3-fvfx-mw3v
1.3
MobSF Path Traversal in GET /download/<filename> using absolute filenames
Summary
The GET /download/<filename> route uses string path verification via os.path.commonprefix, which allows an authenticated user to download files outside the DWD_DIR download directory from "neighboring" directories whose absolute paths begin with the same prefix as DWD_DIR (e.g., .../downloads_bak, .../downloads.old). This is a Directory Traversal (escape) leading to a data leak.
Details
def is_safe_path(safe_root, check_path):
safe_root = os.path.realpath(os.path.normpath(safe_root))
check_path = os.path.realpath(os.path.normpath(check_path))
return os.path.commonprefix([check_path, safe_root]) == safe_root
commonprefix compares raw strings, not path components. For:
safe_root = /home/mobsf/.MobSF/downloads
check_path = /home/mobsf/.MobSF/downloads_bak/test.txt
the function returns True, incorrectly treating downloads_bak as inside downloads. Download handler:
# MobSF/views/home.py
@login_required
def download(request):
root = settings.DWD_DIR
filename = request.path.replace('/download/', '', 1)
dwd_file = Path(root) / filename # absolute 'filename' ignores 'root'
if '../' in filename or not is_safe_path(root, dwd_file):
return HttpResponseForbidden(...)
ext = dwd_file.suffix
if ext in settings.ALLOWED_EXTENSIONS and dwd_file.is_file():
return file_download(dwd_file, ...)
If the client supplies an absolute path in filename (starts with / or C:/), Path(root) / filename resolves to that absolute path; the flawed is_safe_path then accepts any sibling directory whose absolute path shares the same string prefix. The ../ check does not catch this.
Which file types are retrievable: Whatever is allowed by settings.ALLOWED_EXTENSIONS
PoC
Prereqs: authenticated user; standard install. Assume:
settings.DWD_DIR = /home/mobsf/.MobSF/downloads
Prepare a sibling directory with the same string prefix and a test file:
mkdir -p /home/mobsf/.MobSF/downloads_bak
echo "test" > /home/mobsf/.MobSF/downloads_bak/test.txt
As an authenticated user, request (note the leading / in the filename and the double/triple slash after /download/ to preserve it):
GET /download///home/mobsf/.MobSF/downloads_bak/test.txt HTTP/1.1
Host: <HOST>
Cookie: sessionid=<YOUR_SESSION>
Other working sibling directory names (if present):
…/downloads.old/...
…/downloads_backup/...
…/downloads1/...
…/downloads-archive/...
…/downloads 2024/... (URL-encoded space: downloads%202024)
Impact
Any authenticated user can download files (with allowed extensions) from sibling directories whose absolute paths start with the same string prefix as DWD_DIR.
- Record
GHSA-ccc3-fvfx-mw3v- CVSS 4.0
- 1.3 Low
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N/E:U - Weakness
- CWE-22
- Updated
- 2026-11-02
OSVPYSEC-2026-1672
1.3
MobSF Path Traversal in GET /download/<filename> using absolute filenames
Summary
The GET /download/<filename> route uses string path verification via os.path.commonprefix, which allows an authenticated user to download files outside the DWD_DIR download directory from "neighboring" directories whose absolute paths begin with the same prefix as DWD_DIR (e.g., .../downloads_bak, .../downloads.old). This is a Directory Traversal (escape) leading to a data leak.
Details
def is_safe_path(safe_root, check_path):
safe_root = os.path.realpath(os.path.normpath(safe_root))
check_path = os.path.realpath(os.path.normpath(check_path))
return os.path.commonprefix([check_path, safe_root]) == safe_root
commonprefix compares raw strings, not path components. For:
safe_root = /home/mobsf/.MobSF/downloads
check_path = /home/mobsf/.MobSF/downloads_bak/test.txt
the function returns True, incorrectly treating downloads_bak as inside downloads. Download handler:
# MobSF/views/home.py
@login_required
def download(request):
root = settings.DWD_DIR
filename = request.path.replace('/download/', '', 1)
dwd_file = Path(root) / filename # absolute 'filename' ignores 'root'
if '../' in filename or not is_safe_path(root, dwd_file):
return HttpResponseForbidden(...)
ext = dwd_file.suffix
if ext in settings.ALLOWED_EXTENSIONS and dwd_file.is_file():
return file_download(dwd_file, ...)
If the client supplies an absolute path in filename (starts with / or C:/), Path(root) / filename resolves to that absolute path; the flawed is_safe_path then accepts any sibling directory whose absolute path shares the same string prefix. The ../ check does not catch this.
Which file types are retrievable: Whatever is allowed by settings.ALLOWED_EXTENSIONS
PoC
Prereqs: authenticated user; standard install. Assume:
settings.DWD_DIR = /home/mobsf/.MobSF/downloads
Prepare a sibling directory with the same string prefix and a test file:
mkdir -p /home/mobsf/.MobSF/downloads_bak
echo "test" > /home/mobsf/.MobSF/downloads_bak/test.txt
As an authenticated user, request (note the leading / in the filename and the double/triple slash after /download/ to preserve it):
GET /download///home/mobsf/.MobSF/downloads_bak/test.txt HTTP/1.1
Host: <HOST>
Cookie: sessionid=<YOUR_SESSION>
Other working sibling directory names (if present):
…/downloads.old/...
…/downloads_backup/...
…/downloads1/...
…/downloads-archive/...
…/downloads 2024/... (URL-encoded space: downloads%202024)
Impact
Any authenticated user can download files (with allowed extensions) from sibling directories whose absolute paths start with the same string prefix as DWD_DIR.
- Record
PYSEC-2026-1672- CVSS 4.0
- 1.3 Low
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N/E:U - Updated
- 2026-11-02
Affected products
Affected packages
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2025-58161 is a low vulnerability (CVSS 1.3) in Mobsf Mobile-security-framework-mobsf, published September 2, 2025. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.83%, the 57th percentile. Fixed in mobsf 4.4.1.
References
github.com/MobSF/Mobile-Security-Framework-MobSF/security/advisories/GHSA-ccc3-fvfx-mw3v
github.com/MobSF/Mobile-Security-Framework-MobSF/commit/7f3bc086c028c1b50889cab8a15f7b59b7abdaf9
github.com/MobSF/Mobile-Security-Framework-MobSF/releases/tag/v4.4.1
github.com/advisories/GHSA-ccc3-fvfx-mw3v
github.com/CVEProject/cvelistV5/tree/main/cves/2025/58xxx/CVE-2025-58161.json
nvd.nist.gov/vuln/detail/CVE-2025-58161
github.com/MobSF/Mobile-Security-Framework-MobSF
pypi.org/project/mobsf