Skip to content

BUG: Path traversal vulnerability in face search endpoint allows reading files outside image directories #1322

@g-k-s-03

Description

@g-k-s-03

Is there an existing issue for this?

  • I have searched the existing issues

What happened?

Is there an existing issue for this?

I have searched the existing issues and this has not been reported.

Describe the bug

In backend/app/routes/face_clusters.py lines 221-242, the file
path received from the request payload is used directly in
os.path.isfile() and open() without any boundary validation.

Code

file_path = request.body.get("image_path")
if os.path.isfile(file_path):
    with open(file_path, "rb") as f:
        data = f.read()

Problem

A path like ../../Documents/private.pdf or
../../AppData/Roaming/com.pictopy.app/settings.json
would pass the os.path.isfile() check and allow reading
files outside the intended image directories.

Impact

  • Read files outside designated image folders
  • Access PictoPy's own database and settings files
  • Access user's personal documents
  • Low risk currently (desktop-only) but becomes critical
    if network/sharing features are added in future

Expected Behavior

The backend should validate that the provided path stays
within the registered image directories before processing.

Proposed Fix

base_dir = os.path.abspath(ALLOWED_IMAGES_DIR)
requested = os.path.abspath(file_path)
if not requested.startswith(base_dir):
    raise HTTPException(
        status_code=400, 
        detail="Invalid file path"
    )

Classification

  • Type: Path Traversal / Directory Traversal
  • CWE: CWE-22
  • Severity: Low (desktop-only, local access required)

Steps to Reproduce

  1. Start PictoPy backend
  2. Send POST request to face search endpoint with
    image_path set to a path traversal payload
  3. Observe that files outside image directories are accessible

Environment

  • OS: Windows/Linux/macOS
  • PictoPy version: 1.1.0

Record

  • I agree to follow this project's Code of Conduct

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions