Files
opencrm/backend
duffyduck 71d3ea7a2e Pentest 51.1/51.2/51.3: IPv6 SSRF, CGNAT/Alibaba, Phone-CRLF
51.1 MEDIUM (IPv6-Ranges nicht zuverlässig geblockt):
- URL.hostname liefert IPv6 mit eckigen Klammern ("[::1]") –
  safeResolveHost strippt sie jetzt am Eingang, sonst greift
  weder net.isIP noch das Regex-Matching.
- PRIVATE_IP_PATTERNS auf Hex-Group-Boundaries gehoben:
  /^f[cd][0-9a-f]{2}:/i deckt fc00..fdff zuverlässig ab statt
  nur "f[cd]" am String-Anfang.
- Ausgeschriebene IPv6-Formen (0:0:0:0:0:0:0:1, 0:0:0:0:0:ffff:10.x)
  als eigene Patterns ergänzt; "[::1]" + "0:0:0:0:0:0:0:1" auch
  als BLOCKED_HOSTNAMES.
- fe80: zusätzlich für lange Form (/^fe80:0*:/i).

51.2 LOW (CGNAT + Alibaba Metadata):
- 100.64.0.0/10 (RFC 6598 Carrier-Grade-NAT) → BLOCKED_PATTERNS
- 100.100.100.200 (Alibaba Cloud Metadata) → BLOCKED_HOSTNAMES

51.3 LOW (CRLF in phone-Feldern):
- sanitizePhoneField in contract.service.ts: Allowlist
  /^[0-9+\-/(). ]{0,40}$/ – Whitespace bewusst auf literales
  Space, NICHT \s, weil \s sonst \r\n\t matched und den
  Header-Injection-Schutz aufhebt. Eingesetzt auf phoneNumber
  und areaCode in beiden Create-Pfaden und im Update-Pfad.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-01 19:06:40 +02:00
..
2026-01-29 01:16:54 +01:00