Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
shiplightai avatar

Security Review

  • 1 installs
  • 2 repo stars
  • Updated April 19, 2026
  • shiplightai/claude-code-plugin

Evaluate an app against OWASP Top 10, auth security, HTTP headers, CORS, CSP, and supply-chain risks with browser-based penetration testing.

About

Evaluates an application's security posture against OWASP Top 10, ASVS, and NIST standards and validates findings through browser-based penetration testing. A developer uses it before launch, after auth changes, or when handling sensitive data.

  • Covers runtime behavior, headers, auth flows, and client-side vulns
  • Findings include CVE references and YAML regression tests

Security Review by the numbers

  • 1 all-time installs (skills.sh)
  • Ranked #1,835 of 2,203 Security skills by installs in the Skillselion catalog
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/shiplightai/claude-code-plugin --skill security-review

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs1
repo stars2
Last updatedApril 19, 2026
Repositoryshiplightai/claude-code-plugin

What it does

Evaluate an app against OWASP Top 10, auth security, HTTP headers, CORS, CSP, and supply-chain risks with browser-based penetration testing.

Files

SKILL.mdMarkdownGitHub ↗

Security Review

Evaluate your application's security posture against industry standards and validate findings through browser-based penetration testing. This review covers the attack surface that static analysis tools miss — runtime behavior, header configuration, authentication flows, and client-side vulnerabilities.

When to use

Use /shiplight:security-review when:

  • Before launching a new application or feature
  • After adding authentication or authorization changes
  • When handling sensitive data (user credentials, payment info, PII)
  • Preparing for a security audit
  • After a security incident to check for similar issues
  • Reviewing third-party integrations

Standards Referenced

  • OWASP Top 10 (2021) — Top web application security risks
  • OWASP ASVS v4.0 — Application Security Verification Standard
  • OWASP Session Management Cheat Sheet
  • NIST 800-63B — Digital Identity Guidelines (authentication)
  • CWE/SANS Top 25 — Most Dangerous Software Weaknesses
  • Mozilla Observatory — HTTP security header best practices

Phase Overview

Phase 1: EDUCATE   → Security context and what we check
Phase 2: SCOPE     → Identify attack surface, auth mechanisms, data flows
Phase 3: ANALYZE   → Automated checks + browser-based penetration testing
Phase 4: REPORT    → Findings with evidence, CVE references, confidence scores
Phase 5: REMEDIATE → Fix guidance + YAML regression tests

---

Phase 1: Educate

Why this matters: The average cost of a data breach is $4.45M (IBM 2023). 83% of web applications have at least one critical vulnerability. Many security issues are only detectable at runtime — misconfigured headers, insecure token storage, broken access controls — which is exactly what browser-based testing catches.

This review checks your app against objective security criteria with browser-based validation. Every finding references a specific standard (OWASP, CWE, NIST).

---

Phase 2: Scope

Gather context

1. Auto-detect from codebase:

  • Authentication mechanism (JWT, sessions, OAuth, API keys)
  • Framework security features in use (CSRF tokens, CORS config, CSP)
  • Dependencies with known vulnerabilities (npm audit / pip audit)
  • API routes and endpoints
  • Environment variable handling
  • File upload capabilities
  • Third-party scripts and CDN usage

2. Ask the user (one at a time):

  • Target URL: Where is the app running?
  • Auth mechanism: How do users log in? (auto-detected, confirm)
  • Test credentials: Do you have test accounts I can use? (needed for authenticated testing)
  • Sensitive data: What sensitive data does the app handle? (PII, payments, health records)
  • Known concerns: Any specific areas you're worried about? (optional)

3. Map the attack surface:

  • List all user input points (forms, URL params, file uploads, WebSocket messages)
  • List all API endpoints with their auth requirements
  • List all third-party integrations
  • Identify data flow: where does sensitive data enter, process, store, and exit?

---

Phase 3: Analyze

Open a browser session with new_session using record_evidence: true. Run all applicable check categories.

Category A: HTTP Security Headers (HDR)

Check IDCheckStandardMethod
HDR-01Content-Security-Policy header present and restrictiveOWASP A05Inspect response headers
HDR-02Strict-Transport-Security (HSTS) with long max-ageOWASP TransportCheck header presence and value
HDR-03X-Content-Type-Options: nosniffMozilla ObservatoryCheck header
HDR-04X-Frame-Options or CSP frame-ancestorsOWASP ClickjackingCheck header
HDR-05Referrer-Policy set appropriatelyPrivacy/SecurityCheck header value
HDR-06Permissions-Policy restricts sensitive APIsBrowser securityCheck camera, microphone, geolocation policies
HDR-07No Server/X-Powered-By version disclosureInformation leakCheck for version strings in headers
HDR-08Cache-Control for sensitive pagesOWASP SessionCheck no-store for authenticated content
HDR-09CORS not overly permissiveOWASP A05Check Access-Control-Allow-Origin
HDR-10No mixed content (HTTP resources on HTTPS page)Transport securityInspect all resource URLs

Browser validation: Use JavaScript via act to inspect document.querySelector('meta[http-equiv]') and fetch response headers via a same-origin request. Use get_browser_console_logs to check for mixed content warnings.

