@aegis-scan/skills 0.1.1 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ATTRIBUTION.md +71 -20
- package/CHANGELOG.md +55 -0
- package/README.md +66 -18
- package/dist/bin.js +1 -1
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +17 -1
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +9 -2
- package/dist/commands/list.js.map +1 -1
- package/package.json +3 -2
- package/sbom.cdx.json +1 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/SKILL.md +305 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/abmahn-templates.md +306 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/aegis-integration.md +241 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/audit-patterns.md +277 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/bgh-urteile.md +167 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/branchenrecht.md +285 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/checklisten.md +276 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/dsgvo.md +238 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/international.md +163 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/it-recht.md +267 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/strafrecht-steuer.md +193 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/vertragsrecht.md +243 -0
- package/skills/defensive/README.md +33 -4
- package/skills/defensive/aegis-native/rls-defense/SKILL.md +174 -0
- package/skills/defensive/aegis-native/ssrf-defense/SKILL.md +179 -0
- package/skills/defensive/aegis-native/tenant-isolation-defense/SKILL.md +225 -0
- package/skills/mitre-mapped/README.md +36 -8
- package/skills/mitre-mapped/aegis-native/mapping-overview/SKILL.md +129 -0
- package/skills/mitre-mapped/aegis-native/t1078-valid-accounts/SKILL.md +136 -0
- package/skills/mitre-mapped/aegis-native/t1190-exploit-public-app/SKILL.md +108 -0
- package/skills/ops/README.md +39 -4
- package/skills/ops/aegis-native/escalation-runbook/SKILL.md +147 -0
- package/skills/ops/aegis-native/suppress-correctly/SKILL.md +196 -0
- package/skills/ops/aegis-native/triage-finding/SKILL.md +144 -0
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
# AEGIS-Integration
|
|
2
|
+
|
|
3
|
+
> Wenn das Projekt das AEGIS-Scanner-System hat (Indikator: `src/scanner/`-Folder
|
|
4
|
+
> mit tier1/tier2/tier3, oder `aegis.config.json` im Repo-Root), kann der
|
|
5
|
+
> brutaler-anwalt-Skill die AEGIS-Findings als Eingabe konsumieren und in
|
|
6
|
+
> rechtliche Bewertungen ueberfuehren.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Projekt-Erkennung
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
File-Indikatoren:
|
|
14
|
+
- /src/scanner/{tier1,tier2,tier3}/index.ts
|
|
15
|
+
- /aegis.config.json
|
|
16
|
+
- /aegis-reports/*.json
|
|
17
|
+
- package.json mit "aegis" oder "@aegis/*" deps oder scripts:aegis
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Wenn keiner davon vorhanden → AEGIS-Integration ueberspringen, normalen SCAN-Modus fahren.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## AEGIS-Modul-Mapping
|
|
25
|
+
|
|
26
|
+
### Tier-1 Module (Infrastruktur / Headers)
|
|
27
|
+
|
|
28
|
+
| AEGIS-Modul | Pruefung | Rechts-Bezug | Wenn AEGIS critical/high → Anwalt-Bewertung |
|
|
29
|
+
|------------|----------|--------------|---------------------------------------------|
|
|
30
|
+
| `dns.ts` / `dns.dnssec.ts` | DNS / DNSSEC-Validation | BSI-Empfehlung, NIS2 angemessene TOMs | Eher BSIG/NIS2-Layer, nicht direkt UWG-relevant |
|
|
31
|
+
| `geo-ip.ts` | Server-Standort | DSGVO Art. 44 (Drittlandtransfer) wenn US-Server | KRITISCH wenn Server in USA + keine Erwaehnung in DSE |
|
|
32
|
+
| `headers.ts` | Security-Headers (CSP, X-Frame, X-Content-Type) | BSI-Empfehlung, Art. 32 DSGVO TOMs | HOCH wenn fehlt + Datenpanne moeglich |
|
|
33
|
+
| `hsts-preload.ts` | HSTS-Aktivierung | BSI-Empfehlung | MITTEL — Empfehlung, kein direkter Verstoss |
|
|
34
|
+
| `http-status.ts` | Site-Erreichbarkeit | nicht direkt rechtlich | Nicht relevant fuer Anwalt |
|
|
35
|
+
| `lang-canonical.ts` | hreflang / canonical | SEO + DSGVO Sprachpflichten Art. 12 (verstaendlich) | NIEDRIG — nur bei mehrsprachiger Seite mit anderssprachigem DSE |
|
|
36
|
+
| `linked-pages.ts` | Footer-Pflicht-Links | § 5 DDG Impressum-Erreichbarkeit | KRITISCH wenn Impressum/DSE/AGB nicht in 2 Klicks |
|
|
37
|
+
| `ports.ts` | Offene Ports | BSI / NIS2 | Nicht direkt rechtlich |
|
|
38
|
+
| `schema-org.ts` | strukturierte Daten | SEO, nicht direkt rechtlich | NIEDRIG — bestenfalls Vertrauenssignal |
|
|
39
|
+
| `security-txt.ts` | security.txt | BSI-Empfehlung | NIEDRIG |
|
|
40
|
+
| `server-stack.ts` | Stack-Erkennung | bei veralteten Versionen → Art. 32 TOMs | HOCH wenn EOL-Versionen erkannt |
|
|
41
|
+
| `block-lists.ts` | Threat-Intel-Listen | Reputation, nicht direkt rechtlich | NIEDRIG |
|
|
42
|
+
|
|
43
|
+
### Tier-2 Module (DSGVO-Kern)
|
|
44
|
+
|
|
45
|
+
| AEGIS-Modul | Pruefung | Rechts-Bezug | Wenn AEGIS critical/high |
|
|
46
|
+
|------------|----------|--------------|--------------------------|
|
|
47
|
+
| `cookie-audit.ts` | Cookie-Inventar vor Consent | § 25 TTDSG, Art. 6 DSGVO | KRITISCH — direkt abmahnbar (LG Muenchen, OLG Koeln) |
|
|
48
|
+
| `embeds-consent.ts` | Iframe/Embed vor Consent | Art. 26 DSGVO Mit-Verantwortlichkeit (Fashion-ID) | KRITISCH — Vimeo/YouTube/Spotify ohne Consent → Verstoss |
|
|
49
|
+
| `font-provider.ts` | Externe Fonts | LG Muenchen 3 O 17493/20 | KRITISCH — Google Fonts extern = Massen-Abmahn-Risiko |
|
|
50
|
+
| `links-footer.ts` | Footer-Pflicht-Links | § 5 DDG, § 13 DSGVO | KRITISCH wenn Impressum/DSE-Link fehlt |
|
|
51
|
+
| `tracking-scan.ts` | Tracker vor Consent | § 25 TTDSG | KRITISCH — Google Analytics/Pixel ohne Consent |
|
|
52
|
+
|
|
53
|
+
### Tier-3 Module (Rechtliche Vollpruefung)
|
|
54
|
+
|
|
55
|
+
| AEGIS-Modul | Pruefung | Rechts-Bezug | Wenn AEGIS critical/high |
|
|
56
|
+
|------------|----------|--------------|--------------------------|
|
|
57
|
+
| `a11y.ts` | Barrierefreiheit | BFSG (ab 28.06.2025 verpflichtend!) | HOCH — ab Jun 2025 abmahnbar fuer B2C-Sites |
|
|
58
|
+
| `branche.ts` | Branchen-spezifische Pflichten | BORA, HOAI, HWG, LMIV, MPDG | KRITISCH wenn Branche identifiziert + Pflichten fehlen |
|
|
59
|
+
| `carbon.ts` / `carbon-status.ts` | CO2-Footprint | Nicht direkt rechtlich (noch) | NIEDRIG — kann unter Greenwashing-UWG fallen |
|
|
60
|
+
| `cookie-compliance.ts` | Cookie-Banner-Compliance Detail | § 25 TTDSG + Art. 7 DSGVO | KRITISCH bei Pre-Tick / Cookie-Wall / Dark-Pattern |
|
|
61
|
+
| `datenschutz-check.ts` | DSE-Vollpruefung | Art. 13/14 DSGVO | KRITISCH bei fehlenden Pflichtangaben |
|
|
62
|
+
| `impressum-check.ts` | Impressum-Vollpruefung | § 5 DDG | KRITISCH bei fehlenden Pflichtangaben |
|
|
63
|
+
| `lighthouse.ts` | Performance / SEO / A11y | Mittelbar BFSG/Verbraucherschutz | MITTEL |
|
|
64
|
+
| `seo-quality.ts` | SEO-Audit | UWG bei Black-Hat / Schleichwerbung | NIEDRIG-MITTEL |
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Schweregrad-Mapping AEGIS → Anwalt
|
|
69
|
+
|
|
70
|
+
| AEGIS-Severity | Anwalt-Kritikalitaet | Wahrsch.-Default | Bemerkung |
|
|
71
|
+
|----------------|---------------------|------------------|-----------|
|
|
72
|
+
| `critical` | 🔴 KRITISCH | 70–95 % | direkt verifiziert; Wahrsch. konkret aus Branche/Sichtbarkeit |
|
|
73
|
+
| `high` | 🟡 HOCH | 40–70 % | verifiziert mit potentieller Schutzlinie |
|
|
74
|
+
| `medium` | 🟢 MITTEL | 10–40 % | nur wenn weitere Faktoren zusammenkommen |
|
|
75
|
+
| `low` | (i.d.R. ignorieren) | < 10 % | nur erwaehnen, nicht in Findings-Tabelle |
|
|
76
|
+
| `info` | (ignorieren) | n/a | Hintergrund-Info, kein Finding |
|
|
77
|
+
|
|
78
|
+
**CHALLENGER-Test fuer AEGIS-Findings**:
|
|
79
|
+
- AEGIS findet technisch X (z.B. fehlender HSTS-Header).
|
|
80
|
+
- Frage: Hat das DIRECT rechtliche Konsequenz, oder nur indirekt ueber Datenpanne-Auswirkung?
|
|
81
|
+
- Wenn nur indirekt → Finding nicht als KRITISCH einstufen, sondern als MITTEL mit Hinweis „TOM-Empfehlung Art. 32 DSGVO, kein Direktverstoss".
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Konsumieren von AEGIS-JSON-Output
|
|
86
|
+
|
|
87
|
+
AEGIS-Output-Format (typisch, kann projektspezifisch variieren):
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"url": "https://example.com",
|
|
92
|
+
"scannedAt": "2026-04-27T20:15:00Z",
|
|
93
|
+
"score": 950,
|
|
94
|
+
"grade": "S",
|
|
95
|
+
"tier1": {
|
|
96
|
+
"headers": { "severity": "high", "findings": [...] }
|
|
97
|
+
},
|
|
98
|
+
"tier2": {
|
|
99
|
+
"cookie-audit": { "severity": "critical", "findings": [
|
|
100
|
+
{ "name": "_ga", "category": "analytics", "setBeforeConsent": true }
|
|
101
|
+
]}
|
|
102
|
+
},
|
|
103
|
+
"tier3": { ... }
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Skill-Vorgehen**:
|
|
108
|
+
1. Lese JSON aus `aegis-reports/latest.json` oder `/tmp/aegis-scan.json`.
|
|
109
|
+
2. Iteriere ueber alle Module. Fuer jedes Modul mit severity `critical|high`:
|
|
110
|
+
- Mappe via Tabelle oben auf Rechts-Bezug.
|
|
111
|
+
- HUNTER notiert das als Finding.
|
|
112
|
+
3. CHALLENGER prueft jedes Finding gegen den Modul-spezifischen Test (siehe Bemerkungs-Spalte oben).
|
|
113
|
+
4. SYNTHESIZER konsolidiert + erkennt Cross-Risiken (z.B. fehlender Impressum-Link in Footer + DSE-Verstoss = doppeltes Abmahnrisiko ueber UWG § 3a).
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Cross-Module-Patterns (Synthesizer)
|
|
118
|
+
|
|
119
|
+
Wenn mehrere AEGIS-Findings zusammenkommen, kombiniere sie:
|
|
120
|
+
|
|
121
|
+
| AEGIS-Findings (zusammen) | Synthesizer-Cross-Risiko |
|
|
122
|
+
|---------------------------|--------------------------|
|
|
123
|
+
| `cookie-audit critical` + `tracking-scan critical` | Verdoppelter § 25 TTDSG-Hebel; Abmahn-Wahrsch. > 80% wenn Site B2C-DACH |
|
|
124
|
+
| `font-provider critical` + `embeds-consent critical` | Google-Fonts-Welle 2022 Pattern; mehrere Abmahn-Anwaelte aktiv; € 170-500 pro Fall |
|
|
125
|
+
| `impressum-check critical` + `linked-pages critical` (Footer) | UWG § 3a Marktverhaltensregel; jeder Mitbewerber kann abmahnen |
|
|
126
|
+
| `datenschutz-check critical` + `branche.ts critical` | DSGVO + branchenrechtliche Pflicht (z.B. BORA, HWG); doppeltes Bussgeldrisiko |
|
|
127
|
+
| `geo-ip US` + `tracking-scan` (US-Tracker) + `datenschutz-check` (kein Drittland-Hinweis) | Schrems-II-Kombi; Bussgeldrisiko Stufe 2 |
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Beispiel-Output bei AEGIS-Input
|
|
132
|
+
|
|
133
|
+
Wenn das Projekt einen AEGIS-Scan mit folgenden critical-Findings hat:
|
|
134
|
+
- `cookie-audit`: Google Analytics setzt `_ga` vor Consent
|
|
135
|
+
- `font-provider`: 3x `fonts.googleapis.com` extern eingebunden
|
|
136
|
+
- `impressum-check`: Telefonnummer fehlt
|
|
137
|
+
|
|
138
|
+
dann generiert HUNTER:
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
Finding 1: Tracking-Cookie vor Consent (cookie-audit)
|
|
142
|
+
- Wahrsch.: 87% (B2C-DACH-Site, sichtbar, Konkurrenz aktiv)
|
|
143
|
+
- Kritikalitaet: 🔴 KRITISCH
|
|
144
|
+
- §: 25 TTDSG + Art. 6 DSGVO
|
|
145
|
+
- €-Range: 5.000–15.000 (UWG-Streitwert) + bis 4 % JU (DSGVO-Bussgeld)
|
|
146
|
+
- Belege: EuGH C-673/17 Planet49, BGH I ZR 7/16
|
|
147
|
+
|
|
148
|
+
Finding 2: Externe Google Fonts (font-provider)
|
|
149
|
+
- Wahrsch.: 92% (LG-Muenchen-Welle aktiv, Massen-Abmahnung)
|
|
150
|
+
- Kritikalitaet: 🔴 KRITISCH
|
|
151
|
+
- §: Art. 6 DSGVO + § 13 GG
|
|
152
|
+
- €-Range: 170-500 pro Abmahnung; bei Welle: x10-x100
|
|
153
|
+
- Belege: LG Muenchen I 3 O 17493/20
|
|
154
|
+
|
|
155
|
+
Finding 3: Impressum unvollstaendig (impressum-check)
|
|
156
|
+
- Wahrsch.: 64% (UWG-Mitbewerber-Abmahnungen aktiv)
|
|
157
|
+
- Kritikalitaet: 🟡 HOCH
|
|
158
|
+
- §: § 5 DDG (Telefon empfohlen, nicht zwingend; Mail Pflicht)
|
|
159
|
+
- €-Range: 800–4.000 (UWG-Streitwert)
|
|
160
|
+
- Belege: KG Berlin 5 U 87/19, allg. UWG-Abmahnpraxis
|
|
161
|
+
|
|
162
|
+
CHALLENGER-Tests:
|
|
163
|
+
- Finding 1: Verifiziert (Tracker fix vor Consent → keine Schutz-Linie).
|
|
164
|
+
- Finding 2: Verifiziert (Font extern, kein Loading-Trick erkennbar).
|
|
165
|
+
- Finding 3: Disputed → § 5 DDG verlangt nicht zwingend Telefon (E-Mail reicht).
|
|
166
|
+
Downgrade auf MITTEL, 31% Wahrsch., €-Range 0-1.500.
|
|
167
|
+
|
|
168
|
+
SYNTHESIZER:
|
|
169
|
+
- Cross-Risiko: Finding 1 + Finding 2 = doppelter UWG § 3a-Hebel.
|
|
170
|
+
Kombinierter Streitwert: 25.000 €. Massen-Abmahn-Welle moeglich.
|
|
171
|
+
- Worst-Case-Frist: 6-8 Wochen bis erste Abmahnung wahrscheinlich.
|
|
172
|
+
- Top-Fix-Prio: 1) Cookie-Banner Consent-vor-Tracker, 2) Fonts lokal hosten,
|
|
173
|
+
3) Impressum optional vervollstaendigen.
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Trigger-Pattern in Code
|
|
179
|
+
|
|
180
|
+
Wenn der User in einem AEGIS-Repo arbeitet und Audit anfragt:
|
|
181
|
+
|
|
182
|
+
```
|
|
183
|
+
1. Pruefe ob aktueller AEGIS-Scan-Output existiert:
|
|
184
|
+
- aegis-reports/latest.json
|
|
185
|
+
- /tmp/aegis-scan-${timestamp}.json
|
|
186
|
+
|
|
187
|
+
2. Wenn ja → konsumiere als HUNTER-Eingabe
|
|
188
|
+
Wenn nein → schlage Scan-Run vor:
|
|
189
|
+
`pnpm aegis scan` oder `npm run aegis:scan` (je nach package.json)
|
|
190
|
+
|
|
191
|
+
3. Nach Scan: Konsumiere JSON, fuehre Multi-Persona-Audit aus.
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## A.E.G.I.S Standalone-CLI (optional Add-On)
|
|
197
|
+
|
|
198
|
+
Es gibt ZUSAETZLICH den **a.e.g.i.s** Standalone-Scanner als open-source npm-Paket (MIT-Lizenz):
|
|
199
|
+
|
|
200
|
+
- **Repo**: https://github.com/RideMatch1/a.e.g.i.s
|
|
201
|
+
- **NPM**: `@aegis-scan/cli`
|
|
202
|
+
- **Stack**: Next.js + Supabase + React (framework-spezifische Rules)
|
|
203
|
+
- **Komponenten**: 40 regex-Scanner + 1 AST-Taint-Analyzer + 1 RPC-SQLi-Scanner + 16 external-tool-Wrapper (Semgrep, Gitleaks, ZAP, Trivy, Nuclei, Bearer, Checkov, Hadolint, TruffleHog, OSV-Scanner, testssl.sh, React Doctor, Lighthouse, Axe, ...) + 5 live-attack-Probes + 4 Compliance-Frameworks (GDPR/SOC2/ISO27001/PCI-DSS) + MCP-Server fuer AI-Agents + GitHub-Actions-Recipe.
|
|
204
|
+
|
|
205
|
+
### Verwendung als Erweiterung zum Skill
|
|
206
|
+
|
|
207
|
+
Wenn der User explizit eine **tiefere technische Pruefung** (Code-Taint, SAST, Compliance-Frameworks) wuenscht ueber die Page-Content-Analyse hinaus:
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
# In ein beliebiges Repo (Next.js/React/Supabase)
|
|
211
|
+
npx @aegis-scan/cli scan --output aegis-report.json
|
|
212
|
+
|
|
213
|
+
# Ergebnis: aegis-report.json mit 40 Scanner-Findings + Taint-Analysis +
|
|
214
|
+
# externe-Tool-Outputs + 0-1000 Score + FORTRESS→CRITICAL Grade.
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
Der Skill kann den `aegis-report.json` mit derselben Schweregrad-Mapping-
|
|
218
|
+
Tabelle konsumieren, die im Abschnitt "Compliance-Frameworks-Mapping"
|
|
219
|
+
unten beschrieben ist.
|
|
220
|
+
|
|
221
|
+
### Compliance-Frameworks-Mapping (a.e.g.i.s → Anwalts-Bewertung)
|
|
222
|
+
|
|
223
|
+
| a.e.g.i.s Framework | Anwalts-Aequivalent |
|
|
224
|
+
|--------------------|---------------------|
|
|
225
|
+
| GDPR (4 Rules) | DSGVO-Layer (`references/dsgvo.md`) |
|
|
226
|
+
| SOC 2 | ISO 27001 / Art. 32 DSGVO TOMs (`references/it-recht.md` NIS2) |
|
|
227
|
+
| ISO 27001 | Art. 32 DSGVO TOMs / NIS2 |
|
|
228
|
+
| PCI-DSS | nur relevant bei Kreditkarten-Verarbeitung — Bank/Versicherungs-Layer (`references/branchenrecht.md`) |
|
|
229
|
+
|
|
230
|
+
Bei DSGVO-spezifischen a.e.g.i.s-Findings: pruefe Cross-Risiko mit Pages-Content-Analyse, da DSGVO oft sowohl Code-Layer (Datenflusss) als auch Inhalts-Layer (DSE-Erwaehnung, Consent-Banner) betrifft.
|
|
231
|
+
|
|
232
|
+
### Nutzungs-Empfehlung
|
|
233
|
+
|
|
234
|
+
- **Default-SCAN-Modus des Skills**: reine Pages-Content-Analyse (Texte, AGB, Datenschutzerklaerung, Cookie-Banner, Impressum) — schnell + token-effizient. Code-Layer-Findings werden optional einbezogen, wenn der User `@aegis-scan/cli` aktiv eingebunden hat.
|
|
235
|
+
- **Tiefe-Mode**: Wenn User `/anwalt scan --deep` oder Aehnliches anfragt: Schlage zusaetzlich `@aegis-scan/cli` vor.
|
|
236
|
+
- **CI-Mode**: a.e.g.i.s liefert eine GitHub-Actions-Recipe (`ci/github-action/`) — koennte vom User in CI eingebunden werden, dann konsumiert der Skill die PR-Comments mit Score + Top-Findings.
|
|
237
|
+
|
|
238
|
+
### Hinweis fuer Skill-Output
|
|
239
|
+
|
|
240
|
+
Wenn ein Audit a.e.g.i.s-Ergebnisse einbezieht, in der Disclaimer-Note erwaehnen:
|
|
241
|
+
> Tiefenscanning durch a.e.g.i.s (open-source @aegis-scan/cli, MIT-Lizenz, ergaenzend zu Semgrep/CodeQL — nicht Ersatz). Findings sind technisch-indikativ; rechtliche Bewertung durch Anwalts-Anhang dieses Skills, nicht durch a.e.g.i.s selbst.
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
# Audit-Patterns — Standardisierte HUNTER-Methodik
|
|
2
|
+
|
|
3
|
+
> Erfahrungs-extrahierte Audit-Patterns aus realen Live-Audits.
|
|
4
|
+
> Wenn der Skill einen Web-Audit fuehrt, soll er DIESE Pattern-Reihenfolge
|
|
5
|
+
> systematisch durchlaufen. Lieber zu paranoid als zu lax.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Phase 1: HEADER-AUDIT (curl -sSI)
|
|
10
|
+
|
|
11
|
+
### CSP-Anti-Patterns (sofort 🔴 KRITISCH)
|
|
12
|
+
|
|
13
|
+
| Pattern | Kritikalitaet | Empfehlung | Az. / Quelle |
|
|
14
|
+
|---------|--------------|-----------|--------------|
|
|
15
|
+
| `script-src ... 'unsafe-inline'` | 🔴 KRITISCH | strict-dynamic + per-request-nonce migrieren | Mozilla A+ / OWASP CSP Cheat Sheet |
|
|
16
|
+
| `style-src ... 'unsafe-inline'` | 🟡 HOCH | nonce oder hashes; bei Tailwind: kein Workaround → akzeptiert | Mozilla A+ |
|
|
17
|
+
| `script-src ... 'unsafe-eval'` (Production) | 🔴 KRITISCH | wasm-unsafe-eval reicht meist; eval = XSS-Vektor | OWASP |
|
|
18
|
+
| `default-src *` oder `default-src 'unsafe-inline'` | 🔴 KRITISCH | nicht zulaessig; explizite Whitelists | OWASP |
|
|
19
|
+
| `frame-ancestors 'none'` fehlt + X-Frame-Options fehlt | 🔴 KRITISCH | Clickjacking-Vektor | BSI |
|
|
20
|
+
| Keine `frame-ancestors` und keine X-Frame-Options | 🔴 KRITISCH | siehe oben | |
|
|
21
|
+
|
|
22
|
+
### CSP-Drittland-Auto-Detection (🔴 KRITISCH bei Match)
|
|
23
|
+
|
|
24
|
+
Pruefe ob folgende Domains in CSP `script-src`, `style-src`, `font-src`, `connect-src`, `img-src`, `frame-src`:
|
|
25
|
+
|
|
26
|
+
| Domain in CSP | Auto-Finding |
|
|
27
|
+
|---------------|--------------|
|
|
28
|
+
| `fonts.googleapis.com` | 🔴 KRITISCH — LG Muenchen I 3 O 17493/20, Schadensersatz 100€/Visitor, Massen-Abmahn-Pattern |
|
|
29
|
+
| `fonts.gstatic.com` | 🔴 KRITISCH — siehe oben |
|
|
30
|
+
| `googletagmanager.com` | 🟡 HOCH wenn aktiv — § 25 TTDSG Consent-Pflicht, EuGH C-673/17 |
|
|
31
|
+
| `google-analytics.com` | 🟡 HOCH wenn aktiv — § 25 TTDSG + Drittlandtransfer USA |
|
|
32
|
+
| `connect.facebook.net` / `*.facebook.com` | 🔴 KRITISCH — Fashion-ID-Mit-Verantwortlichkeit, EuGH C-40/17 |
|
|
33
|
+
| `*.linkedin.com` (Insight Tag) | 🟡 HOCH — § 25 TTDSG Consent |
|
|
34
|
+
| `*.x.com` / `*.twitter.com` (Embeds) | 🟡 HOCH — Fashion-ID-Pattern |
|
|
35
|
+
| `*.tiktok.com` / `tiktokapis.com` | 🟡 HOCH — China-Drittland-Layer; CCP-Datenzugriff-Risiko |
|
|
36
|
+
| `*.stripe.com` | 🟢 MITTEL — US-Drittland; Stripe ist DSGVO-konform aber Erwaehnung in DSE Pflicht |
|
|
37
|
+
| `*.youtube.com` | 🟡 HOCH — wenn nicht youtube-nocookie.com → § 25 TTDSG |
|
|
38
|
+
| `youtube-nocookie.com` | 🟢 NIEDRIG (akzeptiert, DSE-Erwaehnung trotzdem) |
|
|
39
|
+
| `vimeo.com` / `player.vimeo.com` | 🟡 HOCH — Drittland + Tracking-Cookies |
|
|
40
|
+
| `*.openstreetmap.org` / `nominatim.openstreetmap.org` | 🟢 MITTEL — UK-Foundation; Drittland-Hinweis in DSE noetig |
|
|
41
|
+
| `maps.googleapis.com` | 🔴 KRITISCH ohne ConsentGate — Google Maps API loadet ohne Consent direct, Daten-Uebertragung an Google |
|
|
42
|
+
| `js.stripe.com` | 🟢 MITTEL — US, aber DSGVO-OK mit DSE-Erwaehnung |
|
|
43
|
+
|
|
44
|
+
### Sicherheits-Header-Vollstaendigkeit (1 Punkt pro vorhandenem Header)
|
|
45
|
+
|
|
46
|
+
| Header | Pflicht | Score wenn fehlt | Note |
|
|
47
|
+
|--------|---------|-----------------|------|
|
|
48
|
+
| `Strict-Transport-Security` (HSTS) | ✅ | -10 | Plus `preload` Bonus |
|
|
49
|
+
| `X-Frame-Options: DENY` oder `SAMEORIGIN` | ✅ | -10 | wenn frame-ancestors da, optional |
|
|
50
|
+
| `X-Content-Type-Options: nosniff` | ✅ | -5 | |
|
|
51
|
+
| `Referrer-Policy` | ✅ | -5 | strict-origin-when-cross-origin empfohlen |
|
|
52
|
+
| `Permissions-Policy` | ✅ | -5 | mind. camera/microphone/geolocation regulieren |
|
|
53
|
+
| `Cross-Origin-Opener-Policy` (COOP) | empf | -3 | same-origin-allow-popups |
|
|
54
|
+
| `Cross-Origin-Embedder-Policy` (COEP) | empf | -3 | credentialless empfohlen |
|
|
55
|
+
| `Cross-Origin-Resource-Policy` (CORP) | empf | -3 | same-origin |
|
|
56
|
+
| `X-XSS-Protection: 0` ODER nicht gesetzt | best-practice | 0 (no penalty) | "1; mode=block" ist veralteter Pattern |
|
|
57
|
+
| `X-Permitted-Cross-Domain-Policies: none` | optional | 0 | Anti-Adobe-Flash |
|
|
58
|
+
| `Content-Security-Policy` (mit nonce + strict-dynamic) | ✅ | -20 | wichtigster Header |
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Phase 2: HTML-LIVE-PROBE
|
|
63
|
+
|
|
64
|
+
### Pflicht-Checks
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
- Title gesetzt
|
|
68
|
+
- Genau 1 H1
|
|
69
|
+
- H1 hat sichtbaren Text (nicht nur Bild oder leerer span)
|
|
70
|
+
- H1 nicht initial opacity:0 (LCP-Killer Pattern empirisch beobachtet 2026-04-27 — wenn Above-the-Fold-CSS das H1 mit `opacity:0` ausblendet und JS-Animation das nicht innerhalb des LCP-Fensters wieder aufdeckt, liest Lighthouse das H1 als nicht-sichtbar und bricht den LCP-Score ein)
|
|
71
|
+
- meta-description vorhanden
|
|
72
|
+
- canonical-Link
|
|
73
|
+
- hreflang bei mehrsprachigen Sites
|
|
74
|
+
- Cookie-Banner-Indikator (vanilla-cookieconsent / cookiebot / usercentrics / borlabs / tarteaucitron)
|
|
75
|
+
- KEIN direkter <script src="https://www.googletagmanager.com"> ohne Consent
|
|
76
|
+
- KEIN direkter <link href="https://fonts.googleapis.com"> (KRITISCH — LG Muenchen)
|
|
77
|
+
- KEIN <iframe src="https://www.youtube.com/..."> (sondern youtube-nocookie.com oder ConsentGate)
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Image-Source-Audit
|
|
81
|
+
|
|
82
|
+
Sammle alle `<img src="https://...">` und `<picture>` external sources. Map auf Drittland:
|
|
83
|
+
- *.amazonaws.com → US
|
|
84
|
+
- *.googleapis.com / lh3.googleusercontent.com → US
|
|
85
|
+
- *.cloudfront.net → US
|
|
86
|
+
- *.unsplash.com → US
|
|
87
|
+
- *.shopify.com → US/Cookie
|
|
88
|
+
- *.ggpht.com → US (Google)
|
|
89
|
+
- *.supabase.co → meist EU (eu-central-1) wenn richtig konfiguriert; sonst US
|
|
90
|
+
|
|
91
|
+
→ Cross-Check: Sind alle in DSE erwaehnt + Drittland-Hinweis?
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Phase 3: IMPRESSUM-AUDIT
|
|
96
|
+
|
|
97
|
+
### Pflicht-Felder (§ 5 DDG)
|
|
98
|
+
|
|
99
|
+
| Pflicht | Pattern-Hinweis | Bei Fehlen |
|
|
100
|
+
|---------|----------------|------------|
|
|
101
|
+
| Vollstaendiger Name (Person) ODER Firma + Rechtsform | "Inhaber: …", "Firma … UG/GmbH/GbR" | KRITISCH — Anbieter-Identifikation |
|
|
102
|
+
| Postanschrift (kein Postfach) | PLZ + Ort + Strasse | KRITISCH |
|
|
103
|
+
| Kontakt: E-Mail (Pflicht), Telefon (empfohlen, nicht zwingend laut BGH) | mailto-Link / `+49 …` | E-Mail KRITISCH, Telefon HOCH |
|
|
104
|
+
| USt-IdNr. (wenn vorhanden) | DE\d{9} | nur wenn UStG-relevant |
|
|
105
|
+
| Wirtschafts-ID (wenn) | § 139c AO | optional |
|
|
106
|
+
| Handelsregister + Nummer (bei Eintragung) | HRB \d+ + Registergericht | KRITISCH wenn UG/GmbH ohne |
|
|
107
|
+
| Vertretungsberechtigte (jur. Personen) | "vertreten durch …" | KRITISCH bei UG/GmbH |
|
|
108
|
+
| Aufsichtsbehoerde (falls relevant) | "Zustaendige Behoerde …" | bei reg. Berufen Pflicht |
|
|
109
|
+
| Berufsbezeichnung + Verleihungsstaat (Heilberufe/Anwaelte) | … | Branchen-spezifisch Pflicht |
|
|
110
|
+
| Verantwortlich nach § 18 Abs. 2 MStV (journalistisch) | "Verantwortlich i.S.d. …" | nur bei Blog/News |
|
|
111
|
+
| EU-Streit-Plattform-Link | https://ec.europa.eu/consumers/odr | KRITISCH bei B2C-Online-Shops |
|
|
112
|
+
| Verbraucherschlichtung-Hinweis (ja/nein) | "nicht teil…", "bereit, an …" | empf bei B2C |
|
|
113
|
+
| DDG statt TMG (seit 14.05.2024) | "§ 5 DDG" / "§ 7 Abs. 1 DDG" | Modernitaets-Indikator |
|
|
114
|
+
|
|
115
|
+
### Anbieter-Identifikations-Patterns (robust)
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
1. <h2|h3>Anbieter (gemaess|nach) § 5 DDG?</h2|h3>
|
|
119
|
+
→ next <p>|<address> ist der Anbieter-Block
|
|
120
|
+
2. <h2|h3>Angaben (gemaess|nach) § 5 DDG?</h2|h3>
|
|
121
|
+
→ next <p>|<address> ist der Anbieter-Block
|
|
122
|
+
3. Direkt am Page-Anfang (bei einfachen Impressums)
|
|
123
|
+
4. <address>...</address> Tag (semantisches Markup)
|
|
124
|
+
5. Microdata: itemscope itemtype="http://schema.org/Organization"
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Wenn KEINER dieser Patterns matched → KRITISCH-Finding: Anbieter unklar identifizierbar.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Phase 4: DSE-AUDIT
|
|
132
|
+
|
|
133
|
+
### Pflicht-Sektionen (Art. 13 DSGVO)
|
|
134
|
+
|
|
135
|
+
| # | Sektion | Pflicht | Bei Fehlen |
|
|
136
|
+
|---|---------|---------|------------|
|
|
137
|
+
| 1 | Verantwortlicher (Name, Adresse, Kontakt) | ✅ | KRITISCH |
|
|
138
|
+
| 2 | Datenschutzbeauftragter (wenn vorhanden) | ✅ falls Pflicht (>20 MA mit reg. Verarbeitung) | HOCH wenn Pflicht aber fehlt |
|
|
139
|
+
| 3 | Zwecke + Rechtsgrundlagen pro Verarbeitung | ✅ | KRITISCH |
|
|
140
|
+
| 4 | Empfaenger / Kategorien von Empfaengern | ✅ | KRITISCH |
|
|
141
|
+
| 5 | Drittland-Transfer + Garantien (SCC/Adequacy) | ✅ wenn Drittland | KRITISCH bei US-Diensten ohne Hinweis |
|
|
142
|
+
| 6 | Speicherdauer pro Datenkategorie | ✅ | HOCH |
|
|
143
|
+
| 7 | Betroffenenrechte: Auskunft (Art. 15), Berichtigung (16), Loeschung (17), Einschraenkung (18), Portabilitaet (20), Widerspruch (21), Beschwerde Aufsichtsbehoerde | ✅ | KRITISCH wenn unvollstaendig |
|
|
144
|
+
| 8 | Widerrufsrecht fuer Einwilligungen | ✅ | KRITISCH bei consent-basierten Diensten |
|
|
145
|
+
| 9 | Quelle der Daten (bei Dritterhebung Art. 14) | ✅ wenn relevant | HOCH |
|
|
146
|
+
| 10 | Automatisierte Entscheidungen / Profiling | ✅ wenn vorhanden | HOCH wenn vorhanden aber nicht erwaehnt |
|
|
147
|
+
| 11 | Fuer JEDEN aktiven externen Dienst: eigener Block mit Anbieter, Adresse, Datentyp, Rechtsgrundlage, Speicherdauer, Drittland-Hinweis | ✅ | je 1 Punkt pro fehlendem Dienst |
|
|
148
|
+
|
|
149
|
+
### Service-zu-DSE Cross-Check (Service-Inventory)
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
1. Sammle ALLE in CSP whitelisted Drittland-Domains.
|
|
153
|
+
2. Sammle alle in src/ tatsaechlich genutzten externen Services (grep -E 'fetch|axios|XMLHttpRequest' + URL-Match).
|
|
154
|
+
3. Sammle alle <script src="..."> + <link href="..."> + <iframe src="..."> in HTML.
|
|
155
|
+
4. Konsolidiere: aktive externe Services.
|
|
156
|
+
5. Cross-check gegen DSE-Erwaehnung (ggf. Synonym-Liste: "Stripe" auch "Stripe Inc.", "Stripe Payments")
|
|
157
|
+
6. Pro NICHT-erwaehnter aktiver Service:
|
|
158
|
+
- Wahrscheinlichkeit: hoch wenn Drittland (Schrems-II-Cluster)
|
|
159
|
+
- Schadensvektor: Aufsichtsbehoerden-Bussgeld + Schadensersatz Art. 82
|
|
160
|
+
- Fix-Vorschlag: konkreter Text-Block-Vorschlag fuer DSE
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Phase 5: COOKIE-/CONSENT-AUDIT
|
|
166
|
+
|
|
167
|
+
### Pflicht-Checks (§ 25 TTDSG)
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
1. Cookie-Banner sichtbar bei Erstbesuch?
|
|
171
|
+
2. Banner zeigt Akzeptieren + Ablehnen + Anpassen — gleichwertig (gleiche Groesse/Farbe/Position)?
|
|
172
|
+
3. Pre-Checked-Boxen? (UNZULAESSIG — EuGH C-673/17 Planet49)
|
|
173
|
+
4. Cookie-Wall (Inhalte gesperrt bis Akzeptieren)? (Borderline — OLG Muenchen erlaubt mit gleichwertiger Alternative)
|
|
174
|
+
5. Tracking-Tools laden VOR Consent? (KRITISCH — gtag, _ga, fbq, etc. duerfen erst nach Consent)
|
|
175
|
+
6. Widerrufs-Mechanismus (Cookie-Settings-Link im Footer)?
|
|
176
|
+
7. Consent dokumentiert (Backend-Log mit consentId, Zeitpunkt, Umfang, Version)?
|
|
177
|
+
8. Cookie-Tabelle in DSE: konkrete Cookie-Namen + Zweck + Speicherdauer?
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Cookie-Banner-Live-Detection
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
# Header-Indikator
|
|
184
|
+
curl -sS https://example.com | grep -iE 'cookieconsent|cookiebot|usercentrics|borlabs|tarteaucitron|cmplz|complianz'
|
|
185
|
+
|
|
186
|
+
# Wenn keine Library erkennbar + JS-Tracker geladen → SOFORT KRITISCH
|
|
187
|
+
# Lass dann den User die Library benennen oder beweisen dass kein Tracker laeuft
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Phase 6: BRANCHEN-LAYER (wenn identifizierbar)
|
|
193
|
+
|
|
194
|
+
Branchen-Identifikation ueber:
|
|
195
|
+
- siteConfig.serviceType / industry
|
|
196
|
+
- Domain-Name-Patterns (anwalt.example.com, .arzt-, kanzlei-)
|
|
197
|
+
- Page-Content (Hero/H1)
|
|
198
|
+
- schema.org Organization @type
|
|
199
|
+
- Footer-Hinweise (Kammer, Berufsbezeichnung)
|
|
200
|
+
|
|
201
|
+
→ Lade `references/branchenrecht.md` mit der passenden Sektion.
|
|
202
|
+
|
|
203
|
+
### Sonder-Patterns
|
|
204
|
+
|
|
205
|
+
| Branche-Hint | Zusatz-Pruefung |
|
|
206
|
+
|--------------|------------------|
|
|
207
|
+
| Pet-Health-/Tier-Apps mit KI-Diagnose | HWG-naehe — KI darf NICHT als Heilmittel-Empfehlung framed sein. Disclaimer "ersetzt keinen Tierarzt" Pflicht. |
|
|
208
|
+
| Online-Coaching / Kurse | FernUSG-Check (BGH 2024 — ZFU-Pflicht?) |
|
|
209
|
+
| Online-Shop B2C | Button-Loesung "zahlungspflichtig bestellen", Widerrufsbelehrung, PAngV |
|
|
210
|
+
| Anwalt | BORA-Werbeverbot pruefen |
|
|
211
|
+
| Heilberuf | HWG + Berufsordnung |
|
|
212
|
+
| Architekt | HOAI-Hinweise |
|
|
213
|
+
| KI-Funktionen | EU AI Act Risikoklasse + Disclaimer |
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Phase 7: CSP-CODE-CROSS-CHECK (Code-Layer)
|
|
218
|
+
|
|
219
|
+
Wenn lokal Repo-Zugriff vorhanden:
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
# Fuer jede in CSP allowed Domain:
|
|
223
|
+
grep -rEn "DOMAIN" src/ --include="*.tsx" --include="*.ts" --include="*.jsx" --include="*.js"
|
|
224
|
+
|
|
225
|
+
# Wenn 0 Treffer (ausser proxy.ts/middleware.ts/csp-config) → CSP-Tightening empfohlen
|
|
226
|
+
# Wenn Treffer → bestaetigt aktiv → DSE-Erwaehnungs-Check
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Wenn lokale Code-Pfade nicht vorhanden:
|
|
230
|
+
- Live-HTML-Scan + Network-Analyse (JS-loaded resources)
|
|
231
|
+
- Performance-Tab Approximation: alle externen Requests die von der Site ausgehen
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Phase 8: SCHADENS-DIAGNOSE-FORMEL (Synthesizer)
|
|
236
|
+
|
|
237
|
+
### Wahrscheinlichkeits-Berechnung
|
|
238
|
+
|
|
239
|
+
```
|
|
240
|
+
P(Abmahnung 90 Tage) = base_rate × industry_factor × visibility_factor × competitor_activity × verstoss_kombination
|
|
241
|
+
|
|
242
|
+
base_rate (DACH): 0.10–0.40 fuer KMU mit 1+ verifiziertem Verstoss
|
|
243
|
+
industry_factor:
|
|
244
|
+
- Anwaelte/Heilberufe = 1.5 (mehr Konkurrenz, mehr Abmahn-Anwaelte)
|
|
245
|
+
- E-Commerce B2C = 1.7 (Pflicht-Pflicht-Pflicht-Falle)
|
|
246
|
+
- SaaS B2B = 0.8 (weniger Abmahn-Druck)
|
|
247
|
+
- Pet-/Tier-Apps = 1.0
|
|
248
|
+
visibility_factor:
|
|
249
|
+
- viel SEO + Werbung = 1.3
|
|
250
|
+
- eher unterhalb-Radar = 0.7
|
|
251
|
+
competitor_activity:
|
|
252
|
+
- bekannte Abmahn-Welle (Google Fonts 2022) = 2.0
|
|
253
|
+
- normal = 1.0
|
|
254
|
+
verstoss_kombination:
|
|
255
|
+
- 1 Verstoss = 1.0
|
|
256
|
+
- 2 Verstoesse synergistisch = 1.4
|
|
257
|
+
- 3+ Verstoesse synergistisch = 1.8
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### €-Schadensschaetzung
|
|
261
|
+
|
|
262
|
+
```
|
|
263
|
+
- Abmahnung Wettbewerber: Streitwert × 0.13 (RVG 1,3 Geschaeftsgebuehr)
|
|
264
|
+
- Streitwert siehe abmahn-templates.md Tabelle
|
|
265
|
+
- Aufsichtsbehoerde-Bussgeld: pruefe Stufe 1 (10 Mio./2%) vs Stufe 2 (20 Mio./4%); fuer KMU realistisch 5.000–50.000 €
|
|
266
|
+
- Schadensersatz Art. 82 DSGVO (immaterieller): 100–5.000 € pro Betroffener; bei Datenleck mit vielen Betroffenen schnell 6-stellig
|
|
267
|
+
- Bei Massen-Abmahnung (Google Fonts-Pattern): 170-500 € pro Visitor × Anzahl Visitors mit Anzeige
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## Anti-Pattern (was Skill nicht tun darf)
|
|
273
|
+
|
|
274
|
+
- ❌ KEINE pauschalen %-Schaetzungen ohne Begruendungs-Kette aus den oberen Faktoren
|
|
275
|
+
- ❌ KEINE Annahme dass Skipping ein bestimmtes Audit-Phase „ok" ist; minimal alle 8 Phasen abklopfen
|
|
276
|
+
- ❌ KEINE False-Positive-Aktion: Wenn Header X fehlt, IMMER CHALLENGER fragen „aber wirkt sich das tatsaechlich aus, oder ist es nur Defense-in-depth?"
|
|
277
|
+
- ❌ KEIN „CSP-allowed = aktiv" — IMMER Code-Cross-Check oder Live-HTML-Verifikation
|