GHSA-89v5-38xr-9m4j — postiz
Fix: gitroomhq/postiz-app@0ad89ccGHSA-89v5-38xr-9m4j is a security vulnerability in postiz. No vendor fix is recorded yet; mitigation options are listed below.
Postiz has Multiple SSRF Vectors - Webhooks, RSS Feed, URL Loader
Real-World Exposure
How broadly this vulnerability is actually deployed: weekly install volume shows current usage, a proxy for how much of the ecosystem is exposed.
postiznpmDescription
Summary
Postiz has multiple SSRF vulnerabilities where user-provided URLs are fetched server-side without any IP validation or SSRF protection.
Vulnerable Code
1. Webhook Send Endpoint (Most Critical)
apps/backend/src/api/routes/webhooks.controller.ts lines 58-70:
async sendWebhook(@Body() body: any, @Query('url') url: string) {
try {
await fetch(url, { // No URL validation
method: 'POST',
body: JSON.stringify(body),
headers: { 'Content-Type': 'application/json' },
});
} catch (err) { }
return { send: true };
}
Accepts arbitrary URL via query parameter and fetches directly.
2. Stored Webhook Delivery
apps/orchestrator/src/activities/post.activity.ts lines 256-281:
async sendWebhooks(postId: string, orgId: string, integrationId: string) {
const webhooks = await this._webhookService.getWebhooks(orgId);
return Promise.all(
webhooks.map(async (webhook) => {
await fetch(webhook.url, { // Stored URL, no validation
method: 'POST',
body: JSON.stringify(post),
});
})
);
}
3. RSS/XML Feed Parser
libraries/nestjs-libraries/src/database/prisma/autopost/autopost.service.ts line 135:
async loadXML(url: string) {
const { items } = await parser.parseURL(url); // No URL validation
}
4. HTML Content Loader
libraries/nestjs-libraries/src/database/prisma/autopost/autopost.service.ts line 185:
async loadUrl(url: string) {
const loadDom = new JSDOM(await (await fetch(url)).text()); // No validation
}
Missing Protections
- No
request-filtering-agentor SSRF library - No private IP range filtering
- No cloud metadata endpoint blocking
- No DNS rebinding protection
- URL validation only via
@IsUrl()decorator (format only, no IP check)
Attack Scenarios
POST /webhooks/send?url=http://169.254.169.254/latest/meta-data/→ AWS metadata theftPOST /autopost/send?url=http://127.0.0.1:6379→ Internal Redis access- Create webhook with
http://10.0.0.1:8080/admin→ Internal service access on post publish
Impact
- Cloud metadata theft: AWS/GCP/Azure credentials
- Internal network scanning: Full access to private IP ranges
- Multiple entry points: Webhooks, RSS feeds, URL loader all vulnerable
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 📦npm | postiz | all versions | No fix |
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for postiz, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.
Remediation status
No patched version of postiz has shipped for GHSA-89v5-38xr-9m4j yet. Where your build allows, override or pin the dependency away from the vulnerable range, and apply any maintainer-recommended mitigation.
Mitigate without a patch
If you can't upgrade right away: gate or disable the affected feature, validate untrusted input at the boundary, and avoid passing attacker-controlled data into the vulnerable path. O3's runtime protection blocks exploitation in production as an interim safeguard until the upgrade lands.
How O3 protects you
O3 Security's impact-aware SCA analyses which vulnerable code paths your application actually calls, so a match like GHSA-89v5-38xr-9m4j can be triaged on real exposure rather than presence alone.
Tailored to GHSA-89v5-38xr-9m4j. Runtime protection reduces exposure until a permanent patch is applied and verified — it complements patching, it doesn't replace it.
Frequently Asked Questions
Is GHSA-89v5-38xr-9m4j in your dependencies?
O3 Security finds GHSA-89v5-38xr-9m4j across npm dependencies, including transitive ones, and its impact-aware SCA ranks findings by whether your code actually calls the vulnerable path.