SSRF nog niet dicht: cPanel-host onvalidated + fetches volgden redirects #100

Closed
opened 2026-05-26 18:23:33 +00:00 by jesse-a · 1 comment
Owner

Severity: MEDIUM

Mijn ronde-1 SSRF-fix had rejectInternalTarget() toegevoegd aan normalizeSiteUrl() in src/lib/wordpress.ts — maar:

  1. normalizeHost() in src/app/actions/wordpress-cpanel.ts deed géén privatehost-validatie. Een MANAGER kon zo een cPanel-host als 10.0.0.1:6379 invoeren en outbound fetches laten doen naar interne services.
  2. WP-health-check fetches gebruikten redirect: "follow". Een aanvaller die een legit-https-site bezit maar via een 30x naar http://169.254.169.254/... doorverwijst, bypaste de validatie.
  3. cPanel UAPI calls volgden ook redirects (redirect: undefined = default follow).

Fix:

  1. Nieuwe shared helper src/lib/url-security.ts met rejectInternalTarget() (verwijderd uit wordpress.ts en gecentraliseerd) + safeOutboundFetch() wrapper.
  2. wordpress-cpanel.ts normalizeHost() valideert nu via de helper.
  3. Alle fetches in src/lib/wordpress.ts en src/lib/cpanel.ts gebruiken redirect: "manual" en throwen op 3xx — een redirect-respons van een ge-validated target wordt expliciet geweigerd.

Files: src/lib/url-security.ts (nieuw), src/lib/wordpress.ts, src/lib/cpanel.ts, src/app/actions/wordpress-cpanel.ts

**Severity: MEDIUM** Mijn ronde-1 SSRF-fix had `rejectInternalTarget()` toegevoegd aan `normalizeSiteUrl()` in `src/lib/wordpress.ts` — maar: 1. `normalizeHost()` in `src/app/actions/wordpress-cpanel.ts` deed géén privatehost-validatie. Een MANAGER kon zo een cPanel-host als `10.0.0.1:6379` invoeren en outbound fetches laten doen naar interne services. 2. WP-health-check fetches gebruikten `redirect: "follow"`. Een aanvaller die een legit-https-site bezit maar via een 30x naar `http://169.254.169.254/...` doorverwijst, bypaste de validatie. 3. cPanel UAPI calls volgden ook redirects (`redirect: undefined` = default follow). **Fix**: 1. Nieuwe shared helper `src/lib/url-security.ts` met `rejectInternalTarget()` (verwijderd uit wordpress.ts en gecentraliseerd) + `safeOutboundFetch()` wrapper. 2. `wordpress-cpanel.ts normalizeHost()` valideert nu via de helper. 3. Alle fetches in `src/lib/wordpress.ts` en `src/lib/cpanel.ts` gebruiken `redirect: "manual"` en throwen op 3xx — een redirect-respons van een ge-validated target wordt expliciet geweigerd. **Files**: src/lib/url-security.ts (nieuw), src/lib/wordpress.ts, src/lib/cpanel.ts, src/app/actions/wordpress-cpanel.ts
Author
Owner

Opgelost in commit 8e18add.

Opgelost in commit 8e18add.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
jesse-a/OpenCRM#100
No description provided.