---
id: "CVE-2026-61738"
kind: "vulnerability"
aliases: ["CVE-2026-61738"]
title: "SOCFortress CoPilot: upload filename lets authenticated users overwrite server files"
severity: "critical"
cvss: 10.0
epss: null
exploited: false
status: "open"
category: "package"
products: []
ecosystems: []
tags: ["fastapi", "package", "python", "self-hosted", "socfortress-copilot"]
not_affected_if: ["no-scoutsuite-integration", "version-0.1.77-or-later"]
published_at: "2026-10-30T15:16:53+00:00"
first_seen_at: "2026-10-30T15:31:11+00:00"
updated_at: "2026-10-30T15:33:00+00:00"
sources: [{"source": "nvd", "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-61738", "first_seen_at": "2026-10-30T15:31:11+00:00"}]
---

# SOCFortress CoPilot: upload filename lets authenticated users overwrite server files

SOCFortress CoPilot's GCP ScoutSuite report upload passes the raw multipart filename straight into a file path without checking it, so a path-traversal filename can write uploaded JSON outside the report directory. An admin or analyst account can overwrite host files, and the reported backend runs as root, which can disrupt the application.

_Summary, check and fix written by a model from the sources; labelled as such._

## How to check

- Check the installed CoPilot version; affected versions are those before `0.1.77`.
- Look for the route `POST /api/scoutsuite/generate-gcp-report` in `backend/app/integrations/scoutsuite/routes/scoutsuite.py`.
- Check whether the backend process runs as root.

## Fix

- SOCFortress CoPilot: move to `0.1.77` or later, which removes caller-controlled filenames from the affected route.

## Timeline

- 2026-10-30T15:31:11+00:00 nvd https://nvd.nist.gov/vuln/detail/CVE-2026-61738

## From the sources

SOCFortress CoPilot focuses on providing a single pane of glass for all your security operations needs. Prior to 0.1.77, `POST /api/scoutsuite/generate-gcp-report` in `backend/app/integrations/scoutsuite/routes/scoutsuite.py` admits admin and analyst users and validates the uploaded content as `GCPScoutSuiteJSON`, but passes raw `file.filename` from the multipart header to `save_file_to_directory` in `backend/app/integrations/scoutsuite/services/scoutsuite.py`. The writer combines this filename with `scoutsuite-report` using `os.path.join` without sanitization or a resolved-path containment check. A traversal filename therefore writes the supplied JSON outside the intended report directory. In the reported root-running backend, the researcher demonstrated root-owned writes outside that directory and into the application source directory. This permits host-file overwrite subject to the accepted JSON-content constraint and can disrupt application operation; the demonstrated primitive does not establish unrestricted executable contents or unconditional cross-tenant confidentiality loss. Version 0.1.77 removes caller-controlled filenames from the affected route; unrestricted-content and direct-code-execution claims require separate curator reconciliation.

---

_Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai_
