[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71QXMHMS0FGH0G1XJGRKY5B":3,"skill-same:01M71QXMHMS0FGH0G1XJGRKY5B":177},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":16,"sourceHtmlUrl":17,"categories":18,"keywords":24,"publishedAt":45,"linkOnly":46,"markdownContent":47,"markdownBody":48,"frontMatter":49,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":14,"repositoryHtmlUrl":55,"repositoryHomepageUrl":6,"ownerHtmlUrl":56,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":57,"install":58,"resources":71},"01M71QXMHMS0FGH0G1XJGRKY5B","security-review",null,"Use for security code review. OWASP patterns (injection, XSS, auth, authz, crypto, SSRF, secrets). Confidence-based reporting. Triggers on 'security review', auth\u002Fpayment code, or \u002Fdw-secure-audit.","brunosps\u002Fwinbox-gui","brunosps","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F595279?v=4","01M71QRD207EQMJDG484AS73XS","Bruno Santos","01M71QRD2KPFF4TWM1QRJMFHZP",0,"CC-BY-SA-4.0","https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002FSKILL.md",[19],{"categoryNo":20,"categoryName":21,"taxonomyType":22,"taxonomyTypeDesc":23},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",[25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44],"security review","security","review","use","triggers","for","ssrf","patterns","owasp","injection","secure","reporting","secrets","read","audit","xss","code","Bash","code review","auth","2026-11-10 13:02:02",false,"---\nname: security-review\ndescription: Use for security code review. OWASP patterns (injection, XSS, auth, authz, crypto, SSRF, secrets). Confidence-based reporting. Triggers on 'security review', auth\u002Fpayment code, or \u002Fdw-secure-audit.\nallowed-tools: Read, Grep, Glob, Bash, Task\nlicense: LICENSE\n---\n\n\u003C!--\nReference material based on OWASP Cheat Sheet Series (CC BY-SA 4.0)\nhttps:\u002F\u002Fcheatsheetseries.owasp.org\u002F\n-->\n\n# Security Review Skill\n\nIdentify exploitable security vulnerabilities in code. Report only **HIGH CONFIDENCE** findings—clear vulnerable patterns with attacker-controlled input.\n\n## Scope: Research vs. Reporting\n\n**CRITICAL DISTINCTION:**\n\n- **Report on**: Only the specific file, diff, or code provided by the user\n- **Research**: The ENTIRE codebase to build confidence before reporting\n\nBefore flagging any issue, you MUST research the codebase to understand:\n- Where does this input actually come from? (Trace data flow)\n- Is there validation\u002Fsanitization elsewhere?\n- How is this configured? (Check settings, config files, middleware)\n- What framework protections exist?\n\n**Do NOT report issues based solely on pattern matching.** Investigate first, then report only what you're confident is exploitable.\n\n## Confidence Levels\n\n| Level | Criteria | Action |\n|-------|----------|--------|\n| **HIGH** | Vulnerable pattern + attacker-controlled input confirmed | **Report** with severity |\n| **MEDIUM** | Vulnerable pattern, input source unclear | **Note** as \"Needs verification\" |\n| **LOW** | Theoretical, best practice, defense-in-depth | **Do not report** |\n\n## Automated scanners + false-positive validation (fp-check)\n\nThe Security Gate (`\u002Fdw-secure-audit`) pairs this human-style review with deterministic tools:\n- **SAST** — Semgrep, diff-focused on the generated code. See `references\u002Fsast.md`.\n- **Secrets** — gitleaks (dedicated) + Trivy. See `references\u002Fsecrets.md`. Any secret = REJECTED.\n\nTool findings are **not** auto-trusted to block. Apply the SAME reachability discipline to them before a\nfinding blocks the gate (the **fp-check** step):\n\n1. **Reachable?** Trace the flagged sink back — is it on a path attacker-controlled input can reach?\n2. **Controlled?** Is the input actually attacker-controlled, or a constant \u002F server-controlled value\n   (see the table below) \u002F framework-mitigated?\n3. **Verdict:** If both hold → keep as blocking at its tier. If provably unreachable or\n   trusted-input → **downgrade to advisory** and write the one-line justification in the findings file.\n   Never silently drop a tool finding — log every downgrade so the pattern stays auditable.\n\nException: **secrets do not get an fp-check downgrade** — a real-looking credential is removed and\nrotated, not argued away (only committed `.gitleaks.toml` allowlist entries for known fixtures apply).\n\n## Do Not Flag\n\n### General Rules\n- Test files (unless explicitly reviewing test security)\n- Dead code, commented code, documentation strings\n- Patterns using **constants** or **server-controlled configuration**\n- Code paths that require prior authentication to reach (note the auth requirement instead)\n\n### Server-Controlled Values (NOT Attacker-Controlled)\n\nThese are configured by operators, not controlled by attackers:\n\n| Source | Example | Why It's Safe |\n|--------|---------|---------------|\n| Django settings | `settings.API_URL`, `settings.ALLOWED_HOSTS` | Set via config\u002Fenv at deployment |\n| Environment variables | `os.environ.get('DATABASE_URL')` | Deployment configuration |\n| Config files | `config.yaml`, `app.config['KEY']` | Server-side files |\n| Framework constants | `django.conf.settings.*` | Not user-modifiable |\n| Hardcoded values | `BASE_URL = \"https:\u002F\u002Fapi.internal\"` | Compile-time constants |\n\n**SSRF Example - NOT a vulnerability:**\n```python\n# SAFE: URL comes from Django settings (server-controlled)\nresponse = requests.get(f\"{settings.SEER_AUTOFIX_URL}{path}\")\n```\n\n**SSRF Example - IS a vulnerability:**\n```python\n# VULNERABLE: URL comes from request (attacker-controlled)\nresponse = requests.get(request.GET.get('url'))\n```\n\n### Framework-Mitigated Patterns\nCheck language guides before flagging. Common false positives:\n\n| Pattern | Why It's Usually Safe |\n|---------|----------------------|\n| Django `{{ variable }}` | Auto-escaped by default |\n| React `{variable}` | Auto-escaped by default |\n| Vue `{{ variable }}` | Auto-escaped by default |\n| `User.objects.filter(id=input)` | ORM parameterizes queries |\n| `cursor.execute(\"...%s\", (input,))` | Parameterized query |\n| `innerHTML = \"\u003Cb>Loading...\u003C\u002Fb>\"` | Constant string, no user input |\n\n**Only flag these when:**\n- Django: `{{ var|safe }}`, `{% autoescape off %}`, `mark_safe(user_input)`\n- React: `dangerouslySetInnerHTML={{__html: userInput}}`\n- Vue: `v-html=\"userInput\"`\n- ORM: `.raw()`, `.extra()`, `RawSQL()` with string interpolation\n\n## Review Process\n\n### 1. Detect Context\n\nWhat type of code am I reviewing?\n\n| Code Type | Load These References |\n|-----------|----------------------|\n| API endpoints, routes | `authorization.md`, `authentication.md`, `injection.md` |\n| Frontend, templates | `xss.md`, `csrf.md` |\n| File handling, uploads | `file-security.md` |\n| Crypto, secrets, tokens | `cryptography.md`, `data-protection.md` |\n| Data serialization | `deserialization.md` |\n| External requests | `ssrf.md` |\n| Business workflows | `business-logic.md` |\n| GraphQL, REST design | `api-security.md` |\n| Config, headers, CORS | `misconfiguration.md` |\n| CI\u002FCD, dependencies | `supply-chain.md` |\n| Error handling | `error-handling.md` |\n| Audit, logging | `logging.md` |\n\n### 2. Load Language Guide\n\nBased on file extension or imports:\n\n| Indicators | Guide |\n|------------|-------|\n| `.py`, `django`, `flask`, `fastapi` | `languages\u002Fpython.md` |\n| `.js`, `.ts`, `express`, `react`, `vue`, `next` | `languages\u002Fjavascript.md` |\n| `.go`, `go.mod` | `languages\u002Fgo.md` |\n| `.rs`, `Cargo.toml` | `languages\u002Frust.md` |\n| `.java`, `spring`, `@Controller` | `languages\u002Fjava.md` |\n\n### 3. Load Infrastructure Guide (if applicable)\n\n| File Type | Guide |\n|-----------|-------|\n| `Dockerfile`, `.dockerignore` | `infrastructure\u002Fdocker.md` |\n| K8s manifests, Helm charts | `infrastructure\u002Fkubernetes.md` |\n| `.tf`, Terraform | `infrastructure\u002Fterraform.md` |\n| GitHub Actions, `.gitlab-ci.yml` | `infrastructure\u002Fci-cd.md` |\n| AWS\u002FGCP\u002FAzure configs, IAM | `infrastructure\u002Fcloud.md` |\n\n### 4. Research Before Flagging\n\n**For each potential issue, research the codebase to build confidence:**\n\n- Where does this value actually come from? Trace the data flow.\n- Is it configured at deployment (settings, env vars) or from user input?\n- Is there validation, sanitization, or allowlisting elsewhere?\n- What framework protections apply?\n\nOnly report issues where you have HIGH confidence after understanding the broader context.\n\n### 5. Verify Exploitability\n\nFor each potential finding, confirm:\n\n**Is the input attacker-controlled?**\n\n| Attacker-Controlled (Investigate) | Server-Controlled (Usually Safe) |\n|-----------------------------------|----------------------------------|\n| `request.GET`, `request.POST`, `request.args` | `settings.X`, `app.config['X']` |\n| `request.json`, `request.data`, `request.body` | `os.environ.get('X')` |\n| `request.headers` (most headers) | Hardcoded constants |\n| `request.cookies` (unsigned) | Internal service URLs from config |\n| URL path segments: `\u002Fusers\u002F\u003Cid>\u002F` | Database content from admin\u002Fsystem |\n| File uploads (content and names) | Signed session data |\n| Database content from other users | Framework settings |\n| WebSocket messages | |\n\n**Does the framework mitigate this?**\n- Check language guide for auto-escaping, parameterization\n- Check for middleware\u002Fdecorators that sanitize\n\n**Is there validation upstream?**\n- Input validation before this code\n- Sanitization libraries (DOMPurify, bleach, etc.)\n\n### 6. Report HIGH Confidence Only\n\nSkip theoretical issues. Report only what you've confirmed is exploitable after research.\n\n---\n\n## Severity Classification\n\n| Severity | Impact | Examples |\n|----------|--------|----------|\n| **Critical** | Direct exploit, severe impact, no auth required | RCE, SQL injection to data, auth bypass, hardcoded secrets |\n| **High** | Exploitable with conditions, significant impact | Stored XSS, SSRF to metadata, IDOR to sensitive data |\n| **Medium** | Specific conditions required, moderate impact | Reflected XSS, CSRF on state-changing actions, path traversal |\n| **Low** | Defense-in-depth, minimal direct impact | Missing headers, verbose errors, weak algorithms in non-critical context |\n\n---\n\n## Quick Patterns Reference\n\n### Always Flag (Critical)\n```\neval(user_input)           # Any language\nexec(user_input)           # Any language\npickle.loads(user_data)    # Python\nyaml.load(user_data)       # Python (not safe_load)\nunserialize($user_data)    # PHP\ndeserialize(user_data)     # Java ObjectInputStream\nshell=True + user_input    # Python subprocess\nchild_process.exec(user)   # Node.js\n```\n\n### Always Flag (High)\n```\ninnerHTML = userInput              # DOM XSS\ndangerouslySetInnerHTML={user}     # React XSS\nv-html=\"userInput\"                 # Vue XSS\nf\"SELECT * FROM x WHERE {user}\"    # SQL injection\n`SELECT * FROM x WHERE ${user}`    # SQL injection\nos.system(f\"cmd {user_input}\")     # Command injection\n```\n\n### Always Flag (Secrets)\n```\npassword = \"hardcoded\"\napi_key = \"sk-...\"\nAWS_SECRET_ACCESS_KEY = \"...\"\nprivate_key = \"-----BEGIN\"\n```\n\n### Check Context First (MUST Investigate Before Flagging)\n```\n# SSRF - ONLY if URL is from user input, NOT from settings\u002Fconfig\nrequests.get(request.GET['url'])     # FLAG: User-controlled URL\nrequests.get(settings.API_URL)       # SAFE: Server-controlled config\nrequests.get(f\"{settings.BASE}\u002F{x}\") # CHECK: Is 'x' user input?\n\n# Path traversal - ONLY if path is from user input\nopen(request.GET['file'])            # FLAG: User-controlled path\nopen(settings.LOG_PATH)              # SAFE: Server-controlled config\nopen(f\"{BASE_DIR}\u002F{filename}\")       # CHECK: Is 'filename' user input?\n\n# Open redirect - ONLY if URL is from user input\nredirect(request.GET['next'])        # FLAG: User-controlled redirect\nredirect(settings.LOGIN_URL)         # SAFE: Server-controlled config\n\n# Weak crypto - ONLY if used for security purposes\nhashlib.md5(file_content)            # SAFE: File checksums, caching\nhashlib.md5(password)                # FLAG: Password hashing\nrandom.random()                      # SAFE: Non-security uses (UI, sampling)\nrandom.random() for token            # FLAG: Security tokens need secrets module\n```\n\n---\n\n## Output Format\n\n```markdown\n## Security Review: [File\u002FComponent Name]\n\n### Summary\n- **Findings**: X (Y Critical, Z High, ...)\n- **Risk Level**: Critical\u002FHigh\u002FMedium\u002FLow\n- **Confidence**: High\u002FMixed\n\n### Findings\n\n#### [VULN-001] [Vulnerability Type] (Severity)\n- **Location**: `file.py:123`\n- **Confidence**: High\n- **Issue**: [What the vulnerability is]\n- **Impact**: [What an attacker could do]\n- **Evidence**:\n  ```python\n  [Vulnerable code snippet]\n  ```\n- **Fix**: [How to remediate]\n\n### Needs Verification\n\n#### [VERIFY-001] [Potential Issue]\n- **Location**: `file.py:456`\n- **Question**: [What needs to be verified]\n```\n\nIf no vulnerabilities found, state: \"No high-confidence vulnerabilities identified.\"\n\n---\n\n## Reference Files\n\n### Core Vulnerabilities (`references\u002F`)\n| File | Covers |\n|------|--------|\n| `injection.md` | SQL, NoSQL, OS command, LDAP, template injection |\n| `xss.md` | Reflected, stored, DOM-based XSS |\n| `authorization.md` | Authorization, IDOR, privilege escalation |\n| `authentication.md` | Sessions, credentials, password storage |\n| `cryptography.md` | Algorithms, key management, randomness |\n| `deserialization.md` | Pickle, YAML, Java, PHP deserialization |\n| `file-security.md` | Path traversal, uploads, XXE |\n| `ssrf.md` | Server-side request forgery |\n| `csrf.md` | Cross-site request forgery |\n| `data-protection.md` | Secrets exposure, PII, logging |\n| `api-security.md` | REST, GraphQL, mass assignment |\n| `business-logic.md` | Race conditions, workflow bypass |\n| `modern-threats.md` | Prototype pollution, LLM injection, WebSocket |\n| `misconfiguration.md` | Headers, CORS, debug mode, defaults |\n| `error-handling.md` | Fail-open, information disclosure |\n| `supply-chain.md` | Dependencies, build security |\n| `logging.md` | Audit failures, log injection |\n\n### Language Guides (`languages\u002F`)\n- `python.md` - Django, Flask, FastAPI patterns\n- `javascript.md` - Node, Express, React, Vue, Next.js\n- `go.md` - Go-specific security patterns\n- `rust.md` - Rust unsafe blocks, FFI security\n- `java.md` - Spring, Java EE patterns\n\n### Infrastructure (`infrastructure\u002F`)\n- `docker.md` - Container security\n- `kubernetes.md` - K8s RBAC, secrets, policies\n- `terraform.md` - IaC security\n- `ci-cd.md` - Pipeline security\n- `cloud.md` - AWS\u002FGCP\u002FAzure security\n\n## Structured Return\n\nWhen invoked directly or by a harness, return or merge this block:\n\n- **Status:** `PASS` when no high-confidence security findings remain, `FINDINGS` when exploitable issues exist, `BLOCKED` when threat context or sensitive paths cannot be inspected, `NOT_APPLICABLE` when no security-relevant surface is in scope.\n- **Scope:** assets, trust boundaries, languages\u002Fframeworks, data classes, and threat model slice.\n- **Evidence:** file\u002Fline references, exploit path, affected data\u002Factor, and reference category.\n- **Artifacts:** security findings, verification notes, remediation plan, or audit report.\n- **Decisions:** severity, confidence, exploitability, and false-positive rejection.\n- **Risks:** authz bypass, injection, secret exposure, SSRF, supply chain, logging, or misconfiguration.\n- **Next Step:** minimal remediation, verification, or explicit accepted risk owner.\n","\u003C!--\nReference material based on OWASP Cheat Sheet Series (CC BY-SA 4.0)\nhttps:\u002F\u002Fcheatsheetseries.owasp.org\u002F\n-->\n\n# Security Review Skill\n\nIdentify exploitable security vulnerabilities in code. Report only **HIGH CONFIDENCE** findings—clear vulnerable patterns with attacker-controlled input.\n\n## Scope: Research vs. Reporting\n\n**CRITICAL DISTINCTION:**\n\n- **Report on**: Only the specific file, diff, or code provided by the user\n- **Research**: The ENTIRE codebase to build confidence before reporting\n\nBefore flagging any issue, you MUST research the codebase to understand:\n- Where does this input actually come from? (Trace data flow)\n- Is there validation\u002Fsanitization elsewhere?\n- How is this configured? (Check settings, config files, middleware)\n- What framework protections exist?\n\n**Do NOT report issues based solely on pattern matching.** Investigate first, then report only what you're confident is exploitable.\n\n## Confidence Levels\n\n| Level | Criteria | Action |\n|-------|----------|--------|\n| **HIGH** | Vulnerable pattern + attacker-controlled input confirmed | **Report** with severity |\n| **MEDIUM** | Vulnerable pattern, input source unclear | **Note** as \"Needs verification\" |\n| **LOW** | Theoretical, best practice, defense-in-depth | **Do not report** |\n\n## Automated scanners + false-positive validation (fp-check)\n\nThe Security Gate (`\u002Fdw-secure-audit`) pairs this human-style review with deterministic tools:\n- **SAST** — Semgrep, diff-focused on the generated code. See `references\u002Fsast.md`.\n- **Secrets** — gitleaks (dedicated) + Trivy. See `references\u002Fsecrets.md`. Any secret = REJECTED.\n\nTool findings are **not** auto-trusted to block. Apply the SAME reachability discipline to them before a\nfinding blocks the gate (the **fp-check** step):\n\n1. **Reachable?** Trace the flagged sink back — is it on a path attacker-controlled input can reach?\n2. **Controlled?** Is the input actually attacker-controlled, or a constant \u002F server-controlled value\n   (see the table below) \u002F framework-mitigated?\n3. **Verdict:** If both hold → keep as blocking at its tier. If provably unreachable or\n   trusted-input → **downgrade to advisory** and write the one-line justification in the findings file.\n   Never silently drop a tool finding — log every downgrade so the pattern stays auditable.\n\nException: **secrets do not get an fp-check downgrade** — a real-looking credential is removed and\nrotated, not argued away (only committed `.gitleaks.toml` allowlist entries for known fixtures apply).\n\n## Do Not Flag\n\n### General Rules\n- Test files (unless explicitly reviewing test security)\n- Dead code, commented code, documentation strings\n- Patterns using **constants** or **server-controlled configuration**\n- Code paths that require prior authentication to reach (note the auth requirement instead)\n\n### Server-Controlled Values (NOT Attacker-Controlled)\n\nThese are configured by operators, not controlled by attackers:\n\n| Source | Example | Why It's Safe |\n|--------|---------|---------------|\n| Django settings | `settings.API_URL`, `settings.ALLOWED_HOSTS` | Set via config\u002Fenv at deployment |\n| Environment variables | `os.environ.get('DATABASE_URL')` | Deployment configuration |\n| Config files | `config.yaml`, `app.config['KEY']` | Server-side files |\n| Framework constants | `django.conf.settings.*` | Not user-modifiable |\n| Hardcoded values | `BASE_URL = \"https:\u002F\u002Fapi.internal\"` | Compile-time constants |\n\n**SSRF Example - NOT a vulnerability:**\n```python\n# SAFE: URL comes from Django settings (server-controlled)\nresponse = requests.get(f\"{settings.SEER_AUTOFIX_URL}{path}\")\n```\n\n**SSRF Example - IS a vulnerability:**\n```python\n# VULNERABLE: URL comes from request (attacker-controlled)\nresponse = requests.get(request.GET.get('url'))\n```\n\n### Framework-Mitigated Patterns\nCheck language guides before flagging. Common false positives:\n\n| Pattern | Why It's Usually Safe |\n|---------|----------------------|\n| Django `{{ variable }}` | Auto-escaped by default |\n| React `{variable}` | Auto-escaped by default |\n| Vue `{{ variable }}` | Auto-escaped by default |\n| `User.objects.filter(id=input)` | ORM parameterizes queries |\n| `cursor.execute(\"...%s\", (input,))` | Parameterized query |\n| `innerHTML = \"\u003Cb>Loading...\u003C\u002Fb>\"` | Constant string, no user input |\n\n**Only flag these when:**\n- Django: `{{ var|safe }}`, `{% autoescape off %}`, `mark_safe(user_input)`\n- React: `dangerouslySetInnerHTML={{__html: userInput}}`\n- Vue: `v-html=\"userInput\"`\n- ORM: `.raw()`, `.extra()`, `RawSQL()` with string interpolation\n\n## Review Process\n\n### 1. Detect Context\n\nWhat type of code am I reviewing?\n\n| Code Type | Load These References |\n|-----------|----------------------|\n| API endpoints, routes | `authorization.md`, `authentication.md`, `injection.md` |\n| Frontend, templates | `xss.md`, `csrf.md` |\n| File handling, uploads | `file-security.md` |\n| Crypto, secrets, tokens | `cryptography.md`, `data-protection.md` |\n| Data serialization | `deserialization.md` |\n| External requests | `ssrf.md` |\n| Business workflows | `business-logic.md` |\n| GraphQL, REST design | `api-security.md` |\n| Config, headers, CORS | `misconfiguration.md` |\n| CI\u002FCD, dependencies | `supply-chain.md` |\n| Error handling | `error-handling.md` |\n| Audit, logging | `logging.md` |\n\n### 2. Load Language Guide\n\nBased on file extension or imports:\n\n| Indicators | Guide |\n|------------|-------|\n| `.py`, `django`, `flask`, `fastapi` | `languages\u002Fpython.md` |\n| `.js`, `.ts`, `express`, `react`, `vue`, `next` | `languages\u002Fjavascript.md` |\n| `.go`, `go.mod` | `languages\u002Fgo.md` |\n| `.rs`, `Cargo.toml` | `languages\u002Frust.md` |\n| `.java`, `spring`, `@Controller` | `languages\u002Fjava.md` |\n\n### 3. Load Infrastructure Guide (if applicable)\n\n| File Type | Guide |\n|-----------|-------|\n| `Dockerfile`, `.dockerignore` | `infrastructure\u002Fdocker.md` |\n| K8s manifests, Helm charts | `infrastructure\u002Fkubernetes.md` |\n| `.tf`, Terraform | `infrastructure\u002Fterraform.md` |\n| GitHub Actions, `.gitlab-ci.yml` | `infrastructure\u002Fci-cd.md` |\n| AWS\u002FGCP\u002FAzure configs, IAM | `infrastructure\u002Fcloud.md` |\n\n### 4. Research Before Flagging\n\n**For each potential issue, research the codebase to build confidence:**\n\n- Where does this value actually come from? Trace the data flow.\n- Is it configured at deployment (settings, env vars) or from user input?\n- Is there validation, sanitization, or allowlisting elsewhere?\n- What framework protections apply?\n\nOnly report issues where you have HIGH confidence after understanding the broader context.\n\n### 5. Verify Exploitability\n\nFor each potential finding, confirm:\n\n**Is the input attacker-controlled?**\n\n| Attacker-Controlled (Investigate) | Server-Controlled (Usually Safe) |\n|-----------------------------------|----------------------------------|\n| `request.GET`, `request.POST`, `request.args` | `settings.X`, `app.config['X']` |\n| `request.json`, `request.data`, `request.body` | `os.environ.get('X')` |\n| `request.headers` (most headers) | Hardcoded constants |\n| `request.cookies` (unsigned) | Internal service URLs from config |\n| URL path segments: `\u002Fusers\u002F\u003Cid>\u002F` | Database content from admin\u002Fsystem |\n| File uploads (content and names) | Signed session data |\n| Database content from other users | Framework settings |\n| WebSocket messages | |\n\n**Does the framework mitigate this?**\n- Check language guide for auto-escaping, parameterization\n- Check for middleware\u002Fdecorators that sanitize\n\n**Is there validation upstream?**\n- Input validation before this code\n- Sanitization libraries (DOMPurify, bleach, etc.)\n\n### 6. Report HIGH Confidence Only\n\nSkip theoretical issues. Report only what you've confirmed is exploitable after research.\n\n---\n\n## Severity Classification\n\n| Severity | Impact | Examples |\n|----------|--------|----------|\n| **Critical** | Direct exploit, severe impact, no auth required | RCE, SQL injection to data, auth bypass, hardcoded secrets |\n| **High** | Exploitable with conditions, significant impact | Stored XSS, SSRF to metadata, IDOR to sensitive data |\n| **Medium** | Specific conditions required, moderate impact | Reflected XSS, CSRF on state-changing actions, path traversal |\n| **Low** | Defense-in-depth, minimal direct impact | Missing headers, verbose errors, weak algorithms in non-critical context |\n\n---\n\n## Quick Patterns Reference\n\n### Always Flag (Critical)\n```\neval(user_input)           # Any language\nexec(user_input)           # Any language\npickle.loads(user_data)    # Python\nyaml.load(user_data)       # Python (not safe_load)\nunserialize($user_data)    # PHP\ndeserialize(user_data)     # Java ObjectInputStream\nshell=True + user_input    # Python subprocess\nchild_process.exec(user)   # Node.js\n```\n\n### Always Flag (High)\n```\ninnerHTML = userInput              # DOM XSS\ndangerouslySetInnerHTML={user}     # React XSS\nv-html=\"userInput\"                 # Vue XSS\nf\"SELECT * FROM x WHERE {user}\"    # SQL injection\n`SELECT * FROM x WHERE ${user}`    # SQL injection\nos.system(f\"cmd {user_input}\")     # Command injection\n```\n\n### Always Flag (Secrets)\n```\npassword = \"hardcoded\"\napi_key = \"sk-...\"\nAWS_SECRET_ACCESS_KEY = \"...\"\nprivate_key = \"-----BEGIN\"\n```\n\n### Check Context First (MUST Investigate Before Flagging)\n```\n# SSRF - ONLY if URL is from user input, NOT from settings\u002Fconfig\nrequests.get(request.GET['url'])     # FLAG: User-controlled URL\nrequests.get(settings.API_URL)       # SAFE: Server-controlled config\nrequests.get(f\"{settings.BASE}\u002F{x}\") # CHECK: Is 'x' user input?\n\n# Path traversal - ONLY if path is from user input\nopen(request.GET['file'])            # FLAG: User-controlled path\nopen(settings.LOG_PATH)              # SAFE: Server-controlled config\nopen(f\"{BASE_DIR}\u002F{filename}\")       # CHECK: Is 'filename' user input?\n\n# Open redirect - ONLY if URL is from user input\nredirect(request.GET['next'])        # FLAG: User-controlled redirect\nredirect(settings.LOGIN_URL)         # SAFE: Server-controlled config\n\n# Weak crypto - ONLY if used for security purposes\nhashlib.md5(file_content)            # SAFE: File checksums, caching\nhashlib.md5(password)                # FLAG: Password hashing\nrandom.random()                      # SAFE: Non-security uses (UI, sampling)\nrandom.random() for token            # FLAG: Security tokens need secrets module\n```\n\n---\n\n## Output Format\n\n```markdown\n## Security Review: [File\u002FComponent Name]\n\n### Summary\n- **Findings**: X (Y Critical, Z High, ...)\n- **Risk Level**: Critical\u002FHigh\u002FMedium\u002FLow\n- **Confidence**: High\u002FMixed\n\n### Findings\n\n#### [VULN-001] [Vulnerability Type] (Severity)\n- **Location**: `file.py:123`\n- **Confidence**: High\n- **Issue**: [What the vulnerability is]\n- **Impact**: [What an attacker could do]\n- **Evidence**:\n  ```python\n  [Vulnerable code snippet]\n  ```\n- **Fix**: [How to remediate]\n\n### Needs Verification\n\n#### [VERIFY-001] [Potential Issue]\n- **Location**: `file.py:456`\n- **Question**: [What needs to be verified]\n```\n\nIf no vulnerabilities found, state: \"No high-confidence vulnerabilities identified.\"\n\n---\n\n## Reference Files\n\n### Core Vulnerabilities (`references\u002F`)\n| File | Covers |\n|------|--------|\n| `injection.md` | SQL, NoSQL, OS command, LDAP, template injection |\n| `xss.md` | Reflected, stored, DOM-based XSS |\n| `authorization.md` | Authorization, IDOR, privilege escalation |\n| `authentication.md` | Sessions, credentials, password storage |\n| `cryptography.md` | Algorithms, key management, randomness |\n| `deserialization.md` | Pickle, YAML, Java, PHP deserialization |\n| `file-security.md` | Path traversal, uploads, XXE |\n| `ssrf.md` | Server-side request forgery |\n| `csrf.md` | Cross-site request forgery |\n| `data-protection.md` | Secrets exposure, PII, logging |\n| `api-security.md` | REST, GraphQL, mass assignment |\n| `business-logic.md` | Race conditions, workflow bypass |\n| `modern-threats.md` | Prototype pollution, LLM injection, WebSocket |\n| `misconfiguration.md` | Headers, CORS, debug mode, defaults |\n| `error-handling.md` | Fail-open, information disclosure |\n| `supply-chain.md` | Dependencies, build security |\n| `logging.md` | Audit failures, log injection |\n\n### Language Guides (`languages\u002F`)\n- `python.md` - Django, Flask, FastAPI patterns\n- `javascript.md` - Node, Express, React, Vue, Next.js\n- `go.md` - Go-specific security patterns\n- `rust.md` - Rust unsafe blocks, FFI security\n- `java.md` - Spring, Java EE patterns\n\n### Infrastructure (`infrastructure\u002F`)\n- `docker.md` - Container security\n- `kubernetes.md` - K8s RBAC, secrets, policies\n- `terraform.md` - IaC security\n- `ci-cd.md` - Pipeline security\n- `cloud.md` - AWS\u002FGCP\u002FAzure security\n\n## Structured Return\n\nWhen invoked directly or by a harness, return or merge this block:\n\n- **Status:** `PASS` when no high-confidence security findings remain, `FINDINGS` when exploitable issues exist, `BLOCKED` when threat context or sensitive paths cannot be inspected, `NOT_APPLICABLE` when no security-relevant surface is in scope.\n- **Scope:** assets, trust boundaries, languages\u002Fframeworks, data classes, and threat model slice.\n- **Evidence:** file\u002Fline references, exploit path, affected data\u002Factor, and reference category.\n- **Artifacts:** security findings, verification notes, remediation plan, or audit report.\n- **Decisions:** severity, confidence, exploitability, and false-positive rejection.\n- **Risks:** authz bypass, injection, secret exposure, SSRF, supply chain, logging, or misconfiguration.\n- **Next Step:** minimal remediation, verification, or explicit accepted risk owner.\n",{"name":5,"license":50,"description":7,"allowed-tools":51},"LICENSE","Read, Grep, Glob, Bash, Task","main","f04e65ab4887e349c14e5cd0af493f599eb159ca",".agents\u002Fskills\u002Fsecurity-review","https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui","https:\u002F\u002Fgithub.com\u002Fbrunosps","2026-09-08 04:21:13",{"source":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":70},[60,63,66],{"tool":61,"command":62},"npx","npx skills add brunosps\u002Fwinbox-gui --skill security-review",{"tool":64,"command":65},"bunx","bunx skills add brunosps\u002Fwinbox-gui --skill security-review",{"tool":67,"command":68},"pnpm","pnpm dlx skills add brunosps\u002Fwinbox-gui --skill security-review","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002FSKILL.md",true,[72,78,82,86,90,94,98,101,105,109,113,117,121,125,129,133,137,141,145,149,153,157,161,165,169,173],{"path":73,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":76,"sourceHtmlUrl":77},"infrastructure\u002Fdocker.md","REFERENCE","参考文档",9400,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Finfrastructure\u002Fdocker.md",{"path":79,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":80,"sourceHtmlUrl":81},"languages\u002Fcsharp.md",15847,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Flanguages\u002Fcsharp.md",{"path":83,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":84,"sourceHtmlUrl":85},"languages\u002Fjavascript.md",10094,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Flanguages\u002Fjavascript.md",{"path":87,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":88,"sourceHtmlUrl":89},"languages\u002Fpython.md",9492,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Flanguages\u002Fpython.md",{"path":91,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":92,"sourceHtmlUrl":93},"languages\u002Frust.md",18748,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Flanguages\u002Frust.md",{"path":95,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":96,"sourceHtmlUrl":97},"languages\u002Ftypescript.md",11309,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Flanguages\u002Ftypescript.md",{"path":50,"resourceType":50,"resourceTypeDesc":99,"sizeBytes":100,"sourceHtmlUrl":16},"许可证",884,{"path":102,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":103,"sourceHtmlUrl":104},"references\u002Fapi-security.md",12741,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Freferences\u002Fapi-security.md",{"path":106,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":107,"sourceHtmlUrl":108},"references\u002Fauthentication.md",9071,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Freferences\u002Fauthentication.md",{"path":110,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":111,"sourceHtmlUrl":112},"references\u002Fauthorization.md",10007,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Freferences\u002Fauthorization.md",{"path":114,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":115,"sourceHtmlUrl":116},"references\u002Fbusiness-logic.md",12660,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Freferences\u002Fbusiness-logic.md",{"path":118,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":119,"sourceHtmlUrl":120},"references\u002Fcryptography.md",8703,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Freferences\u002Fcryptography.md",{"path":122,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":123,"sourceHtmlUrl":124},"references\u002Fcsrf.md",9943,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Freferences\u002Fcsrf.md",{"path":126,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":127,"sourceHtmlUrl":128},"references\u002Fdata-protection.md",9565,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Freferences\u002Fdata-protection.md",{"path":130,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":131,"sourceHtmlUrl":132},"references\u002Fdeserialization.md",10234,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Freferences\u002Fdeserialization.md",{"path":134,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":135,"sourceHtmlUrl":136},"references\u002Ferror-handling.md",11632,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Freferences\u002Ferror-handling.md",{"path":138,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":139,"sourceHtmlUrl":140},"references\u002Ffile-security.md",12344,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Freferences\u002Ffile-security.md",{"path":142,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":143,"sourceHtmlUrl":144},"references\u002Finjection.md",6813,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Freferences\u002Finjection.md",{"path":146,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":147,"sourceHtmlUrl":148},"references\u002Flogging.md",12012,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Freferences\u002Flogging.md",{"path":150,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":151,"sourceHtmlUrl":152},"references\u002Fmisconfiguration.md",10305,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Freferences\u002Fmisconfiguration.md",{"path":154,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":155,"sourceHtmlUrl":156},"references\u002Fmodern-threats.md",13269,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Freferences\u002Fmodern-threats.md",{"path":158,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":159,"sourceHtmlUrl":160},"references\u002Fsast.md",3284,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Freferences\u002Fsast.md",{"path":162,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":163,"sourceHtmlUrl":164},"references\u002Fsecrets.md",2127,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Freferences\u002Fsecrets.md",{"path":166,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":167,"sourceHtmlUrl":168},"references\u002Fssrf.md",10776,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Freferences\u002Fssrf.md",{"path":170,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":171,"sourceHtmlUrl":172},"references\u002Fsupply-chain.md",9149,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Freferences\u002Fsupply-chain.md",{"path":174,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":175,"sourceHtmlUrl":176},"references\u002Fxss.md",7599,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002Freferences\u002Fxss.md",[178],{"skillNo":179,"name":180,"nameZh":6,"description":181,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":182,"licenseFileUrl":6,"sourceHtmlUrl":183,"categories":184,"keywords":188,"publishedAt":45},"01M71QXR7MJD1NSFW62VKT6GKK","vercel-react-best-practices","Use for React\u002FNext.js performance optimization. 67 rules across async, bundle, client, render, JS micro-perf. Triggers on React components, Next.js pages, data fetching, perf review, hydration issues.","MIT","https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002FSKILL.md",[185],{"categoryNo":186,"categoryName":187,"taxonomyType":22,"taxonomyTypeDesc":23},"01JBSEEDCAT000000000000009","前端开发",[189,190,191,192,193,194,195,30,196,197,38,198,199,200,27,201,202,203,204,205],"react best practices","vercel react best practices","vercel","best practices","react","async","Optimization","perf","data","next","react components","across","data fetching","components","issues","render","performance"]