{"id":"CVE-2026-61738","kind":"vulnerability","aliases":["CVE-2026-61738"],"related":[],"title":"SOCFortress CoPilot: upload filename lets authenticated users overwrite server files","description":"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.","summary":"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.","severity":"critical","cvss":10.0,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["fastapi","package","python","self-hosted","socfortress-copilot"],"not_affected_if":["no-scoutsuite-integration","version-0.1.77-or-later"],"how_to_check":"- Check the installed CoPilot version; affected versions are those before `0.1.77`.\n- Look for the route `POST /api/scoutsuite/generate-gcp-report` in `backend/app/integrations/scoutsuite/routes/scoutsuite.py`.\n- 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.","status":"open","published_at":"2026-10-30T15:16:53+00:00","first_seen_at":"2026-10-30T15:31:11+00:00","triaged_at":"2026-10-30T15:33:00+00:00","updated_at":"2026-10-30T15:33:00+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-10-30T15:33:00Z","model":"claude-haiku-5-5","output":{"fix":"- SOCFortress CoPilot: move to `0.1.77` or later, which removes caller-controlled filenames from the affected route.","reach":"network","title":"SOCFortress CoPilot: upload filename lets authenticated users overwrite server files","impact":"high","summary":"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.","audience":"businesses","category":"package","nicknames":[],"who_cares":["socfortress-copilot","self-hosted","python","fastapi"],"confidence":0.8,"fix_status":"available","needs_auth":"yes","worst_case":"Attacker overwrites host files as root, disrupting the application.","analyst_note":"Confirm the sources do not state whether the unrestricted-content and code-execution claims are reconciled; the NVD entry is the only source.","how_to_check":"- Check the installed CoPilot version; affected versions are those before `0.1.77`.\n- Look for the route `POST /api/scoutsuite/generate-gcp-report` in `backend/app/integrations/scoutsuite/routes/scoutsuite.py`.\n- Check whether the backend process runs as root.","plain_action":"","needs_analyst":true,"not_affected_if":["version-0.1.77-or-later","no-scoutsuite-integration"],"who_is_affected":"Teams running SOCFortress CoPilot before 0.1.77 where admin or analyst users can reach the GCP ScoutSuite report upload route. The flaw lives in how the backend builds file paths from the upload filename, so any deployment on that version with the route reachable by those roles is exposed. Deployments that have already moved to 0.1.77 or that never expose the backend to analyst users can skip it.","user_interaction":"no","needs_special_setup":"unknown","severity_if_unknown":"critical"},"cost_usd":0.000797,"input_tokens":4447,"output_tokens":705,"severity_before":"critical"},"analyst_status":null,"analyst_note":null,"search":"'-2026':12A,15A '-61738':13A,16A '/api/scoutsuite/generate-gcp-report':101C '0.1.77':99C,223C 'accept':196C 'account':64B 'admin':61B,105C 'admit':104C 'affect':231C 'analyst':63B,107C 'applic':80B,184C,204C 'authent':6A 'backend':72B,170C 'backend/app/integrations/scoutsuite/routes/scoutsuite.py':103C 'backend/app/integrations/scoutsuite/services/scoutsuite.py':130C 'caller':226C 'caller-control':225C 'check':44B,150C 'claim':241C 'code':239C 'combin':133C 'confidenti':220C 'constraint':200C 'contain':149C 'content':113C,199C,214C,235C 'control':227C 'copilot':2A,25B,27B,82C 'cross':218C 'cross-ten':217C 'curat':244C 'cve':11A,14A 'demonstr':173C,207C 'direct':238C 'direct-code-execut':237C 'directori':59B,128C,163C,180C,186C 'disrupt':78B,203C 'establish':211C 'execut':213C,240C 'fastapi':17B 'file':10A,41B,68B,126C,191C 'file.filename':119C 'filenam':4A,37B,51B,135C,153C,228C 'focus':83C 'gcp':29B 'gcpscoutsuitejson':115C 'glass':90C 'header':123C 'host':22B,67B,190C 'host-fil':189C 'intend':161C 'json':55B,158C,198C 'json-cont':197C 'let':5A 'loss':221C 'multipart':36B,122C 'need':96C 'oper':95C,205C 'os.path.join':141C 'outsid':56B,159C,178C 'overwrit':8A,66B,192C 'own':176C 'packag':18B 'pane':88C 'pass':33B,117C 'path':42B,49B,148C 'path-travers':48B 'permit':188C 'post':100C 'primit':208C 'prior':97C 'provid':85C 'python':19B 'raw':35B,118C 'reconcili':245C 'remov':224C 'report':31B,58B,71B,139C,162C,166C 'requir':242C 'research':172C 'resolv':147C 'resolved-path':146C 'root':75B,168C,175C 'root-own':174C 'root-run':167C 'rout':232C 'run':73B,169C 'sanit':143C 'save':125C 'scoutsuit':30B,138C 'scoutsuite-report':137C 'secur':94C 'self':21B 'self-host':20B 'separ':243C 'server':9A 'singl':87C 'socfortress':1A,24B,26B,81C 'socfortress-copilot':23B 'sourc':185C 'straight':38B 'subject':193C 'suppli':157C 'tenant':219C 'therefor':154C 'travers':50B,152C 'uncondit':216C 'unrestrict':212C,234C 'unrestricted-cont':233C 'upload':3A,32B,54B,112C 'use':140C 'user':7A,108C 'valid':110C 'version':222C 'without':43B,142C 'write':53B,155C,177C 'writer':132C","nicknames":[],"mitigations":[],"who_affected":"Teams running SOCFortress CoPilot before 0.1.77 where admin or analyst users can reach the GCP ScoutSuite report upload route. The flaw lives in how the backend builds file paths from the upload filename, so any deployment on that version with the route reachable by those roles is exposed. Deployments that have already moved to 0.1.77 or that never expose the backend to analyst users can skip it.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"businesses","plain_action":null,"first_public_at":"2026-10-30T15:16:53+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-61738","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-61738","severity":null,"published_at":"2026-10-30T15:16:53+00:00","modified_at":"2026-10-30T15:16:53+00:00","first_seen_at":"2026-10-30T15:31:11+00:00","fetched_at":"2026-10-30T15:31:11+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}