Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain valid analyst/admin API token
-
DeliveryCraft valid GCP JSON body with traversal filename
-
ExploitPOST multipart to generate-gcp-report endpoint
-
ExecutionRoot-owned write to attacker-chosen host path
-
ImpactOverwrite module or drop cron job for RCE
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V5 - File Handling Path canonicalization, traversal prevention
MITRE ATT&CK
2 techniques across 2 tactics: Discovery, Collection The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires (1) a valid analyst- or admin-scoped bearer token, since the route is guarded by require_any_scope('admin','analyst') - it is NOT reachable unauthenticated despite the CVSS PR:N; (2) an uploaded body that passes GCPScoutSuiteJSON content validation (a syntactically valid GCP service-account JSON, trivial to supply); (3) a path-traversal payload placed in the multipart Content-Disposition filename, which Starlette does not sanitize; and (4) the backend running as root to write anywhere on the host - the default published ghcr.io image runs as root, maximizing impact. Affected versions are prior to 0.1.77. Limiting factors that reduce real-world risk below the raw 10.0: authentication is mandatory (analyst or admin), the uploaded content must validate as GCP JSON, and the arbitrary-write-to-RCE step depends on writing to an exploitable host path (cron directory, loaded Python module, startup script). Deployments that run the backend as a non-root user confine the write and prevent host-wide compromise. |
| Impact | This is a genuine act_now priority, not a high-CVSS-but-low-risk artifact: the GHSA advisory documents a concrete, confirmed-live arbitrary file write as root via unsanitized multipart filename in POST /api/scoutsuite/generate-gcp-report, trivially escalatable to RCE and full cross-tenant/connector-credential compromise. However, the signals conflict on one key point and must be stated plainly: the supplied CVSS 3.1 vector is AV:N/AC:L/PR:N/UI:N (unauthenticated), but the advisory and source show the route is guarded by require_any_scope('admin','analyst'), meaning a valid analyst- or admin-scoped token is actually required - so real-world exploitation is authenticated, and PR:N overstates reach; treat the practical privilege requirement as PR:L. The S:C/C:H/I:H/A:H and 10.0 score are justified by the root-level host write escaping the application sandbox. No EPSS score was provided (cannot gauge statistical exploitation probability), and the CVE is not indicated as present in CISA KEV, so there is no evidence of active in-the-wild exploitation despite the high severity. The mitigating factor - required admin/analyst authentication and a valid GCPScoutSuiteJSON body - narrows the threat to insiders or attackers who have already obtained operator credentials, but given that an analyst role (which should not have host access) suffices, and a working PoC is public, patching to 0.1.77 should be treated as urgent. |
| Exploit ScenarioDerived | An attacker holding a valid analyst or admin bearer token (an insider, or an operator whose token was phished/leaked) uploads a syntactically valid GCP service-account JSON to the GCP report endpoint while setting the multipart Content-Disposition filename to a path-traversal string such as ../../../../etc/cron.d/x. Because the backend runs as root and joins the raw filename without sanitization or a containment check, the content is written anywhere on the host, letting the attacker drop a cron job or overwrite an application Python module to achieve code execution. A public PoC with working curl commands, confirmed live by the researcher against the published ghcr.io image, is included in the GHSA advisory. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 30, 2026
Arbitrary host file write as root in SOCFortress CoPilot prior to 0.1.77: the ScoutSuite GCP report upload endpoint accepts a caller-supplied multipart filename and joins it with os.path.join into the scoutsuite-report directory, so a '../'-laden filename escapes the intended folder and writes attacker-controlled bytes anywhere the backend process can reach. Exploitation requires a valid analyst- or admin-scoped bearer token (the assessed vector is PR:L, not the PR:N shown in the original CVSS string) plus an uploaded body that passes GCPScoutSuiteJSON content validation, which a syntactically valid GCP service-account JSON satisfies trivially; because the published backend image runs as root, writes land root-owned in /tmp and in the application source directory. A proof-of-concept documented as confirmed live against the published ghcr.io/socfortress/copilot-backend image is public, and escalation to code execution depends on choosing an exploitable destination such as a cron directory, a loaded Python module or a startup script; the advisory's broader claims of unrestricted-content and unconditional cross-tenant compromise are not established by the demonstrated primitive. The issue is rated act_now because a working write primitive with root privileges in a default deployment is a direct path to full platform and stored connector-credential compromise, though the mandatory authentication, JSON content validation and non-root deployment architecture are genuine limiting factors. No CISA KEV entry is associated with this CVE.
RemediationAI
Vendor-released patch: upgrade SOCFortress CoPilot to 0.1.77 (tag v0.1.77) or later, which stops the route from using the caller-supplied filename and instead writes the uploaded credential to a private tempfile.mkdtemp(prefix='scoutsuite-gcp-cred-') directory under the fixed server-generated name gcp-service-account.json, removing that directory in a finally block after the scan. The change is delivered through https://github.com/socfortress/CoPilot/pull/940 and https://github.com/socfortress/CoPilot/pull/941, with commits https://github.com/socfortress/CoPilot/commit/1881ef8d28bc7f45ffa88d7ba4fcca7302355508 and https://github.com/socfortress/CoPilot/commit/bfa630b65d554670c7462a32ce6fd4e3cbd0254c; the advisory is https://github.com/socfortress/CoPilot/security/advisories/GHSA-q3g8-3cf7-744f. If upgrading immediately is not possible, apply the vendor's compensating measures: stop running the backend as root so that any traversal write is confined to paths writable by an unprivileged user and cannot reach cron directories, loaded Python modules or startup scripts, and restrict the analyst and admin roles that can reach POST /api/scoutsuite/generate-gcp-report, since the endpoint is only usable with a valid analyst- or admin-scoped bearer token. Note that running the backend as non-root does not fix the traversal itself and that it trades away whatever privileged host operations the container currently performs, so validate the deployment after the change; per the vendor, sanitising or server-generating the on-disk filename and pinning the resolved path inside the intended directory are the complete fixes delivered in 0.1.77.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The flaw is a classic CWE-22 path traversal in a Python/FastAPI (Starlette) service. Routes in backend/app/integrations/scoutsuite/routes/scoutsuite.py are guarded by Security(AuthHandler().require_any_scope('admin','analyst')), read the uploaded multipart file, validate only the CONTENT against a fixed GCPScoutSuiteJSON model via validate_json_data(), and then forward the raw file.filename taken from the Content-Disposition header to save_file_to_directory() in services/scoutsuite.py. That helper performs os.makedirs(directory, exist_ok=True) and file_path = os.path.join(directory, filename); os.path.join honours an absolute or traversal-containing second argument, and no basename normalisation, secure_filename call or resolved-path containment check (os.path.realpath plus commonpath) is applied. Starlette does not sanitise uploaded filenames, so the destination path is fully attacker-controlled while the file body must merely be well-formed GCP service-account JSON. Impact is magnified by the deployment context: the published ghcr.io/socfortress/copilot-backend image runs the backend as root with a working directory of /opt/copilot/backend, so writes can reach /tmp, the application source tree and system paths writable by root; non-root deployments confine the write to whatever that user can modify. The same codebase already handles the connector-upload route correctly with werkzeug.utils.secure_filename and an extension allow-list, which is the pattern the ScoutSuite route lacked. The upstream fix in PR 940 abandons caller filenames entirely, writing to a private tempfile.mkdtemp(prefix='scoutsuite-gcp-cred-') directory under a fixed server-generated name 'gcp-service-account.json', and also removes the credential in a finally block with shutil.rmtree, addressing a companion static-mount exposure tracked as GHSA-pm2w-mmc3-h8hc. The CPE cpe:2.3:a:socfortress:copilot:*:*:*:*:*:*:*:* records the product without version bounds, so version scoping must come from the advisory (prior to 0.1.77).
Know when Copilot gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Network-reachable HTTP endpoint with low complexity, but the route requires an analyst/admin token so PR:L (not PR:N); root host write escapes the app sandbox (S:C) yielding full C/I/A impact.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
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.
Technical POC Analysis
CWE-22: Improper Limitation of a Pathname to a Restricted Directory.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
CVE-2026-61738 is a critical arbitrary file write vulnerability in SOCFortress CoPilot (versions before 0.1.77) that allows an authenticated analyst to write attacker-controlled files as root, potentially leading to code execution. This could allow a compromised analyst account to escalate to full root control of the CoPilot backend, affecting the integrity and availability of security monitoring data and possibly the broader network. Leadership should prioritize immediate mitigation because the backend may run with elevated privileges and a public proof-of-concept is confirmed.
No vendor-released patch identified at time of analysis. Interim mitigations include: running the CoPilot backend as a non-root user; restricting the ScoutSuite GCP report upload endpoint to admin roles only; implementing filename validation to block path traversal sequences (e.g., '../'); monitoring file system writes to sensitive directories; and limiting network access to the CoPilot backend.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Path traversal exploits occur when applications use user-controlled input to construct file system paths without proper validation.
Authentication bypass in SOCFortress CoPilot versions prior to 0.1.57 allows remote unauthenticated attackers to forge a
Stored cross-site scripting in SOCFortress CoPilot lets any authenticated portal user, including the lowest-privilege cu
Unauthenticated active-response invocation and alert injection affect SOCFortress CoPilot deployments prior to 0.1.76 th
Unauthenticated disclosure of cloud credentials and audit data in SOCFortress CoPilot stems from the `/scoutsuite-report
Stored server-side template injection in SOCFortress CoPilot before 0.1.76 allows a customer_user - the lowest-privilege
Cross-tenant object-store writes in SOCFortress CoPilot before 0.1.76 let any authenticated customer_user (customer-port
Unauthenticated attackers can install detection-suppression rules in SOCFortress CoPilot deployments before 0.1.77 becau
Command injection in Microsoft Copilot allows an attacker to disclose confidential information when a victim invokes Cop
EUVD-2026-114001
NVD
CVE.org
EPSS
GitHub
Exploit-DB