{"id":"CVE-2026-85736","kind":"vulnerability","aliases":["CVE-2026-85736"],"related":[],"title":"Chartbrew: connection cleanup lets a team user delete arbitrary server files","description":"Chartbrew is an open-source web application that can connect directly to databases and APIs and use the data to create charts. Prior to 5.2.3, connection creation or update stored attacker-chosen absolute SSL and SSH file paths, and later connection cleanup passed those stored paths to fs.unlink without a path restriction. The vulnerable surface is data-connection certificate and SSH-key cleanup when a connection is removed. A user with createOwn and deleteOwn permissions on their own team stores a target path in a connection and then deletes the connection to trigger cleanup; default self-signup grants teamOwner these permissions. The cleanup routine treats the stored SSL or SSH path as a managed certificate path and unlinks the referenced file; duplicateConnection provides a second advisory-identified trigger. The attacker must be able to create or update and then delete a connection on their own team. The default container runs Chartbrew as uid 0, while deployments with a less-privileged process are limited by that process's deletion permissions. The attacker can delete files such as /code/.env or application source, causing integrity loss and service disruption. This issue is fixed in version 5.2.3.","summary":"Chartbrew stored attacker-chosen SSL and SSH file paths on data connections and later passed them to fs.unlink when a connection was removed. A user with create and delete rights on their own team can delete arbitrary files on the server, such as the .env file or application source.","severity":"high","cvss":8.1,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["chartbrew","docker","node","package","self-hosted"],"not_affected_if":["managed-hosting","restricted-file-permissions","version-5.2.3-or-later"],"how_to_check":"- Check the installed Chartbrew version; affected versions are those before `5.2.3`.\n- Check whether the Chartbrew process runs as root (the default container runs as uid 0).\n- Check whether self-signup is enabled, since it grants teamOwner permissions by default.","fix":"- Upgrade Chartbrew to `5.2.3`.","status":"open","published_at":"2026-11-06T21:17:11+00:00","first_seen_at":"2026-11-06T21:45:08+00:00","triaged_at":"2026-11-06T21:46:34+00:00","updated_at":"2026-11-06T21:46:34+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-11-06T21:46:34Z","model":"claude-haiku-5-5","output":{"fix":"- Upgrade Chartbrew to `5.2.3`.","reach":"network","title":"Chartbrew: connection cleanup lets a team user delete arbitrary server files","impact":"high","summary":"Chartbrew stored attacker-chosen SSL and SSH file paths on data connections and later passed them to fs.unlink when a connection was removed. A user with create and delete rights on their own team can delete arbitrary files on the server, such as the .env file or application source.","audience":"businesses","category":"package","nicknames":[],"who_cares":["chartbrew","self-hosted","docker","node"],"confidence":0.8,"fix_status":"available","needs_auth":"yes","worst_case":"Arbitrary server files deleted, including secrets and application source","analyst_note":"","how_to_check":"- Check the installed Chartbrew version; affected versions are those before `5.2.3`.\n- Check whether the Chartbrew process runs as root (the default container runs as uid 0).\n- Check whether self-signup is enabled, since it grants teamOwner permissions by default.","plain_action":"","needs_analyst":false,"not_affected_if":["managed-hosting","version-5.2.3-or-later","restricted-file-permissions"],"who_is_affected":"Teams that run self-hosted Chartbrew below 5.2.3, especially deployments with self-signup enabled or running as root in the default container. Deployments where the process has limited file-deletion permissions are less exposed, and managed hosting is not the operator's responsibility to patch.","user_interaction":"no","needs_special_setup":"no","severity_if_unknown":"high"},"cost_usd":0.000732,"input_tokens":4537,"output_tokens":556,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-2026':13A,16A '-85736':14A,17A '/code/.env':258C '0':234C '5.2.3':100C,274C 'abl':213C 'absolut':109C 'advisori':206C 'advisory-identifi':205C 'api':90C 'applic':73B,82C,260C 'arbitrari':9A,62B 'attack':28B,107C,210C,252C 'attacker-chosen':27B,106C 'caus':262C 'certif':136C,194C 'chart':97C 'chartbrew':1A,18B,25B,75C,231C 'chosen':29B,108C 'cleanup':3A,118C,141C,172C,182C 'connect':2A,37B,46B,85C,101C,117C,135C,144C,164C,169C,222C 'contain':229C 'creat':52B,96C,215C 'createown':150C 'creation':102C 'cve':12A,15A 'data':36B,94C,134C 'data-connect':133C 'databas':88C 'default':173C,228C 'delet':8A,54B,61B,167C,220C,249C,254C 'deleteown':152C 'deploy':236C 'direct':86C 'disrupt':267C 'docker':19B 'duplicateconnect':201C 'env':70B 'file':11A,33B,63B,71B,113C,200C,255C 'fix':271C 'fs.unlink':43B,124C 'grant':177C 'host':24B 'identifi':207C 'integr':263C 'issu':269C 'key':140C 'later':39B,116C 'less':240C 'less-privileg':239C 'let':4A 'limit':244C 'loss':264C 'manag':193C 'must':211C 'node':20B 'open':79C 'open-sourc':78C 'packag':21B 'pass':40B,119C 'path':34B,114C,122C,127C,161C,190C,195C 'permiss':153C,180C,250C 'prior':98C 'privileg':241C 'process':242C,247C 'provid':202C 'referenc':199C 'remov':48B,146C 'restrict':128C 'right':55B 'routin':183C 'run':230C 'second':204C 'self':23B,175C 'self-host':22B 'self-signup':174C 'server':10A,66B 'servic':266C 'signup':176C 'sourc':74B,80C,261C 'ssh':32B,112C,139C,189C 'ssh-key':138C 'ssl':30B,110C,187C 'store':26B,105C,121C,158C,186C 'surfac':131C 'target':160C 'team':6A,59B,157C,226C 'teamown':178C 'treat':184C 'trigger':171C,208C 'uid':233C 'unlink':197C 'updat':104C,217C 'use':92C 'user':7A,50B,148C 'version':273C 'vulner':130C 'web':81C 'without':125C","nicknames":[],"mitigations":[],"who_affected":"Teams that run self-hosted Chartbrew below 5.2.3, especially deployments with self-signup enabled or running as root in the default container. Deployments where the process has limited file-deletion permissions are less exposed, and managed hosting is not the operator's responsibility to patch.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"businesses","plain_action":null,"pkeys":[],"ptokens":[],"labels":["chartbrew","docker","high","node","package","selfhosted"],"campaign_type":null,"search_a":"'-2026':13A,16A '-85736':14A,17A 'arbitrari':9A 'chartbrew':1A 'cleanup':3A 'connect':2A 'cve':12A,15A 'delet':8A 'file':11A 'let':4A 'server':10A 'team':6A 'user':7A","search_b":"'applic':73B 'arbitrari':62B 'attack':28B 'attacker-chosen':27B 'chartbrew':18B,25B 'chosen':29B 'connect':37B,46B 'creat':52B 'data':36B 'delet':54B,61B 'docker':19B 'env':70B 'file':33B,63B,71B 'fs.unlink':43B 'host':24B 'later':39B 'node':20B 'packag':21B 'pass':40B 'path':34B 'remov':48B 'right':55B 'self':23B 'self-host':22B 'server':66B 'sourc':74B 'ssh':32B 'ssl':30B 'store':26B 'team':59B 'user':50B","search_c":"'/code/.env':258C '0':234C '5.2.3':100C,274C 'abl':213C 'absolut':109C 'advisori':206C 'advisory-identifi':205C 'api':90C 'applic':82C,260C 'attack':107C,210C,252C 'attacker-chosen':106C 'caus':262C 'certif':136C,194C 'chart':97C 'chartbrew':75C,231C 'chosen':108C 'cleanup':118C,141C,172C,182C 'connect':85C,101C,117C,135C,144C,164C,169C,222C 'contain':229C 'creat':96C,215C 'createown':150C 'creation':102C 'data':94C,134C 'data-connect':133C 'databas':88C 'default':173C,228C 'delet':167C,220C,249C,254C 'deleteown':152C 'deploy':236C 'direct':86C 'disrupt':267C 'duplicateconnect':201C 'file':113C,200C,255C 'fix':271C 'fs.unlink':124C 'grant':177C 'identifi':207C 'integr':263C 'issu':269C 'key':140C 'later':116C 'less':240C 'less-privileg':239C 'limit':244C 'loss':264C 'manag':193C 'must':211C 'open':79C 'open-sourc':78C 'pass':119C 'path':114C,122C,127C,161C,190C,195C 'permiss':153C,180C,250C 'prior':98C 'privileg':241C 'process':242C,247C 'provid':202C 'referenc':199C 'remov':146C 'restrict':128C 'routin':183C 'run':230C 'second':204C 'self':175C 'self-signup':174C 'servic':266C 'signup':176C 'sourc':80C,261C 'ssh':112C,139C,189C 'ssh-key':138C 'ssl':110C,187C 'store':105C,121C,158C,186C 'surfac':131C 'target':160C 'team':157C,226C 'teamown':178C 'treat':184C 'trigger':171C,208C 'uid':233C 'unlink':197C 'updat':104C,217C 'use':92C 'user':148C 'version':273C 'vulner':130C 'web':81C 'without':125C","first_public_at":"2026-09-06T05:06:10+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-85736","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-85736","severity":null,"published_at":"2026-11-06T21:17:11+00:00","modified_at":"2026-11-06T21:17:11+00:00","first_seen_at":"2026-11-06T21:45:08+00:00","fetched_at":"2026-11-06T21:45:08+00:00","note":null}],"documents":[{"id":90355,"url":"https://github.com/chartbrew/chartbrew/commit/aa931cc868eff8c4343ae2263539fa2d0d4a0943","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":90344,"url":"https://github.com/chartbrew/chartbrew/releases/tag/v5.2.3","title":"Release notes: github.com","kind":"release","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Release notes: github.com"},{"id":90357,"url":"https://github.com/chartbrew/chartbrew/security/advisories/GHSA-p5h6-f969-jpfv","title":"Vendor advisory: github.com","kind":"vendor","source":"nvd","publisher":"vendor","text":null,"published_at":"2026-09-06T05:06:10+00:00","relation":"advisory","confidence":null,"note":"Vendor advisory: github.com"}],"exploit_sources":[],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}