Lookup for vulnerable packages by Package URL.

GET /api/packages/1043478?format=api
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "url": "http://public2.vulnerablecode.io/api/packages/1043478?format=api",
    "purl": "pkg:npm/%40astrojs/cloudflare@6.7.0",
    "type": "npm",
    "namespace": "@astrojs",
    "name": "cloudflare",
    "version": "6.7.0",
    "qualifiers": {},
    "subpath": "",
    "is_vulnerable": true,
    "next_non_vulnerable_version": "13.1.10",
    "latest_non_vulnerable_version": "13.1.10",
    "affected_by_vulnerabilities": [
        {
            "url": "http://public2.vulnerablecode.io/api/vulnerabilities/89409?format=api",
            "vulnerability_id": "VCID-na1j-5218-9fd7",
            "summary": "Cloudflare has SSRF via redirect following through its image-binding-transform endpoint (incomplete fix for GHSA-qpr4)\n## Summary\n\nThe `fetch()` call for remote images in `packages/integrations/cloudflare/src/utils/image-binding-transform.ts` (line 28) uses the default `redirect: 'follow'` behavior. This allows the Cloudflare Worker to follow HTTP redirects to arbitrary URLs, bypassing the `isRemoteAllowed()` domain allowlist check which only validates the initial URL.\n\nAll three other image fetch paths in the codebase correctly use `{ redirect: 'manual' }`. This is an incomplete fix for GHSA-qpr4-c339-7vq8.\n\nConfirmed on HEAD.\n\n## Root Cause\n\n`image-binding-transform.ts` line 28:\n\n    const content = await (isRemotePath(href) ? fetch(imageSrc) : assets.fetch(imageSrc));\n\nMissing `{ redirect: 'manual' }`. The three protected paths:\n\n    // image-passthrough-endpoint.ts:23\n    response = await fetch(href, { redirect: 'manual' });\n\n    // assets/endpoint/shared.ts:11\n    const res = await fetch(src, { redirect: 'manual' });\n\n    // assets/utils/remoteProbe.ts:53\n    const response = await fetch(url, { redirect: 'manual' });\n\n## PoC\n\nDemonstrated with Node.js that `fetch()` without `redirect: 'manual'` follows 302 redirects to arbitrary destinations:\n\n    # Server A (allowed domain) returns 302 → Server B (internal)\n    fetch('http://allowed:19741/img.jpg')                        → follows 302 → hits http://internal:19742/secret\n    fetch('http://allowed:19741/img.jpg', {redirect:'manual'})   → returns 302, internal server NOT hit\n\nAttack path: attacker finds an open redirect on an allowed domain, crafts `/_image?href=https://allowed-cdn.com/redirect?url=http://internal-service/`, and the Worker follows the redirect to the unauthorized destination.\n\n## Impact\n\nBypasses the `image.domains` and `image.remotePatterns` allowlist for the default Cloudflare image service (`cloudflare-binding`). Enables blind SSRF to domains not in the allowlist. Same vulnerability class as GHSA-qpr4-c339-7vq8 (HIGH) which fixed the passthrough endpoint but missed this one.\n\n## Suggested Fix\n\n    const content = await (isRemotePath(href) ? fetch(imageSrc, { redirect: 'manual' }) : assets.fetch(imageSrc));",
            "references": [
                {
                    "reference_url": "https://api.first.org/data/v1/epss?cve=CVE-2026-41321",
                    "reference_id": "",
                    "reference_type": "",
                    "scores": [
                        {
                            "value": "0.00047",
                            "scoring_system": "epss",
                            "scoring_elements": "0.14968",
                            "published_at": "2026-06-05T12:55:00Z"
                        },
                        {
                            "value": "0.00047",
                            "scoring_system": "epss",
                            "scoring_elements": "0.14868",
                            "published_at": "2026-06-09T12:55:00Z"
                        },
                        {
                            "value": "0.00047",
                            "scoring_system": "epss",
                            "scoring_elements": "0.14842",
                            "published_at": "2026-06-08T12:55:00Z"
                        },
                        {
                            "value": "0.00047",
                            "scoring_system": "epss",
                            "scoring_elements": "0.14924",
                            "published_at": "2026-06-07T12:55:00Z"
                        },
                        {
                            "value": "0.00047",
                            "scoring_system": "epss",
                            "scoring_elements": "0.14965",
                            "published_at": "2026-06-06T12:55:00Z"
                        }
                    ],
                    "url": "https://api.first.org/data/v1/epss?cve=CVE-2026-41321"
                },
                {
                    "reference_url": "https://github.com/withastro/astro",
                    "reference_id": "",
                    "reference_type": "",
                    "scores": [
                        {
                            "value": "2.2",
                            "scoring_system": "cvssv3.1",
                            "scoring_elements": "CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:N/I:N/A:L"
                        },
                        {
                            "value": "LOW",
                            "scoring_system": "generic_textual",
                            "scoring_elements": ""
                        }
                    ],
                    "url": "https://github.com/withastro/astro"
                },
                {
                    "reference_url": "https://github.com/withastro/astro/commit/a43eb4b40b4f81530e3c9b5e2959495900320433",
                    "reference_id": "",
                    "reference_type": "",
                    "scores": [
                        {
                            "value": "2.2",
                            "scoring_system": "cvssv3.1",
                            "scoring_elements": "CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:N/I:N/A:L"
                        },
                        {
                            "value": "LOW",
                            "scoring_system": "generic_textual",
                            "scoring_elements": ""
                        }
                    ],
                    "url": "https://github.com/withastro/astro/commit/a43eb4b40b4f81530e3c9b5e2959495900320433"
                },
                {
                    "reference_url": "https://github.com/withastro/astro/releases/tag/%40astrojs%2Fcloudflare%4013.1.10",
                    "reference_id": "",
                    "reference_type": "",
                    "scores": [
                        {
                            "value": "2.2",
                            "scoring_system": "cvssv3.1",
                            "scoring_elements": "CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:N/I:N/A:L"
                        },
                        {
                            "value": "LOW",
                            "scoring_system": "generic_textual",
                            "scoring_elements": ""
                        }
                    ],
                    "url": "https://github.com/withastro/astro/releases/tag/%40astrojs%2Fcloudflare%4013.1.10"
                },
                {
                    "reference_url": "https://github.com/withastro/astro/security/advisories/GHSA-88gm-j2wx-58h6",
                    "reference_id": "",
                    "reference_type": "",
                    "scores": [
                        {
                            "value": "2.2",
                            "scoring_system": "cvssv3.1",
                            "scoring_elements": "CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:N/I:N/A:L"
                        },
                        {
                            "value": "LOW",
                            "scoring_system": "cvssv3.1_qr",
                            "scoring_elements": ""
                        },
                        {
                            "value": "LOW",
                            "scoring_system": "generic_textual",
                            "scoring_elements": ""
                        },
                        {
                            "value": "Track",
                            "scoring_system": "ssvc",
                            "scoring_elements": "SSVCv2/E:P/A:N/T:P/P:M/B:A/M:M/D:T/2026-04-24T18:27:06Z/"
                        }
                    ],
                    "url": "https://github.com/withastro/astro/security/advisories/GHSA-88gm-j2wx-58h6"
                },
                {
                    "reference_url": "https://nvd.nist.gov/vuln/detail/CVE-2026-41321",
                    "reference_id": "",
                    "reference_type": "",
                    "scores": [
                        {
                            "value": "2.2",
                            "scoring_system": "cvssv3.1",
                            "scoring_elements": "CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:N/I:N/A:L"
                        },
                        {
                            "value": "LOW",
                            "scoring_system": "generic_textual",
                            "scoring_elements": ""
                        }
                    ],
                    "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-41321"
                },
                {
                    "reference_url": "https://github.com/advisories/GHSA-88gm-j2wx-58h6",
                    "reference_id": "GHSA-88gm-j2wx-58h6",
                    "reference_type": "",
                    "scores": [
                        {
                            "value": "LOW",
                            "scoring_system": "cvssv3.1_qr",
                            "scoring_elements": ""
                        }
                    ],
                    "url": "https://github.com/advisories/GHSA-88gm-j2wx-58h6"
                },
                {
                    "reference_url": "https://github.com/advisories/GHSA-qpr4-c339-7vq8",
                    "reference_id": "GHSA-qpr4-c339-7vq8",
                    "reference_type": "",
                    "scores": [
                        {
                            "value": "2.2",
                            "scoring_system": "cvssv3.1",
                            "scoring_elements": "CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:N/I:N/A:L"
                        },
                        {
                            "value": "LOW",
                            "scoring_system": "generic_textual",
                            "scoring_elements": ""
                        }
                    ],
                    "url": "https://github.com/advisories/GHSA-qpr4-c339-7vq8"
                }
            ],
            "fixed_packages": [
                {
                    "url": "http://public2.vulnerablecode.io/api/packages/110579?format=api",
                    "purl": "pkg:npm/%40astrojs/cloudflare@13.1.10",
                    "is_vulnerable": false,
                    "affected_by_vulnerabilities": [],
                    "resource_url": "http://public2.vulnerablecode.io/packages/pkg:npm/%2540astrojs/cloudflare@13.1.10"
                }
            ],
            "aliases": [
                "CVE-2026-41321",
                "GHSA-88gm-j2wx-58h6"
            ],
            "risk_score": 1.4,
            "exploitability": "0.5",
            "weighted_severity": "2.7",
            "resource_url": "http://public2.vulnerablecode.io/vulnerabilities/VCID-na1j-5218-9fd7"
        }
    ],
    "fixing_vulnerabilities": [],
    "risk_score": "1.4",
    "resource_url": "http://public2.vulnerablecode.io/packages/pkg:npm/%2540astrojs/cloudflare@6.7.0"
}