{"id":"CVE-2026-61707","kind":"vulnerability","aliases":["CVE-2026-61707"],"related":[],"title":"SOCFortress CoPilot: low-privilege users can run code via report templates","description":"SOCFortress CoPilot focuses on providing a single pane of glass for all your security operations needs. Prior to 0.1.76, in the reported deployment, case-report templates uploaded by `customer_user`, the lowest-privilege portal role, are later executed by non-sandboxed Jinja2 engines when an admin or analyst generates a report. The `/case-report-template/upload` route in `backend/app/incidents/routes/db_operations.py` validates only the filename-derived MIME type, not the template content. Templates share a global store without customer_code scoping, and `customer_user` can also list, download and delete them, allowing an attacker to replace a legitimate default template under the same name. In `backend/app/incidents/services/reports.py`, `render_document_with_context` uses `DocxTemplate` without a sandbox; in `backend/app/incidents/services/reports_pdf.py`, `render_html_template` uses a non-sandboxed `Environment` without autoescaping. Normal privileged requests to `POST /api/incidents/report/generate-report-docx` or `/generate-report-pdf` therefore evaluate attacker-controlled Jinja expressions as Python on the backend. The reported deployment executes commands as root, exposing all tenants' incident and SIEM data and stored connector credentials. The HTML/PDF wkhtmltopdf renderer additionally permits local-file reads and requests to internal services. This issue is fixed in version 0.1.76.","summary":"SOCFortress CoPilot, a security operations dashboard, runs case-report templates through unsandboxed Jinja2 engines, and the upload route does not check template content. A customer-level portal user can upload a malicious template that executes Python on the backend when an admin or analyst generates a report.","severity":"critical","cvss":9.0,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["incident-response","other","python","self-hosted","socfortress-copilot"],"not_affected_if":["no-customer-portal-users","version-0.1.76-or-later"],"how_to_check":"- Check the installed CoPilot version and confirm it is below `0.1.76`.\n- Check whether customer_user accounts can reach `/case-report-template/upload` in `backend/app/incidents/routes/db_operations.py`.\n- Look for uploaded case-report templates that were not created by an administrator.","fix":"- SOCFortress CoPilot: upgrade to `0.1.76`.","status":"open","published_at":"2026-10-29T22:17:05+00:00","first_seen_at":"2026-10-29T22:27:07+00:00","triaged_at":"2026-10-29T22:28:43+00:00","updated_at":"2026-10-29T22:28:43+00:00","category":"other","confidence":0.8,"triage":{"at":"2026-10-29T22:28:43Z","model":"claude-haiku-5-5","output":{"fix":"- SOCFortress CoPilot: upgrade to `0.1.76`.","reach":"unknown","title":"SOCFortress CoPilot: low-privilege users can run code via report templates","impact":"high","summary":"SOCFortress CoPilot, a security operations dashboard, runs case-report templates through unsandboxed Jinja2 engines, and the upload route does not check template content. A customer-level portal user can upload a malicious template that executes Python on the backend when an admin or analyst generates a report.","audience":"businesses","category":"other","nicknames":[],"who_cares":["socfortress-copilot","self-hosted","incident-response","python"],"confidence":0.8,"fix_status":"available","needs_auth":"yes","worst_case":"Code runs as root, exposing all tenants' incident data and connector credentials.","analyst_note":"","how_to_check":"- Check the installed CoPilot version and confirm it is below `0.1.76`.\n- Check whether customer_user accounts can reach `/case-report-template/upload` in `backend/app/incidents/routes/db_operations.py`.\n- Look for uploaded case-report templates that were not created by an administrator.","plain_action":"","needs_analyst":false,"not_affected_if":["version-0.1.76-or-later","no-customer-portal-users"],"who_is_affected":"Teams running SOCFortress CoPilot before 0.1.76 where customer-level portal users can upload case-report templates. Exposure depends on that role reaching the upload route and on an admin or analyst later generating a report, which runs the template. Deployments already on 0.1.76 or later are not affected.","user_interaction":"yes","needs_special_setup":"unknown","severity_if_unknown":"critical"},"cost_usd":0.001184,"input_tokens":4502,"output_tokens":1467,"severity_before":"critical"},"analyst_status":null,"analyst_note":null,"search":"'-2026':14A,17A '-61707':15A,18A '/api/incidents/report/generate-report-docx':211C '/case-report-template/upload':134C '/generate-report-pdf':213C '0.1.76':97C,265C 'addit':248C 'admin':73B,127C 'allow':169C 'also':163C 'analyst':75B,129C 'attack':171C,217C 'attacker-control':216C 'autoescap':205C 'backend':70B,225C 'backend/app/incidents/routes/db_operations.py':137C 'backend/app/incidents/services/reports.py':183C 'backend/app/incidents/services/reports_pdf.py':194C 'case':38B,103C 'case-report':37B,102C 'check':51B 'code':9A,157C 'command':230C 'connector':242C 'content':53B,149C 'context':187C 'control':218C 'copilot':2A,29B,31B,80C 'credenti':243C 'custom':56B,108C,156C,160C 'customer-level':55B 'cve':13A,16A 'dashboard':35B 'data':239C 'default':176C 'delet':167C 'deploy':101C,228C 'deriv':143C 'document':185C 'docxtempl':189C 'download':165C 'engin':44B,124C 'environ':203C 'evalu':215C 'execut':66B,118C,229C 'expos':233C 'express':220C 'file':252C 'filenam':142C 'filename-deriv':141C 'fix':262C 'focus':81C 'generat':76B,130C 'glass':88C 'global':153C 'host':26B 'html':196C 'html/pdf':245C 'incid':20B,236C 'incident-respons':19B 'intern':257C 'issu':260C 'jinja':219C 'jinja2':43B,123C 'later':117C 'legitim':175C 'level':57B 'list':164C 'local':251C 'local-fil':250C 'low':4A 'low-privileg':3A 'lowest':112C 'lowest-privileg':111C 'malici':63B 'mime':144C 'name':181C 'need':94C 'non':121C,201C 'non-sandbox':120C,200C 'normal':206C 'oper':34B,93C 'pane':86C 'permit':249C 'portal':58B,114C 'post':210C 'prior':95C 'privileg':5A,113C,207C 'provid':83C 'python':23B,67B,222C 'read':253C 'render':184C,195C,247C 'replac':173C 'report':11A,39B,78B,100C,104C,132C,227C 'request':208C,255C 'respons':21B 'role':115C 'root':232C 'rout':48B,135C 'run':8A,36B 'sandbox':122C,192C,202C 'scope':158C 'secur':33B,92C 'self':25B 'self-host':24B 'servic':258C 'share':151C 'siem':238C 'singl':85C 'socfortress':1A,28B,30B,79C 'socfortress-copilot':27B 'store':154C,241C 'templat':12A,40B,52B,64B,105C,148C,150C,177C,197C 'tenant':235C 'therefor':214C 'type':145C 'unsandbox':42B 'upload':47B,61B,106C 'use':188C,198C 'user':6A,59B,109C,161C 'valid':138C 'version':264C 'via':10A 'without':155C,190C,204C 'wkhtmltopdf':246C","nicknames":[],"mitigations":[],"who_affected":"Teams running SOCFortress CoPilot before 0.1.76 where customer-level portal users can upload case-report templates. Exposure depends on that role reaching the upload route and on an admin or analyst later generating a report, which runs the template. Deployments already on 0.1.76 or later are not affected.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"businesses","plain_action":null,"first_public_at":"2026-10-29T22:17:05+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:H","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-61707","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-61707","severity":null,"published_at":"2026-10-29T22:17:05+00:00","modified_at":"2026-10-29T22:17:05+00:00","first_seen_at":"2026-10-29T22:27:07+00:00","fetched_at":"2026-10-29T22:27:07+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"}