Files
SlipItIn/.github/skills/security-specialist/references/finding-format.md
Tim Krampitz 01046b01e4 Neue Skills, Referenzen & OpenWiki-Doku integriert
Umfangreiche Erweiterung der Skill-Bibliothek: Neue Skills für Humanisierung (Englisch/PT-BR), Design-Validierung, AI-SEO und Coolify-Deployment inkl. Regelwerke, Presets, Pattern-Referenzen, Testfälle und Automatisierungsskripte. Zusätzliche Skills für Revenue-Centric Design, Pier Cloud, OKF, Lebenslauf- und LinkedIn-Optimierung sowie zahlreiche Referenzdateien, Checklisten und YAML/JSON/Markdown-Templates. Einführung einer vollständigen OpenWiki-Dokumentation mit Architektur-, Domain- und Workflow-Beschreibungen, zentralem Index und automatisierten Updates. Modularer Aufbau, restriktive Lizenzen und umfassende Qualitäts- und Evaluationsmechanismen für alle neuen Inhalte.
2026-07-26 14:00:58 +02:00

7.0 KiB
Raw Permalink Blame History

Finding Format Specification

Este documento define a estrutura canônica de um security finding. Todo finding produzido pelo security-specialist DEVE conformar a este schema.


Formato Simples (SQLite — uso interno)

Para persistência no scan.db e workflows modulares (discovery, triage, diff-review):

Field Type Required Description
id UUID v4 yes Identificador único
scan_id UUID v4 yes FK para scan session parent
title string yes Nome da vulnerabilidade (≤ 80 chars)
severity enum yes critical, high, medium, low, info
category enum yes injection, xss, auth, crypto, exposure, config, dependency, logic, other
status enum yes open, fixed, false-positive, accepted-risk, tracked
file_path string yes Repo-relative path
line_number integer yes Line onde a vulnerabilidade origina
description string yes 24 frases explicando o quê e por quê importa
evidence string yes Código, data flow trace, ou PoC
remediation string no Fix sugerido
tracking_url string no URL do issue tracker externo
notes string no Notas de triage
created_at string yes ISO 8601 timestamp

Formato Estruturado (JSON — output de full-scan pipeline)

Para findings que passam pela pipeline completa de 6 fases (full-scan), use o formato rico definido em report-schema.json. Este formato é obrigatório para o output findings.json do full-scan.

Campos do Formato Estruturado

Field Description
verdict confirmed ou rejected
title Título conciso e padronizado
description Explicação completa com detalhes de reprodução
root_cause Template: [function] em [file] não [ação], permitindo [consequência]
intended_behavior O que o dev tentou construir (lógica não-vulnerável)
trace Array sequencial: entrypointpropagation* → sink
conditions Pré-requisitos factuais para exploração
execution Perspectiva do atacante, payloads, instruções, resultado esperado
remediation Estratégia + code_changes opcionais
severity Likelihood × Impact, cada com score + reason
confidence Score (low/medium/high) + reason

Trace

Cada step do trace contém:

{
  "kind": "entrypoint|propagation|sink",
  "file": "src/routes/users.js",
  "line": 42,
  "scope": "searchUsers",
  "description": "User input from query param 'q' enters the handler"
}

Regras:

  • Mínimo 2 steps (entrypoint + sink)
  • Primeiro step DEVE ser kind: "entrypoint"
  • Último step DEVE ser kind: "sink"
  • File paths relativos à raiz do repositório
  • Scope é function/method name sem parênteses

Conditions

Pré-requisitos factuais. Array vazio = explorável por default.

{
  "kind": "authentication_level",
  "description": "Requires authenticated session with any role"
}

Kinds válidos: authentication_level, authorization_role, user_interaction, system_configuration, network_routing, environmental_dependency, data_state, timing_dependency, third_party_dependency

Execution

{
  "attacker_perspective": "Authenticated user with basic role",
  "payloads": ["GET /api/search?q=' UNION SELECT password FROM users--"],
  "instructions": [
    "Login with any valid account",
    "Navigate to search endpoint",
    "Inject SQL via query parameter"
  ],
  "expected_result": "Response contains all user password hashes"
}

Confidence

{
  "score": "high",
  "reason": "Full trace verified against source. All steps readable and confirmed."
}
  • high: Trace completo verificado, exploit testável
  • medium: Trace parcialmente verificado, algumas assumptions
  • low: Static analysis only, complex routing, missing files

Quando Usar Qual Formato

Workflow Formato
full-scan (pipeline 6 fases) Estruturado (findings.json validado contra schema)
discovery, diff-review, triage Simples (SQLite)
pentest Simples (SQLite) + evidence expandida
reporting (HTML final) Ambos — HTML renderiza de qualquer fonte

Validação

Para o formato estruturado, valide com:

node scripts/validate-findings.cjs .security/scans/<timestamp>/findings.json

O validador checa: required fields, enum values, structural constraints, additionalProperties, e semantic rules (trace starts at entrypoint, ends at sink).


Exemplo: Formato Estruturado Completo

{
  "verdict": "confirmed",
  "title": "SQL Injection in user search endpoint",
  "description": "User-supplied search parameter is concatenated directly into SQL query. Authenticated user can extract arbitrary data including credentials.",
  "root_cause": "searchUsers in src/routes/users.js does not parameterize user input, allowing arbitrary SQL execution.",
  "intended_behavior": "Search should filter users by name using parameterized queries, returning only matching records the caller is authorized to see.",
  "trace": [
    {
      "kind": "entrypoint",
      "file": "src/routes/users.js",
      "line": 35,
      "scope": "searchUsers",
      "description": "User input from req.query.search enters handler"
    },
    {
      "kind": "propagation",
      "file": "src/routes/users.js",
      "line": 42,
      "scope": "searchUsers",
      "description": "Input concatenated into SQL string template without escaping"
    },
    {
      "kind": "sink",
      "file": "src/routes/users.js",
      "line": 43,
      "scope": "searchUsers",
      "description": "Concatenated string passed to db.raw() for execution"
    }
  ],
  "conditions": [
    {
      "kind": "authentication_level",
      "description": "Requires valid session (any role)"
    }
  ],
  "execution": {
    "attacker_perspective": "Authenticated user with basic role",
    "payloads": ["GET /api/users?search=' UNION SELECT password FROM users--"],
    "instructions": [
      "Login with any valid account",
      "Send GET request to /api/users with crafted search parameter",
      "Observe response containing all password hashes"
    ],
    "expected_result": "Response body contains password hashes for all users in database"
  },
  "remediation": {
    "strategy": "Use parameterized queries via the ORM's query builder instead of string concatenation.",
    "code_changes": [
      {
        "file_name": "src/routes/users.js",
        "fixed_code": "const results = await db('users').where('name', 'like', `%${search}%`);"
      }
    ]
  },
  "severity": {
    "likelihood": { "score": "high", "reason": "Any authenticated user can exploit. No special tools needed." },
    "impact": { "score": "critical", "reason": "Full database read access including credentials and PII." },
    "overall_severity": "critical"
  },
  "confidence": {
    "score": "high",
    "reason": "Full trace verified. db.raw() confirmed at line 43. No parameterization in path."
  }
}