{"id":"CVE-2026-129165","kind":"vulnerability","aliases":["CVE-2026-129165"],"related":[],"title":"Tactical RMM: report preview lets authenticated users read server files","description":"Tactical RMM 0.17.0 through 1.6.1 contains an arbitrary file read in the /reporting/templates/preview/ endpoint because WeasyPrint resolves file:// links in user-supplied template_md and embeds the files in the returned PDF. Users with report management permission can read the Django SECRET_KEY, reused as the NATS password, and publish runscript commands to every managed agent.","summary":"Tactical RMM versions 0.17.0 through 1.6.1 resolve file:// links in user-supplied report templates and embed the files in a returned PDF. A user with report management permission can read the Django SECRET_KEY, which is reused as the NATS password, and then send runscript commands to every managed agent.","severity":"critical","cvss":9.4,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"Tactical RMM","fixed":[],"affected":">= 0.17.0, <= 1.6.1","ecosystem":"vendor"}],"ecosystems":[],"tags":["authenticated","django","nats","other","rmm","self-hosted","tactical-rmm"],"not_affected_if":["version-outside-range"],"how_to_check":"- Check the server's Tactical RMM version: 0.17.0 through 1.6.1 is affected.\n- List which users or roles hold report management/generate permission (Settings > Permissions); treat each as able to read server files.\n- Look for POST /reporting/templates/preview/ requests in API logs with file:// in template_md.\n- If exposure is suspected, rotate the Django SECRET_KEY (which also changes the NATS password) and review runscript activity in the audit log.","fix":null,"status":"open","published_at":"2026-11-13T18:17:41+00:00","first_seen_at":"2026-11-13T18:49:31+00:00","triaged_at":"2026-11-13T18:51:15+00:00","updated_at":"2026-11-13T18:52:37+00:00","category":"other","confidence":0.75,"triage":{"at":"2026-11-13T18:51:15Z","model":"claude-haiku-5-5","output":{"fix":"unknown","reach":"network","title":"Tactical RMM: report preview lets authenticated users read server files","impact":"high","summary":"Tactical RMM versions 0.17.0 through 1.6.1 resolve file:// links in user-supplied report templates and embed the files in a returned PDF. A user with report management permission can read the Django SECRET_KEY, which is reused as the NATS password, and then send runscript commands to every managed agent.","audience":"businesses","category":"other","nicknames":[],"who_cares":["tactical-rmm","self-hosted","django"],"confidence":0.7,"fix_status":"unknown","needs_auth":"yes","worst_case":"Attacker reads server secrets and runs commands on all managed agents","analyst_note":"Confirm the fixed version and any workaround from the NVD entry and the VulnCheck advisory; the sources here do not name a fix.","how_to_check":"- Check the installed Tactical RMM version against the affected range 0.17.0 through 1.6.1\n- Look for the /reporting/templates/preview/ endpoint in your deployment\n- unknown whether the sources give further checks","plain_action":"","product_name":"","needs_analyst":true,"not_affected_if":["version-outside-range"],"who_is_affected":"Tactical RMM deployments in the 0.17.0 through 1.6.1 range where users hold report management permission. The flaw is in the reporting template preview path, which passes file:// links to WeasyPrint. The sources do not say whether managed-hosting or default configurations are exposed.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"unknown","severity_if_unknown":"critical"},"cost_usd":0.000743,"input_tokens":4621,"output_tokens":562,"severity_before":"critical"},"analyst_status":"done","analyst_note":"Confirm the fixed version and any workaround from the NVD entry and the VulnCheck advisory; the sources here do not name a fix.","search":"'-129165':13A,16A '-2026':12A,15A '/reporting/templates/preview':92C '0.17.0':33B,82C '1.6.1':35B,84C 'agent':79B,135C 'arbitrari':87C 'authent':6A,19B 'command':75B,131C 'contain':85C 'cve':11A,14A 'django':20B,61B,120C 'emb':45B,105C 'endpoint':93C 'everi':77B,133C 'file':10A,47B,88C,107C 'host':26B 'key':63B,122C 'let':5A 'link':37B,97C 'manag':56B,78B,115C,134C 'md':103C 'nat':21B,69B,126C 'password':70B,127C 'pdf':51B,111C 'permiss':57B,116C 'preview':4A 'publish':129C 'read':8A,59B,89C,118C 'report':3A,42B,55B,114C 'resolv':36B,96C 'return':50B,110C 'reus':66B,123C 'rmm':2A,18A,23B,29B,31B,81C 'runscript':74B,130C 'secret':62B,121C 'self':25B 'self-host':24B 'send':73B 'server':9A 'suppli':41B,101C 'tactic':1A,28B,30B,80C 'tactical':17A 'tactical-rmm':27B 'templat':43B,102C 'user':7A,40B,53B,100C,112C 'user-suppli':39B,99C 'version':32B 'weasyprint':95C","nicknames":[],"mitigations":[],"who_affected":"Self-hosted Tactical RMM servers running 0.17.0 through 1.6.1 (1.6.1 is the latest release listed on GitHub). Exposed when an account holds report management permission: it can POST a template to /reporting/templates/preview/ and get server files back in a PDF. The researcher reports the Django SECRET_KEY (in local_settings.py) is reused as the NATS password, which would let the attacker send commands to every managed agent. Installs with no untrusted users holding report permission carry less risk, but the permission gives access to the whole fleet.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"none","audience":"businesses","plain_action":null,"pkeys":["rmm","tacticalrmm"],"ptokens":["rmm","tactical"],"labels":["authenticated","critical","django","nats","other","rmm","selfhosted","tacticalrmm"],"campaign_type":null,"search_a":"'-129165':13A,16A '-2026':12A,15A 'authent':6A 'cve':11A,14A 'file':10A 'let':5A 'preview':4A 'read':8A 'report':3A 'rmm':2A,18A 'server':9A 'tactic':1A 'tactical':17A 'user':7A","search_b":"'0.17.0':33B '1.6.1':35B 'agent':79B 'authent':19B 'command':75B 'django':20B,61B 'emb':45B 'everi':77B 'file':47B 'host':26B 'key':63B 'link':37B 'manag':56B,78B 'nat':21B,69B 'password':70B 'pdf':51B 'permiss':57B 'read':59B 'report':42B,55B 'resolv':36B 'return':50B 'reus':66B 'rmm':23B,29B,31B 'runscript':74B 'secret':62B 'self':25B 'self-host':24B 'send':73B 'suppli':41B 'tactic':28B,30B 'tactical-rmm':27B 'templat':43B 'user':40B,53B 'user-suppli':39B 'version':32B","search_c":"'/reporting/templates/preview':92C '0.17.0':82C '1.6.1':84C 'agent':135C 'arbitrari':87C 'command':131C 'contain':85C 'django':120C 'emb':105C 'endpoint':93C 'everi':133C 'file':88C,107C 'key':122C 'link':97C 'manag':115C,134C 'md':103C 'nat':126C 'password':127C 'pdf':111C 'permiss':116C 'publish':129C 'read':89C,118C 'report':114C 'resolv':96C 'return':110C 'reus':123C 'rmm':81C 'runscript':130C 'secret':121C 'suppli':101C 'tactic':80C 'templat':102C 'user':100C,112C 'user-suppli':99C 'weasyprint':95C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-11-13T18:17:41+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","cvss_by":"disclosure@vulncheck.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-129165","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-129165","severity":null,"published_at":"2026-11-13T18:17:41+00:00","modified_at":"2026-11-13T18:17:41+00:00","first_seen_at":"2026-11-13T18:49:31+00:00","fetched_at":"2026-11-13T18:49:31+00:00","note":null},{"source":"analyst","external_id":"CVE-2026-129165:3918","url":"https://vul.yulun.ac.cn/20261028/tacticalrmm/","severity":null,"published_at":"2026-11-13T18:52:37+00:00","modified_at":"2026-11-13T18:52:37+00:00","first_seen_at":"2026-11-13T18:52:37+00:00","fetched_at":"2026-11-13T18:52:37+00:00","note":"Researcher report (Wu Yulun) and VulnCheck advisory confirm the range 0.17.0-1.6.1 and the mechanism. Latest GitHub release is v1.6.1 (affected), no GitHub security advisory or fixed version found, so fix is none/unknown. No vendor statement, so nothing verified. No exploitation or PoC beyond the researcher's writeup. Recheck for a release after 1.6.1.","cites":["https://vul.yulun.ac.cn/20261028/tacticalrmm/","https://github.com/amidaware/tacticalrmm/releases"]}],"documents":[{"id":148622,"url":"https://www.vulncheck.com/advisories/tactical-rmm-0.17.0-through-1.6.1-arbitrary-file-read-via-report-preview","title":"Third-party advisory: www.vulncheck.com","kind":"advisory","source":"nvd","publisher":"research","text":null,"published_at":null,"relation":"advisory","confidence":null,"note":"Third-party advisory: www.vulncheck.com"},{"id":148645,"url":"https://vul.yulun.ac.cn/20261028/tacticalrmm/","title":"TacticalRMM Vulnerability Report (Wu Yulun)","kind":"advisory","source":"analyst","publisher":null,"text":null,"published_at":null,"relation":"describes","confidence":null,"note":null},{"id":148646,"url":"https://github.com/amidaware/tacticalrmm/releases","title":"tacticalrmm releases (latest v1.6.1)","kind":"release","source":"analyst","publisher":null,"text":null,"published_at":null,"relation":"mentions","confidence":null,"note":null}],"disclosures":[],"exploit_sources":[],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}