{"answers":{"affected":"2 open source packages ship an affected version, including postiz.","exploited":"There is no known exploitation of GHSA-89v5-38xr-9m4j in the wild and no public exploit code.","fix":"No fix has been published for GHSA-89v5-38xr-9m4j yet. Limit exposure of the affected software until one is available.","what":"GHSA-89v5-38xr-9m4j is a server-side request forgery vulnerability in postiz, published on 27 Mar 2026. Any signed-in user can exploit it over the network, with no action from the victim."},"fix_prompt":"Check this codebase for GHSA-89v5-38xr-9m4j and fix it if it is affected.\n\nWhat it is: GHSA-89v5-38xr-9m4j is a server-side request forgery vulnerability in postiz, published on 27 Mar 2026. Any signed-in user can exploit it over the network, with no action from the victim.\nExploitation: There is no known exploitation of GHSA-89v5-38xr-9m4j in the wild and no public exploit code.\n\nAffected packages and fixed versions:\n- postiz (npm): affected all versions up to 2.0.12; no fix listed\n- postiz (npm): affected all versions up to 2.0.12; no fix listed\n\nTask:\n1. Search the dependency manifests and lockfiles (for example package.json, package-lock.json, requirements.txt, poetry.lock, uv.lock, pom.xml, build.gradle, go.mod, Cargo.lock, Gemfile.lock) and any Dockerfiles for the affected packages, including transitive dependencies.\n2. If an affected version is in use, upgrade it to the fixed version for its release line with the project's package manager, so the lockfile is regenerated. Prefer the smallest upgrade that fixes it.\n3. If there is no fix, or the upgrade would break the build, do not guess: explain the risk and the safest workaround instead.\n4. Run the tests and summarise what changed and why.\n5. If nothing in the project is affected, say so and change nothing.\n\nReference: https://insights.sbomify.com/GHSA-89v5-38xr-9m4j/ (Markdown: https://insights.sbomify.com/GHSA-89v5-38xr-9m4j/index.md)","id":"GHSA-89v5-38xr-9m4j","markdown":"https://insights.sbomify.com/GHSA-89v5-38xr-9m4j/index.md","name":"GHSA-89v5-38xr-9m4j","record":{"aliases":[],"analysis":{"component_type":"web_application","fix_type":"patch","impacts":["data_read","security_bypass"],"network_reachable":"yes","non_default_config":false,"product_category":"Social media automation","requires_auth":"low_privilege","summary":"Attackers can exploit Server-Side Request Forgery in Postiz to access internal network resources or cloud metadata via unvalidated URL inputs in webhooks and feed loaders.","user_interaction":"not_required","vuln_class":"ssrf"},"analysis_generated_by":"qwen3.8-flash-next","assigner":null,"cpe":[],"cvss":{"score":null,"severity":null,"source":null,"vector":null,"version":null},"cwes":[],"description":"## Summary\n\nPostiz has multiple SSRF vulnerabilities where user-provided URLs are fetched server-side without any IP validation or SSRF protection.\n\n## Vulnerable Code\n\n### 1. Webhook Send Endpoint (Most Critical)\n\n**`apps/backend/src/api/routes/webhooks.controller.ts` lines 58-70:**\n```typescript\nasync sendWebhook(@Body() body: any, @Query('url') url: string) {\n  try {\n    await fetch(url, {  // No URL validation\n      method: 'POST',\n      body: JSON.stringify(body),\n      headers: { 'Content-Type': 'application/json' },\n    });\n  } catch (err) { }\n  return { send: true };\n}\n```\n\nAccepts arbitrary URL via query parameter and fetches directly.\n\n### 2. Stored Webhook Delivery\n\n**`apps/orchestrator/src/activities/post.activity.ts` lines 256-281:**\n```typescript\nasync sendWebhooks(postId: string, orgId: string, integrationId: string) {\n  const webhooks = await this._webhookService.getWebhooks(orgId);\n  return Promise.all(\n    webhooks.map(async (webhook) =\u003e {\n      await fetch(webhook.url, {  // Stored URL, no validation\n        method: 'POST',\n        body: JSON.stringify(post),\n      });\n    })\n  );\n}\n```\n\n### 3. RSS/XML Feed Parser\n\n**`libraries/nestjs-libraries/src/database/prisma/autopost/autopost.service.ts` line 135:**\n```typescript\nasync loadXML(url: string) {\n  const { items } = await parser.parseURL(url);  // No URL validation\n}\n```\n\n### 4. HTML Content Loader\n\n**`libraries/nestjs-libraries/src/database/prisma/autopost/autopost.service.ts` line 185:**\n```typescript\nasync loadUrl(url: string) {\n  const loadDom = new JSDOM(await (await fetch(url)).text());  // No validation\n}\n```\n\n## Missing Protections\n\n- No `request-filtering-agent` or SSRF library\n- No private IP range filtering\n- No cloud metadata endpoint blocking\n- No DNS rebinding protection\n- URL validation only via `@IsUrl()` decorator (format only, no IP check)\n\n## Attack Scenarios\n\n1. `POST /webhooks/send?url=http://169.254.169.254/latest/meta-data/` → AWS metadata theft\n2. `POST /autopost/send?url=http://127.0.0.1:6379` → Internal Redis access\n3. Create webhook with `http://10.0.0.1:8080/admin` → Internal service access on post publish\n\n## Impact\n\n- **Cloud metadata theft**: AWS/GCP/Azure credentials\n- **Internal network scanning**: Full access to private IP ranges\n- **Multiple entry points**: Webhooks, RSS feeds, URL loader all vulnerable","ecosystems":["npm"],"exploits":{"exploitdb":null,"first_seen":null,"github_poc":null,"max_poc_stars":null,"metasploit":null,"nuclei":null,"refs":[],"tier":null},"has_fix":false,"headline":"Postiz has Multiple SSRF Vectors - Webhooks, RSS Feed, URL Loader","id":"GHSA-89v5-38xr-9m4j","indexable":true,"kev":null,"kind":"advisory","links":{"ecosystem":"npm","product":null,"products":[],"type":"ssrf","year":"2026"},"n_packages":2,"n_references":null,"packages":[{"ecosystem":"npm","fixed":[],"introduced":["0"],"last_affected":["2.0.12"],"package":"postiz","purl":null,"source":"GHSA-89v5-38xr-9m4j"},{"ecosystem":"npm","fixed":[],"introduced":["0"],"last_affected":["2.0.12"],"package":"postiz","purl":"pkg:npm/postiz","source":"GHSA-89v5-38xr-9m4j"}],"products":null,"published":"2026-03-27","related":[],"sources":[{"class":"attribution","licence":"CC BY 4.0","name":"GitHub Advisory Database","prefix":"GHSA"}],"ssvc":{"automatable":null,"exploitation":null,"technical_impact":null},"state":null,"updated":null,"vendors":null},"summary":"Attackers can exploit Server-Side Request Forgery in Postiz to access internal network resources or cloud metadata via unvalidated URL inputs in webhooks and feed loaders.","url":"https://insights.sbomify.com/GHSA-89v5-38xr-9m4j/"}