Category B: Authentication & Session Management (AUTH)

Check IDCheckStandardMethod
AUTH-01Tokens not stored in localStorageOWASP ASVS 3.3.2Check localStorage/sessionStorage for tokens
AUTH-02Session cookies have HttpOnly flagOWASP SessionInspect Set-Cookie headers
AUTH-03Session cookies have Secure flagOWASP SessionInspect Set-Cookie headers
AUTH-04Session cookies have SameSite attributeOWASP CSRFInspect Set-Cookie headers
AUTH-05Session expires after idle timeoutOWASP ASVS 3.3.1Wait and verify session invalidation
AUTH-06Logout invalidates server-side sessionOWASP ASVS 3.3.1Logout, replay old token, check response
AUTH-07Password reset tokens are single-useOWASP AuthUse reset link twice, verify second fails
AUTH-08No credentials in URL parametersOWASP TransportCheck URL for tokens/passwords
AUTH-09Brute force protection on loginOWASP AuthAttempt multiple failed logins, check for lockout/rate-limit
AUTH-10CSRF protection on state-changing requestsOWASP A01Submit forms without CSRF token
AUTH-11JWT signature verified (if applicable)OWASP AuthSend modified JWT, check rejection
AUTH-12OAuth state parameter used (if applicable)OWASP AuthCheck OAuth flow for state param

