Executando verificação de segurança...
1

Orquestrei 8 scanners de segurança num pipeline local pra quem coda com IA generativa

Orquestrei 8 scanners de segurança num pipeline local pra quem coda com IA generativa

«Pipeline local que roda 8 scanners de segurança em paralelo sobre repo, imagem Docker ou filesystem, e agrupa findings por estratégia de correção — não por severidade.»

A ideia surgiu depois de perceber um padrão recorrente no uso de IA generativa para desenvolvimento: a velocidade aumentou muito, mas a visibilidade sobre o que está entrando no projeto caiu na mesma proporção.

O contexto

Karpathy definiu “vibe coding” em 2025:

«“Give in to the vibes, embrace exponentials, and forget that the code even exists.”»

Na prática:

  • pede componente pro Claude/Cursor/Copilot
  • aceita código e dependências sugeridas
  • tudo funciona
  • próximo prompt

Depois de algumas semanas:

  • dezenas de dependências diretas
  • centenas de transitivas
  • imagens Docker herdadas de exemplos
  • pouca noção real da superfície de ataque

O problema não é só “código inseguro”.

É que IA generativa normalmente:

  • sugere libs antigas com CVEs públicos
  • não considera vulnerabilidades da imagem base
  • ignora problemas operacionais do Dockerfile
  • não detecta secrets hardcoded
  • não avalia configuração insegura

Em desenvolvimento tradicional isso já passava. Em fluxo acelerado por IA, passa ainda mais.


O problema das ferramentas atuais

Ferramentas como Snyk, Wiz e Aqua resolvem muita coisa, mas normalmente entram melhor em ambientes corporativos maiores.

No cenário local/individual, o fluxo costuma virar algo assim:

trivy ...
grype ...
semgrep ...
gitleaks ...

Depois:

  • vários JSONs
  • formatos diferentes
  • findings duplicados
  • sem priorização prática

Na maioria das vezes, ninguém consolida isso manualmente.


O que o projeto faz

Você sobe tudo localmente:

docker compose up -d

Depois acessa:

localhost:3000

E consegue escanear:

  • repositório Git
  • filesystem
  • imagem Docker

Os scanners atuais:

  • Trivy
  • Grype
  • OSV-Scanner
  • Docker Scout
  • Semgrep
  • Gitleaks
  • Hadolint
  • Syft

A ideia não foi evitar sobreposição.

Foi justamente permitir confirmação cruzada entre scanners diferentes.


O ponto principal: bucketing por estratégia de correção

A maioria das ferramentas organiza findings por severidade.

O problema é que isso frequentemente gera algo assim:

486 HIGH/CRITICAL

Na prática, vira ruído.

O pipeline tenta reorganizar isso por ação necessária.

Buckets atuais

"fixable"

Existe versão corrigida disponível.

Normalmente resolve com upgrade de pacote.

"patch_gap"

Existe fix upstream, mas a distro/base image ainda não publicou pacote.

Normalmente envolve:

  • trocar imagem base
  • esperar backport
  • avaliar outra distro

"no_fix"

Não existe correção disponível ainda.

Então a decisão muda:

  • mitigação
  • hardening
  • feature flag
  • monitoramento
  • compensação operacional

"code"

Problema diretamente no código/configuração:

  • secrets
  • SAST
  • Dockerfile
  • IaC

Exemplo real

Imagem Python escaneada:

486 HIGH/CRITICAL

Depois do bucketing:

fixable: 28
patch_gap: 0
no_fix: 458
code: 0

Os 486 continuam existindo.

Mas agora fica mais claro o que é acionável imediatamente e o que depende do ecossistema upstream.


Integração com IA

O pipeline gera prompts separados por bucket.

Exemplo:

fixable_app (28)
→ sugira upgrades exatos

patch_gap
→ vale trocar a base image?

no_fix
→ proponha mitigação

code
→ mostre snippets corrigidos

A resposta da IA melhora bastante quando o contexto já vem segmentado.


Segurança do próprio pipeline

O backend precisa acessar o Docker daemon para escanear imagens locais.

E aí entra um ponto delicado:

Docker socket praticamente equivale a root no host

Ao invés de montar "/var/run/docker.sock" direto no backend, coloquei um "docker-socket-proxy" na frente.

Fluxo:

backend → docker-proxy → docker.sock

Endpoints liberados:

  • "/images"
  • "/info"
  • "/version"
  • "/_ping"

Bloqueados:

  • criação de containers
  • exec
  • build
  • volumes
  • networks

A ideia foi reduzir o impacto caso algum scanner ou subprocess seja comprometido.

Trade-off: imagens remotas precisam ser "docker pull" antes do scan, porque "POST /images/create" fica bloqueado.


Stack

Backend

  • Python 3.12
  • FastAPI
  • SQLModel
  • SQLite

Frontend

  • Next.js 14
  • Tailwind
  • TypeScript

Outros

  • MCP server compatível com Claude Desktop
  • execução paralela via "asyncio + subprocess"

Algumas decisões foram intencionais:

  • SQLite porque o foco é local-first/single-user
  • sem auth porque não foi pensado para exposição pública
  • sem Postgres para evitar complexidade desnecessária

O que ele não tenta resolver

  • não substitui plataforma enterprise
  • não faz runtime detection
  • não substitui pentest
  • não substitui revisão humana
  • não resolve lógica de autorização/regra de negócio

O foco é reduzir cegueira operacional em fluxo acelerado por IA generativa.


Licença

Usei:

PolyForm Noncommercial 1.0.0

Porque a maior parte do valor do projeto vem da orquestração e consolidação sobre scanners open-source já existentes.

Não queria cair imediatamente no padrão:

wrapper + landing page + SaaS

sem retorno para o ecossistema original.


O que ainda quero melhorar

Principalmente:

  • reduzir falsos positivos duplicados
  • melhorar correlação entre scanners
  • adicionar cache incremental
  • melhorar análise de Docker layers
  • discutir melhor o modelo de isolamento do Docker socket

Esse último é o ponto que mais gostaria de ouvir opinião de quem trabalha mais próximo de AppSec/Container Security.

PRs, issues e críticas são bem-vindos.


Construído com IA. Revisado manualmente. E provavelmente ainda cheio de pontos cegos.

Carregando publicação patrocinada...