Pentest 2026-05-20 Pen-29-Befunde (LOW/INFO)
28.1 Restarbeit (URI-Schemata):
DANGEROUS_URI_SCHEMES jetzt vollstaendig – blob:, about:, ws:, wss:,
ldap:, dict: ergaenzt. http(s):, mailto:, tel: bewusst nicht
geblockt (legitime URLs in Notizfeldern).
29.1 Cyrillic-Homoglyph:
"jаvascript:" mit U+0430 lief durch die Regex. HOMOGLYPH_TO_ASCII-
Map (а→a, е→e, о→o, …, 13 Eintraege) wird VOR dem Scheme-Strip
angewendet.
29.2 Percent-Encoding:
"java%73cript:" und "java%2573cript:" umgingen den Filter.
percentDecode() laeuft jetzt iterativ bis zu 5 Runden.
29.3 Zero-Width-Joiner:
"javascript:" mit U+200B/200C/200D etc. zerteilte die Regex-
Matches. ZERO_WIDTH_CHARS-Regex strippt alle unsichtbaren Unicode-
Steuerzeichen, bevor irgendwas anderes laeuft.
28.3 Partial (PDF-Validierung tiefer):
Magic-Bytes allein reichten nicht – "%PDF-1.4\n#!/bin/bash" kam
durch. Jetzt zusaetzlich %%EOF-Marker in den letzten 1 KB +
Pattern-Scan der ersten 4 KB auf #!/, <script, <?php, <%, "MZ "
(PE-Header).
29.4 Email-Format-Validator:
neuer isValidEmail() lehnt Whitespace/Newlines (SMTP-Header-
Injection-Vektor) und Format-Muell ab. Verdrahtet in
create/update Customer + User + updatePortalSettings.
29.5 GET /api/providers/email 500 -> 404:
parseInt("email") = NaN, Prisma crashte. Controller validiert jetzt
Number.isFinite(id) und liefert 404.
Live-verifiziert auf dev: 13 Test-Cases (alle Schema-Varianten,
Homoglyphe, Percent, ZWJ, PDF-Validierung, Email-Format,
/providers/email) – alle erwarteten Antworten.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -120,6 +120,53 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
|
||||
- **Live-verifiziert**: 4867 Datensätze + 1 Datei in 13.2s
|
||||
wiederhergestellt, Log-Modal zeigt den vollständigen Verlauf.
|
||||
|
||||
- [x] **🛡️ Pentest 2026-05-20 Pen-29-Befunde (LOW/INFO)**
|
||||
- **28.1 Restarbeit**: `DANGEROUS_URI_SCHEMES` jetzt vollständig –
|
||||
`blob:`, `about:`, `ws:`, `wss:`, `ldap:`, `dict:` ergänzt. Bewusst
|
||||
NICHT geblockt: `http(s):`, `mailto:`, `tel:` (legitime URLs in
|
||||
Notizfeldern).
|
||||
- **29.1 Cyrillic-Homoglyph**: `jаvascript:` mit kyrillischem
|
||||
`а` (U+0430) lief vorher durch. `HOMOGLYPH_TO_ASCII`-Map mit den
|
||||
13 üblichen Spoofing-Buchstaben (а→a, е→e, о→o, …) wird VOR dem
|
||||
Scheme-Strip angewendet. Legitime Buchstaben außerhalb der Map
|
||||
bleiben unangetastet.
|
||||
- **29.2 Percent-Encoding**: `java%73cript:` umging die Regex.
|
||||
`percentDecode()` läuft jetzt iterativ bis zu 5 Runden (fängt
|
||||
auch `java%2573cript:` ab, das zuerst zu `java%73cript:` und
|
||||
dann zu `javascript:` wird).
|
||||
- **29.3 Zero-Width-Joiner**: `javascript:` mit U+200B/200C/200D
|
||||
etc. wird durch `ZERO_WIDTH_CHARS`-Regex entfernt, bevor irgendein
|
||||
Match läuft.
|
||||
- **28.3 Partial – PDF-Validierung tiefer**: nicht nur Magic-Bytes,
|
||||
sondern auch (1) `%%EOF`-Marker in den letzten 1 KB und (2)
|
||||
Pattern-Scan der ersten 4 KB auf `#!/`, `<script`, `<?php`, `<%`,
|
||||
`MZ ` (PE-Header). Dadurch wird `%PDF-1.4\n#!/bin/bash` jetzt
|
||||
sauber abgelehnt. Voll-PDF-Parsing wäre überzogen – die simplen
|
||||
Spoofs sind weg.
|
||||
- **29.4 Email-Format-Validator**: neuer `isValidEmail()` in
|
||||
sanitize.ts lehnt Whitespace/Newlines/Tabs (= SMTP-Header-
|
||||
Injection-Vektor wie `test@x.de\nBcc:attacker@…`) sowie Format-
|
||||
Müll wie `notanemail` ab. Verdrahtet in
|
||||
`createCustomer`/`updateCustomer`/`updatePortalSettings`/
|
||||
`createUser`/`updateUser`. Liefert 400.
|
||||
- **29.5 GET /api/providers/email 500 → 404**: `parseInt("email")`
|
||||
war `NaN`, Prisma-Query crashte. Controller validiert jetzt
|
||||
`Number.isFinite(id) && id ≥ 1` und liefert 404 ("Anbieter nicht
|
||||
gefunden"). Numerische IDs funktionieren weiter.
|
||||
- **Live-verifiziert** auf dev:
|
||||
- blob:/about:/ws:/wss:/ldap:/dict: alle → `blocked:`
|
||||
- `jаvascript:alert(1)` (cyr) → `blocked:alert(1)`
|
||||
- `java%73cript:alert(1)` → `blocked:alert(1)`
|
||||
- `java%2573cript:alert(1)` → `blocked:alert(1)`
|
||||
- ZWJ-Variante → `blocked:alert(1)`
|
||||
- `%PDF-1.4\n#!/bin/bash` → 400 + Datei gelöscht
|
||||
- PDF ohne `%%EOF` → 400
|
||||
- Echtes PDF mit `%%EOF` → 200
|
||||
- `email: "notanemail"` → 400
|
||||
- `email: "test@x.de\nBcc:..."` → 400
|
||||
- `GET /providers/email` → 404 (war 500)
|
||||
- `GET /providers/<valid_id>` → 200
|
||||
|
||||
- [x] **🛡️ Pentest 2026-05-20 Pen-28-Befunde (LOW/INFO)**
|
||||
- **28.1 URI-Schema unvollständig**: `DANGEROUS_URI_SCHEMES`-Regex
|
||||
erweitert um `file:` und `ftp:`. `ftp://evil.com/x.js` und
|
||||
|
||||
Reference in New Issue
Block a user