WP- en cPanel-fetches: DNS-resolutie naar privé-IP werd niet gecontroleerd #127

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

Severity: MEDIUM

Mijn ronde-1+3 SSRF-fixes valideerden alleen de hostname-string (IP-literal/localhost/interne-TLD-check). Een publieke hostname die via DNS naar een privé-IP wijst (interne-wp.example.com → 10.0.0.5) passeerde alle string-checks. Daarnaast had src/lib/wordpress.ts een eigen zwakkere duplicate van rejectInternalTarget die single-label-hosts niet blokkeerde.

Ook de TLS-socket-check in inspectSslCert() opende een verbinding naar de hostname zonder validatie van de geresolvede IP — DNS-rebinding tussen lookup en connect bleef mogelijk.

Fix:

  1. resolveAndValidateHost() in src/lib/url-security.ts: DNS-lookup + IP-range-check tegen privé (10.x, 172.16-31, 192.168, 127.x, 169.254, CGNAT 100.64-127, IPv6 loopback/link-local/ULA).
  2. Toegepast in cpanelUapi() (cpanel.ts) vóór elke fetch en in checkSite() (wordpress.ts) vóór de WP-health-fetches.
  3. inspectSslCert() bindt de TLS-socket nu op de geresolvede IP met servername als SNI voor cert-matching — DNS-rebinding-venster gedicht.
  4. Duplicate rejectInternalTarget uit wordpress.ts verwijderd, gebruik nu centrale helper.

Files: src/lib/url-security.ts, src/lib/wordpress.ts, src/lib/cpanel.ts

**Severity: MEDIUM** Mijn ronde-1+3 SSRF-fixes valideerden alleen de hostname-string (IP-literal/localhost/interne-TLD-check). Een publieke hostname die via DNS naar een privé-IP wijst (`interne-wp.example.com → 10.0.0.5`) passeerde alle string-checks. Daarnaast had `src/lib/wordpress.ts` een eigen zwakkere duplicate van `rejectInternalTarget` die single-label-hosts niet blokkeerde. Ook de TLS-socket-check in `inspectSslCert()` opende een verbinding naar de hostname zonder validatie van de geresolvede IP — DNS-rebinding tussen lookup en connect bleef mogelijk. **Fix**: 1. `resolveAndValidateHost()` in `src/lib/url-security.ts`: DNS-lookup + IP-range-check tegen privé (10.x, 172.16-31, 192.168, 127.x, 169.254, CGNAT 100.64-127, IPv6 loopback/link-local/ULA). 2. Toegepast in `cpanelUapi()` (cpanel.ts) vóór elke fetch en in `checkSite()` (wordpress.ts) vóór de WP-health-fetches. 3. `inspectSslCert()` bindt de TLS-socket nu op de geresolvede IP met `servername` als SNI voor cert-matching — DNS-rebinding-venster gedicht. 4. Duplicate `rejectInternalTarget` uit wordpress.ts verwijderd, gebruik nu centrale helper. **Files**: src/lib/url-security.ts, src/lib/wordpress.ts, src/lib/cpanel.ts
Author
Owner

Opgelost in commit de87b11.

Opgelost in commit de87b11.
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#127
No description provided.