{"id":"CVE-2026-59179","kind":"vulnerability","aliases":["CVE-2026-59179"],"related":[],"title":"OpenHop: unauthenticated path traversal reads and deletes YAML files","description":"OpenHop is a tool for creating interactive data-flow diagrams. Prior to 0.3.7, `@openhop/server` passes unauthenticated flow route parameters from `GET /api/flows/:id` and `DELETE /api/flows/:id` in `packages/server/src/routes.ts` to `FlowStore.filePath()` in `packages/server/src/store.ts` without an identifier allow-list. The router applies `decodeURIComponent` to the id, and `path.join()` then normalizes traversal outside the configured flow directory after appending the .yaml extension. An attacker can read accessible YAML files as YAML-parsed JSON or permanently delete accessible .yaml files outside that directory, exposing configuration or secrets and disrupting dependent services. In `packages/server/src/index.ts`, CORS `origin: true` permits any browser origin, enabling a malicious webpage to target a loopback-bound instance. Docker deployments default to `HOST=0.0.0.0` and permit direct unauthenticated network access. This issue is fixed in repository release 0.3.7.","summary":"OpenHop's server takes a flow id from the URL and joins it into a file path without checking it, so an unauthenticated request can use traversal to read YAML files outside the flow directory or delete them. CORS is open to any origin, so a malicious webpage can also reach a server bound to localhost.","severity":"high","cvss":8.3,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["docker","node","openhop","package","self-hosted"],"not_affected_if":["loopback-only-no-browser-access","version-0.3.7-or-later"],"how_to_check":"- Check the installed `@openhop/server` version (`npm ls @openhop/server`); versions before `0.3.7` are affected.\n- Check whether the server is reachable from a network: look for `HOST=0.0.0.0` in the environment or Docker config.\n- Confirm the flow directory setting and whether it sits next to other `.yaml` configuration files.","fix":"- Upgrade `@openhop/server` to `0.3.7` or later.\n- Until upgraded, do not expose the server beyond localhost and avoid Docker defaults of `HOST=0.0.0.0`.\n- Back up YAML files outside the flow directory that the server could reach, and rotate any secrets stored in them if reads are suspected.","status":"open","published_at":"2026-10-28T14:17:04+00:00","first_seen_at":"2026-10-28T14:33:23+00:00","triaged_at":"2026-10-28T14:34:26+00:00","updated_at":"2026-10-28T14:34:26+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-10-28T14:34:26Z","model":"claude-haiku-5-5","output":{"fix":"- Upgrade `@openhop/server` to `0.3.7` or later.\n- Until upgraded, do not expose the server beyond localhost and avoid Docker defaults of `HOST=0.0.0.0`.\n- Back up YAML files outside the flow directory that the server could reach, and rotate any secrets stored in them if reads are suspected.","reach":"network","title":"OpenHop: unauthenticated path traversal reads and deletes YAML files","impact":"high","summary":"OpenHop's server takes a flow id from the URL and joins it into a file path without checking it, so an unauthenticated request can use traversal to read YAML files outside the flow directory or delete them. CORS is open to any origin, so a malicious webpage can also reach a server bound to localhost.","category":"package","nicknames":[],"who_cares":["openhop","node","self-hosted","docker"],"confidence":0.8,"needs_auth":"no","worst_case":"Attacker reads or deletes accessible YAML files, exposing secrets outside flow directory","analyst_note":"Check the NVD entry and the OpenHop 0.3.7 release for whether a user visiting a malicious page can trigger the CORS path without a network-reachable server.","how_to_check":"- Check the installed `@openhop/server` version (`npm ls @openhop/server`); versions before `0.3.7` are affected.\n- Check whether the server is reachable from a network: look for `HOST=0.0.0.0` in the environment or Docker config.\n- Confirm the flow directory setting and whether it sits next to other `.yaml` configuration files.","needs_analyst":true,"not_affected_if":["version-0.3.7-or-later","loopback-only-no-browser-access"],"who_is_affected":"Teams running OpenHop's `@openhop/server` before 0.3.7 are exposed. Exposure is worst on Docker deployments that bind to all interfaces, where no authentication is needed to reach the flow routes; loopback-only instances are still reachable through a malicious webpage thanks to the CORS setting.","user_interaction":"unknown","needs_special_setup":"no","severity_if_unknown":"high"},"cost_usd":0.000724,"input_tokens":3563,"output_tokens":736,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-2026':11A,14A '-59179':12A,15A '/api/flows':101C,105C '0.0.0.0':195C '0.3.7':92C,209C 'access':145C,156C,201C 'allow':117C 'allow-list':116C 'also':72B 'append':137C 'appli':121C 'attack':142C 'bound':76B,188C 'browser':177C 'check':41B 'configur':133C,163C 'cor':61B,172C 'creat':84C 'cve':10A,13A 'data':87C 'data-flow':86C 'decodeuricompon':122C 'default':192C 'delet':7A,59B,104C,155C 'depend':168C 'deploy':191C 'diagram':89C 'direct':198C 'directori':57B,135C,161C 'disrupt':167C 'docker':16B,190C 'enabl':179C 'expos':162C 'extens':140C 'file':9A,38B,53B,147C,158C 'fix':205C 'flow':28B,56B,88C,96C,134C 'flowstore.filepath':110C 'get':100C 'host':22B,194C 'id':29B,102C,106C,125C 'identifi':115C 'instanc':189C 'interact':85C 'issu':203C 'join':34B 'json':152C 'list':118C 'localhost':78B 'loopback':187C 'loopback-bound':186C 'malici':69B,181C 'network':200C 'node':17B 'normal':129C 'open':63B 'openhop':1A,18B,23B,79C 'openhop/server':93C 'origin':66B,173C,178C 'outsid':54B,131C,159C 'packag':19B 'packages/server/src/index.ts':171C 'packages/server/src/routes.ts':108C 'packages/server/src/store.ts':112C 'paramet':98C 'pars':151C 'pass':94C 'path':3A,39B 'path.join':127C 'perman':154C 'permit':175C,197C 'prior':90C 'reach':73B 'read':5A,51B,144C 'releas':208C 'repositori':207C 'request':46B 'rout':97C 'router':120C 'secret':165C 'self':21B 'self-host':20B 'server':25B,75B 'servic':169C 'take':26B 'target':184C 'tool':82C 'travers':4A,49B,130C 'true':174C 'unauthent':2A,45B,95C,199C 'url':32B 'use':48B 'webpag':70B,182C 'without':40B,113C 'yaml':8A,52B,139C,146C,150C,157C 'yaml-pars':149C","nicknames":[],"mitigations":[],"who_affected":"Teams running OpenHop's `@openhop/server` before 0.3.7 are exposed. Exposure is worst on Docker deployments that bind to all interfaces, where no authentication is needed to reach the flow routes; loopback-only instances are still reachable through a malicious webpage thanks to the CORS setting.","tier":"B","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-28T14:17:04+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:H/A:H","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-59179","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-59179","severity":null,"published_at":"2026-10-28T14:17:04+00:00","modified_at":"2026-10-28T14:17:04+00:00","first_seen_at":"2026-10-28T14:33:23+00:00","fetched_at":"2026-10-28T14:33:23+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"}