{"id":"CVE-2026-78189","kind":"vulnerability","aliases":["CVE-2026-78189"],"related":[],"title":"WebDyne Perl: path traversal runs .psp files outside the document root","description":"WebDyne versions from 3.007 before 3.022 for Perl execute .psp files outside the document root via path traversal in the PSGI API route fallback.\n\nWhen a request matches no file, the PSGI handler retries it as an API route through api_filename. That keeps .. segments in the request path and only checks that the joined path starts with the document root, which a request for /../private passes.\n\nA remote attacker can run the embedded Perl in any .psp file the server can read, such as one uploaded to a directory outside the document root.","summary":"WebDyne, a Perl PSP template server, versions 3.007 before 3.022 let a remote request with ../ segments reach .psp files outside the document root through the PSGI API route fallback. An attacker who can place or reach a .psp file the server can read can get the embedded Perl code to run.","severity":"high","cvss":null,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["package","perl","psgi","self-hosted","webdyne"],"not_affected_if":["no-psgi-handler","version-3.022-or-later"],"how_to_check":"- Check the installed WebDyne version with `perl -MWebDyne -e 'print $WebDyne::VERSION'` or `cpanm --info WebDyne` (unknown if the sources do not say which command the vendor uses)\n- Confirm whether the app uses the PSGI handler and the API route fallback (unknown if the sources do not say how to confirm this)","fix":"- WebDyne: move to `3.022` or later (the affected range is 3.007 before 3.022)","status":"open","published_at":"2026-10-31T15:16:54+00:00","first_seen_at":"2026-10-31T15:36:19+00:00","triaged_at":"2026-10-31T15:36:40+00:00","updated_at":"2026-10-31T15:36:40+00:00","category":"package","confidence":0.7,"triage":{"at":"2026-10-31T15:36:40Z","model":"claude-haiku-5-5","output":{"fix":"- WebDyne: move to `3.022` or later (the affected range is 3.007 before 3.022)","reach":"internet","title":"WebDyne Perl: path traversal runs .psp files outside the document root","impact":"high","summary":"WebDyne, a Perl PSP template server, versions 3.007 before 3.022 let a remote request with ../ segments reach .psp files outside the document root through the PSGI API route fallback. An attacker who can place or reach a .psp file the server can read can get the embedded Perl code to run.","audience":"developers","category":"package","nicknames":[],"who_cares":["perl","webdyne","psgi","self-hosted"],"confidence":0.7,"fix_status":"available","needs_auth":"no","worst_case":"remote code runs as the server via embedded Perl","analyst_note":"Confirm whether the PSGI API route fallback is on by default and find the exact affected configuration at https://nvd.nist.gov/vuln/detail/CVE-2026-78189.","how_to_check":"- Check the installed WebDyne version with `perl -MWebDyne -e 'print $WebDyne::VERSION'` or `cpanm --info WebDyne` (unknown if the sources do not say which command the vendor uses)\n- Confirm whether the app uses the PSGI handler and the API route fallback (unknown if the sources do not say how to confirm this)","plain_action":"","needs_analyst":true,"not_affected_if":["version-3.022-or-later","no-psgi-handler"],"who_is_affected":"Teams that run WebDyne under PSGI with the API route fallback enabled are exposed, especially if any .psp file lives outside the document root or can be written by someone else. The sources describe a request for a path such as /../private passing the check. Teams on 3.022 or later, or not running WebDyne, can skip it.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"high"},"cost_usd":0.000749,"input_tokens":4183,"output_tokens":661,"severity_before":"unknown"},"analyst_status":null,"analyst_note":null,"search":"'-2026':13A,16A '-78189':14A,17A '/../private':141C '3.007':32B,79C '3.022':34B,81C 'api':51B,97C,113C,116C 'attack':55B,145C 'check':127C 'code':73B 'cve':12A,15A 'directori':165C 'document':10A,46B,89C,135C,168C 'embed':71B,149C 'execut':84C 'fallback':53B,99C 'file':7A,43B,63B,86C,105C,154C 'filenam':117C 'get':69B 'handler':108C 'host':23B 'join':130C 'keep':119C 'let':35B 'match':103C 'one':161C 'outsid':8A,44B,87C,166C 'packag':18B 'pass':142C 'path':3A,92C,124C,131C 'perl':2A,19B,27B,72B,83C,150C 'place':58B 'psgi':20B,50B,96C,107C 'psp':6A,28B,42B,62B,85C,153C 'reach':41B,60B 'read':67B,158C 'remot':37B,144C 'request':38B,102C,123C,139C 'retri':109C 'root':11A,47B,90C,136C,169C 'rout':52B,98C,114C 'run':5A,75B,147C 'segment':40B,120C 'self':22B 'self-host':21B 'server':30B,65B,156C 'start':132C 'templat':29B 'travers':4A,93C 'upload':162C 'version':31B,77C 'via':91C 'webdyn':1A,24B,25B,76C","nicknames":[],"mitigations":[],"who_affected":"Teams that run WebDyne under PSGI with the API route fallback enabled are exposed, especially if any .psp file lives outside the document root or can be written by someone else. The sources describe a request for a path such as /../private passing the check. Teams on 3.022 or later, or not running WebDyne, can skip it.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"first_public_at":"2026-10-31T15:16:54+00:00","kev":null,"cvss_vector":null,"cvss_by":null,"poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-78189","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-78189","severity":null,"published_at":"2026-10-31T15:16:54+00:00","modified_at":"2026-10-31T15:16:54+00:00","first_seen_at":"2026-10-31T15:36:19+00:00","fetched_at":"2026-10-31T15:36:19+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"}