Skip to content

Security: FileProcessor.process_file uses client-controlled filename as on-disk path #676

Description

@harshita-singh12

Flagged by CodeRabbit review on PR #675 (the logic is carried over verbatim from the original backend/Generator/main.py, so this predates the refactor).

Problem

backend/Generator/utilities.py -> FileProcessor.process_file() saves the uploaded file using file.filename directly:

file_path = os.path.join(self.upload_folder, file.filename)
file.save(file_path)

A crafted filename such as ../../app.py (or absolute paths / null bytes depending on the WSGI layer) escapes uploads/. Werkzeug's FileStorage.save does sanitize some cases, but relying on framework-level protection is fragile, and os.path.join itself will happily escape when given an absolute path.

Suggested fix

Keep the extension, discard the client-controlled path components:

import uuid

def process_file(self, file):
    ext = os.path.splitext(file.filename)[1].lower()
    safe_name = f"{uuid.uuid4().hex}{ext}"
    file_path = os.path.join(self.upload_folder, safe_name)
    ...

(Or os.path.basename(file.filename) at minimum, plus an allowlist of .txt/.pdf/.docx.)

Extra notes

  • The subsequent .endswith('.txt'/'.pdf'/'.docx') dispatch already implies an allowlist; enforcing it before saving closes the hole fully.
  • Happy to submit this as a PR once triaged.

No activity

Activity on this issue will appear here.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions