Pular para conteúdo

AUR-622 — Plugin externo na validação agendada, achados só na aba Security

Problema

O dono pediu um harness agêntico de vulnerabilidade como plugin externo da validação agendada, sem que a vulnerabilidade fique pública: num repositório público, log do Actions, resumo do job, anotações, artefatos e PR são públicos; a lista de alertas de code scanning exige escrita.

Desenho

arquivo responsabilidade
internal/config/scheduled.go scheduled.plugins: validação na leitura (digest ou Dockerfile, env só nomes, output.path relativo, nome único) e governScheduled (entrada required da política vence; não obrigatória cede).
internal/plugin/adapter_vvah.go, adapter_sarif.go Um adaptador por formato: findings.json 1.x do harness (só main + TRUE_POSITIVE; o resto conta) e SARIF genérico (executionSuccessful, hollow, coverageDegraded).
internal/plugin/harness_coverage.go vvah-findings lê também o SARIF do harness e o *_errors.jsonl: perda de cobertura ou erro de estágio s2–s6 é inconclusivo, mesmo com exit 0 e degraded: false.
internal/plugin/paths.go Caminho absoluto, .., inexistente ou que sai por link simbólico reprova o ingest.
internal/plugin/sarif.go SARIF 2.1.0: driver AurumCode plugin <nome>, plugin/<nome>/<cwe>, partialFingerprints (case_id), automationDetails.id, security-severity; texto redigido campo a campo; gravação atômica.
internal/plugin/ingest.go, report.go Ordem do ingest; inconclusivo e recusa não gravam SARIF (exit 1); a saída é só contagem e motivo estável.
internal/plugin/destination.go security ou issues pela visibilidade; repositório público nunca usa issue.
cmd/aurumcode/cmd_plugin.go aurumcode plugin list|ingest|destino (só flags).
.github/workflows/review.yml Jobs plugins-list e plugins (matriz por plugin) em schedule/workflow_dispatch na branch padrão; saída do plugin em arquivo; upload-sarif fixado, categoria aurumcode/plugin/<nome>.
demo/plugins/vvah/ Imagem do harness fixado por commit; perfil "só descoberta" gerado do default.yaml do pacote.
demo/tutoriais/plugin-agendado/ Tutorial offline: 3 casos de uso e 2 de falha.

Rodada de correção

  • Política central com dockerfile é recusada na leitura (ValidatePolicy).
  • Descarte INCONCLUSIVE/VERIFY_ERROR/UNCONFIRMED vira aviso plugin/<nome>/nao-verificado/<classe>; coverageDegraded só por motivos representados (s6_undetermined) é conclusivo; zero_analysis e motivo desconhecido seguem inconclusivos.
  • Timeout do job = timeout do plugin + 30 min (job_timeout_minutes); rc 124 vira uma linha no log.
  • Achado dentro do diretório de output.path é recusado.
  • pull_request: os jobs são pulados pelo if:; o passo de recusa é defesa em profundidade.

Aceite

tests/acceptance/AUR-622.sh: AC-001..AC-006, MUT-001 (aceitar degraded: true derruba AC-003) e MUT-002 (imprimir a saída do plugin derruba AC-002).

Pendências declaradas

  • Sincronização de issues para repositório privado sem Code Security: o destino é decidido e, quando seria issues, o job falha sem publicar.
  • Formato do *_errors.jsonl (stage, error), finding.file relativo e a montagem somente leitura com security-scan/ gravável confirmados na prova real.