{"id":"GHSA-j5qp-p44g-2m49","title":"@asymmetric-effort/specifyjs: No redirect target validation in secureFetch","summary":"@asymmetric-effort/specifyjs: No redirect target validation in secureFetch","severity":"medium","cwe":["CWE-918"],"vendor":"asymmetric-effort","product":"@asymmetric-effort/specifyjs","ecosystem":"npm","affected":["@asymmetric-effort/specifyjs < 0.2.136"],"patched":["@asymmetric-effort/specifyjs 0.2.136"],"published":"2026-07-02","updated":"2026-07-02","source":"GHSA","sourceUrl":"https://github.com/advisories/GHSA-j5qp-p44g-2m49","references":[{"url":"https://github.com/asymmetric-effort/specifyjs/security/advisories/GHSA-j5qp-p44g-2m49"},{"url":"https://github.com/asymmetric-effort/specifyjs/commit/25d1fb491d99479efdf501f5f75e0bb80c908f0a"},{"url":"https://github.com/advisories/GHSA-j5qp-p44g-2m49"}],"tags":["ghsa","npm"],"ingestedAt":"2026-07-02T19:41:50.954Z","slug":"GHSA-j5qp-p44g-2m49","body":"## Overview\n\n## Finding\n\n**Location**: `core/src/shared/secure-fetch.ts`\n\n`assertSecureUrl` validated only the initial request URL. The `fetch()` API follows redirects by default (up to 20 hops). A request to a valid `https://` URL could redirect to `http://internal-service/` or other unvalidated destinations.\n\n## Status\n\n**Fixed in v0.2.136** — `secureFetch` now defaults to `redirect: 'error'` which rejects any redirect. Callers can override with `{ redirect: 'follow' }` if they trust the target.\n\n## Affected packages\n\n- `@asymmetric-effort/specifyjs < 0.2.136`\n\n## Remediation\n\nUpgrade to a patched release:\n\n- `@asymmetric-effort/specifyjs 0.2.136`","depth":"sunlit","depthScore":28,"depthScoreParts":{"impact":27.5,"likelihood":0,"exploitation":0,"ransomware":0},"changes":[]}