Browser validation: Log in via act, inspect cookies with JavaScript (document.cookie — HttpOnly cookies won't appear, which is correct). Check localStorage. Perform logout, replay requests. Attempt brute force (5 wrong passwords). Modify JWT tokens and test.

Category C: Input Validation & Injection (INJ)

Check IDCheckStandardMethod
INJ-01XSS: reflected input in pageOWASP A03 / CWE-79Submit <script>alert(1)</script> in all inputs, check if rendered
INJ-02XSS: stored input from databaseOWASP A03 / CWE-79Submit script via form, check if rendered on subsequent page loads
INJ-03SQL injection in form inputsOWASP A03 / CWE-89Submit ' OR '1'='1 patterns, check for errors
INJ-04Open redirect via URL parametersCWE-601Test redirect params with external URLs
INJ-05Path traversal in file operationsCWE-22Test ../../etc/passwd in file-related params
INJ-06Command injection in input fieldsCWE-78Test ; ls or `
INJ-07HTML injection in user contentCWE-79Submit HTML tags, check if rendered
INJ-08URL scheme validation (javascript:)CWE-79Test javascript:alert(1) in URL inputs
INJ-09File upload validationOWASP A04Upload files with wrong extensions, oversized files, executable content
INJ-10API input validationOWASP A03Send malformed JSON, missing fields, wrong types to API endpoints

Browser validation: Use act to fill form fields with test payloads. Capture page state after submission. Check for script execution, error messages, unexpected behavior. Use get_browser_console_logs for JavaScript errors that indicate injection vectors.

Important: These are non-destructive test payloads for detection only. Do not attempt actual exploitation. Alert-based XSS tests use alert(1) which is harmless.

Category D: Access Control (AC)

Check IDCheckStandardMethod
AC-01Authenticated pages return 401/403 without authOWASP A01Access protected URLs without authentication
AC-02No IDOR (Insecure Direct Object Reference)OWASP A01 / CWE-639Change resource IDs in URLs, check for unauthorized access
AC-03API endpoints enforce authorizationOWASP A01Call API endpoints with wrong/missing auth
AC-04Admin pages are not accessible to regular usersOWASP A01Navigate to admin routes with regular user session
AC-05No sensitive data in client-side sourceInformation leakCheck JavaScript bundles for API keys, secrets
AC-06Directory listing disabledInformation leakAccess directory URLs (e.g., /api/, /static/)
AC-07Debug endpoints not exposed in productionOWASP A05Check common debug paths (/debug, /trace, /graphql playground)
AC-08Error messages don't leak internal detailsOWASP A05Trigger errors, check for stack traces, DB details

Browser validation: Navigate to protected pages without auth. Try accessing resources belonging to other users. Check JavaScript source for hardcoded secrets using act with JavaScript to scan script contents.

Category E: Client-Side Security (CLI)

Check IDCheckStandardMethod
CLI-01No sensitive data in client-side storageOWASP StorageInspect localStorage, sessionStorage, IndexedDB
CLI-02Subresource Integrity (SRI) on CDN resourcesSupply chainCheck integrity attribute on external scripts/styles
CLI-03Third-party scripts inventorySupply chainList all external script sources
CLI-04No eval() or innerHTML with user inputCWE-79Scan JavaScript for dangerous patterns
CLI-05Service worker scope is restrictedClient securityCheck SW registration scope
CLI-06WebSocket connections use WSSTransportCheck WS connection URLs
CLI-07No sensitive data in console logsInformation leakCheck get_browser_console_logs output
CLI-08Clickjacking protection worksOWASP ClickjackingTest embedding page in iframe

Browser validation: Use JavaScript via act to enumerate localStorage keys, check script tags for SRI, list all network requests to external domains. Use get_browser_console_logs to check for leaked data.

Category F: Dependency & Supply Chain (DEP)

Check IDCheckStandardMethod
DEP-01No known vulnerable dependenciesOWASP A06 / CWE-1035Run npm audit / pip audit
DEP-02Lock file exists and is committedSupply chainCheck for package-lock.json / yarn.lock / pnpm-lock.yaml
DEP-03No unnecessary dependenciesAttack surfaceCheck for unused packages
DEP-04CDN resources use SRISupply chainCheck integrity attributes (same as CLI-02)
DEP-05No typosquatting risk in dependenciesSupply chainCheck package names against known packages

Validation: Run dependency audit commands. Cross-reference with codebase scan from Phase 2.

---

Phase 4: Report

Generate a structured report saved to shiplight/reports/security-review-{date}.md:

# Security Review Report
**Date:** {date}
**URL:** {url}
**Auth mechanism:** {type}
**Attack surface:** {summary}

## Overall Score: {X}/10 | Confidence: {X}%

## Score Breakdown
| Category | Score | Findings |
|----------|-------|----------|
| HTTP Headers (HDR) | 6/10 | 1 critical, 2 high |
| Auth & Sessions (AUTH) | 4/10 | 2 critical, 1 high |
| Input Validation (INJ) | 7/10 | 1 high, 2 medium |
| Access Control (AC) | 8/10 | 1 medium |
| Client-Side (CLI) | 5/10 | 1 critical, 1 high |
| Dependencies (DEP) | 9/10 | 1 low |

## Findings

### CRITICAL

#### AUTH-01: JWT stored in localStorage — XSS leads to full account takeover
- **Standard:** OWASP ASVS 3.3.2 / CWE-922
- **Finding:** Access token stored in `localStorage` under key `auth_token`, accessible to any XSS payload
- **Evidence:** [screenshot of Application > Storage showing JWT]
- **Attack scenario:** Any XSS vulnerability (even via third-party script) can exfiltrate all user tokens
- **CVSS estimate:** 8.1 (High)
- **Confidence:** 95%

...

Confidence Scoring

  • 90-100%: Exploited and verified in browser (e.g., XSS payload executed, unauthorized access confirmed)
  • 70-89%: Strong evidence from inspection (e.g., missing header confirmed, insecure cookie flags observed)
  • 50-69%: Code-level evidence, not fully validated at runtime
  • Below 50%: Don't report — too speculative

---

Phase 5: Remediate

For each finding, provide:

1. Fix guidance

#### AUTH-01: JWT stored in localStorage
**Risk:** Any XSS → full account takeover
**File:** src/lib/auth.ts:47
**Current:** `localStorage.setItem('auth_token', jwt)`
**Fix:** Move to HttpOnly cookie set by the server
- Server: `Set-Cookie: token=<jwt>; HttpOnly; Secure; SameSite=Strict; Path=/`
- Client: Remove all localStorage token operations
- API calls: Cookies sent automatically (remove Authorization header)
**Migration steps:**
1. Add cookie-setting endpoint on server
2. Update API middleware to read from cookie
3. Remove client-side token storage
4. Update CORS to allow credentials

2. YAML regression test

- name: auth-01-no-tokens-in-localstorage
  description: Verify authentication tokens are not stored in localStorage
  severity: critical
  standard: OWASP-ASVS-3.3.2
  steps:
    - URL: /login
    - intent: Enter test username
      action: fill
      locator: "getByLabel('Email')"
      value: "test@example.com"
    - intent: Enter test password
      action: fill
      locator: "getByLabel('Password')"
      value: "testpass123"
    - intent: Click login button
      action: click
      locator: "getByRole('button', { name: 'Sign in' })"
    - WAIT_UNTIL: User is logged in and dashboard is visible
      timeout_seconds: 15
    - CODE: |
        const keys = Object.keys(localStorage);
        const tokenKeys = keys.filter(k =>
          /token|jwt|auth|session|access/i.test(k)
        );
        if (tokenKeys.length > 0) {
          throw new Error(
            `Auth tokens found in localStorage: ${tokenKeys.join(', ')}`
          );
        }
    - VERIFY: No authentication tokens are stored in browser localStorage

Save all YAML tests to shiplight/tests/security-review.test.yaml.

---

Penetration Test Depth Levels

  • `--quick`: Headers (HDR) + Cookie flags (AUTH-02/03/04) + localStorage check (AUTH-01) + dependency audit (DEP-01). ~2 minutes.
  • default: All categories, standard payloads. ~10 minutes.
  • `--thorough`: All categories + extended injection payloads + IDOR enumeration + brute force testing + full third-party script analysis. ~20-30 minutes.

Tips

  • Always use test credentials, never production credentials
  • XSS test payloads are non-destructive (alert(1)) — safe for staging environments
  • For authenticated testing, save the session with save_storage_state after login
  • Run npm audit before the browser-based review to catch known CVEs early
  • Use get_browser_console_logs — many security issues produce console warnings
  • Close the session with close_session and use generate_html_report for evidence

Related skills

Securityappsecaudit

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.