UNFLD
← Blog

Pedro Viana, CEO da UNFLD

Sentinela CVE

Quem lê a CVE
quando ninguém tem tempo?

Vulnerabilidades novas são publicadas o tempo todo, mais rápido do que qualquer time consegue ler. Cada uma pede alguém para abrir o registro, procurar nos repositórios e decidir se é grave. Na UNFLD, demos esse trabalho a um agente. Esta é a história dele.

SENTINELA
Nomes de componentes das rodadas reais do fim de outubro e do começo de novembro de 2026. Não é um feed ao vivo. Os identificadores CVE, quando existem, estão no texto.

O problema

As vulnerabilidades não esperam ninguém ter tempo.

A toda hora, alguém publica uma CVE nova. Numa biblioteca, num plugin, num sistema operacional, numa ferramenta de build. Elas não param de chegar. E chegam mais rápido do que qualquer time consegue ler.

Cada uma pede o mesmo trabalho. Abrir o registro oficial, entender qual é o componente, descobrir se você usa, em que versão, em qual repositório. Só então decidir se é urgente.

Poucos times têm alguém livre para isso. A leitura fica para depois. E o risco fica ali, quieto, sem ninguém olhar.

A nossa resposta

Colocamos tecnologia para ler por nós.

Na UNFLD, também não tínhamos esse tempo. O time estava construindo produto. Então mudamos a pergunta. Não quem tem tempo. O que pode fazer isso por nós, todo dia, sem esquecer nada.

A resposta foi um agente no Grok Bot, com uma rotina e um trabalho só: ler cada vulnerabilidade nova, confirmar em fonte oficial e dizer, com evidência, se ela toca o que operamos. Demos a ele o nome de Sentinela CVE. Ele começou simples. E cresceu.

O primeiro trabalho dele é saber onde olhar.

1 · A fonte

A pressa vem do X. A verdade vem das fontes oficiais.

A primeira versão lia o @CVEnew, no X. Funcionava. Mas um post é um aviso, não um registro.

Hoje, quem decide são as fontes oficiais: OSV, GitHub Advisory, NVD, o catálogo KEV da CISA e o EPSS, da FIRST. Cada item passa por elas antes de virar qualquer resposta.

O @CVEnew continua no radar, como sinal de velocidade. Ele faz o Sentinela olhar antes. Não prova nada sozinho.

Ao lado, três rodadas reais da primeira versão, quando o @CVEnew ainda era a porta de entrada. Leia os nomes. Agora imagine alguém do time fazendo isso, um por um.

@CVEnew · rodada com 14 CVEs

  • Ninja Formsplugin WordPress
  • GNOME EpiphanyGNOME
  • json-glibRHEL / OpenShift
  • WebDynePerl

Nenhuma tocava a UNFLD.

@CVEnew · rodada com 8 CVEs

  • konflux-ciquatro CVEs · HIGH 8.0 a 8.8
  • plugins WordPressquatro CVEs

Busca por "konflux" na nossa organização. Nenhum arquivo.

@CVEnew · rodada com 29 CVEs

  • weDevs Project Managerplugin WordPress
  • SimpleFormplugin WordPress
  • Uncanny Toolkit for LearnDash9.8 CRITICAL

De 4.3 MEDIUM a 9.8 CRITICAL. Nenhuma exposta.

2 · O registro

Um post não é prova.

Para cada item, o Sentinela busca o registro em OSV, GitHub Advisory e NVD. Confere se ele está no KEV da CISA, o catálogo de vulnerabilidades com exploração conhecida. E lê o EPSS, a estimativa da FIRST para a chance de exploração.

Se um dado não está escrito, ele não preenche. Nem CVSS, nem versão, nem evidência.

Fonte oficial. Versão exata. Nada alterado.

Com o registro na mão, sobram duas perguntas. Isto é com a gente? E quanto pesa?

3 · A triagem

Quatro faixas. Nenhuma por educação.

Primeiro, se a gente usa. A correspondência é exata, por pacote e por versão. Sem palpite.

Depois, o peso. Nota alta sozinha não decide mais nada. O Sentinela junta quatro sinais: o CVSS, o EPSS, a presença no KEV e a exploração conhecida. E põe cada item numa de quatro faixas.

Se falta dado para fechar a conta, a resposta é incerto. Nunca não. Prefiro uma dúvida honesta a um alívio falso.

Quatro faixas. E uma resposta para quando falta dado.

Ação imediata

Agir já

O sinal mais forte da combinação. Vai para o topo da fila.

Ação

Agir

Pede correção, sem a pressa da faixa de cima.

Monitorar

Acompanhar

Ainda não pede correção. Fica sob observação.

Não exposto

Fora da nossa stack

Pacote ou versão que não rodamos. Uma linha, com o motivo.

Incerto

Faltou dado, ou um conector está sem acesso. A dúvida aparece no alerta. Nunca vira não exposto.

4 · A busca

Ele sabe o que roda. Até a dependência da dependência.

Para responder se é com a gente, o Sentinela precisa de um inventário. Hoje ele lê os lockfiles, com as dependências transitivas. As imagens Docker. As configurações de Cloudflare Workers e da Vercel. Em npm, PyPI e GitHub Actions.

O foco é o que está em produção e em uso. Repositório arquivado ou parado fica de fora, por escolha. A cobertura não é total, e eu prefiro dizer isso aqui.

Tudo somente leitura. Ele olha e não toca. A janela ao lado mostra o formato do inventário. Não é um log copiado.

Achar é metade do trabalho. A outra metade é contar ao time.

inventário · somente leitura

# Sentinela · inventário somente leitura# foco: o que está em produção e em uso lockfiles            # com dependências transitivasimagens DockerCloudflare Workers   # configuraçõesVercel               # configurações # ecossistemasnpmPyPIGitHub Actions # correspondência: pacote + versão, exata# faltou dado: Incerto 

5 · O aviso

Um e-mail que diz o que fazer.

O aviso continua chegando por e-mail HTML, com a identidade da UNFLD e compatível com o modo escuro. Cada alerta traz a evidência: o pacote, a versão e onde ele aparece. Quando falta dado, o alerta diz incerto.

Os dois e-mails abaixo são da primeira versão, com o que as rodadas reais acharam. O formato evoluiu. O princípio é o mesmo: evidência, ou a dúvida dita com todas as letras.

E quando a exposição se confirma, o e-mail não é mais o fim da história.

UNFLDAlerta · primeira versão

konflux-ci · Exposto: Não

Quatro CVEs HIGH, de 8.0 a 8.8. No e-mail de verdade, o assunto leva o identificador CVE. Aqui ele fica de fora, para não inventar um.

Componente
konflux-ci
CVSS
HIGH · 8.0 a 8.8
Exposição
Não
Evidência
Organização GitHub da UNFLD · busca "konflux" · nenhum arquivo
Correção, urgência, prompt
Só entravam quando havia exposição. Aqui, não houve.
UNFLDResumo da rodada · primeira versão

14 CVEs · nenhuma exposta

Uma linha por CVE descartada. Aqui aparecem os nomes que eu posso citar. O e-mail lista a rodada inteira.

Ninja Forms
plugin WordPress · não exposto
GNOME Epiphany
não exposto
json-glib
RHEL / OpenShift · não exposto
WebDyne
Perl · não exposto
As outras da rodada
uma linha cada · o mesmo veredito

6 · O ciclo fechado

Da exposição à correção pronta para revisão.

Avisar já não basta. Quando a exposição se confirma, um agente de código do Cursor prepara a correção, valida o build e entrega tudo em um pull request para revisão humana.

Ele nunca faz merge sozinho. Não abre issue. Quem decide continua sendo uma pessoa do time.

Na primeira execução, as correções de 6 projetos ficaram prontas, com o build passando. Para o pull request abrir sozinho, falta uma permissão no GitHub. Até lá, a correção fica pronta e espera revisão.

Quatro passos, da evidência à mão de quem revisa.

01

Exposição confirmada

Pacote e versão batem, com evidência.

02

Correção preparada

Um agente de código do Cursor escreve a mudança.

03

Build validado

A correção só segue com o build passando.

04

Revisão humana

Entregue em PR. Merge, só por uma pessoa do time.

A rodada inteira

Cinco passos. Sempre na mesma ordem.

Ouvir, cruzar, priorizar, avisar, corrigir. A rodada completa roda de segunda a sexta, às 9h e às 17h, horário de Brasília.

Bonito no papel. Agora, o que já aconteceu de verdade, ainda na primeira versão.

  1. 01

    Ouvir

    O @CVEnew avisa rápido. As fontes oficiais confirmam: OSV, GitHub Advisory, NVD, CISA KEV e EPSS.

  2. 02

    Cruzar

    Pacote e versão exatos contra o inventário: lockfiles, imagens Docker, Cloudflare Workers e Vercel.

  3. 03

    Priorizar

    CVSS, EPSS, KEV e exploração conhecida. Ação imediata, ação, monitorar ou não exposto. Faltou dado: incerto.

  4. 04

    Avisar

    E-mail HTML com a identidade da UNFLD, compatível com o modo escuro, com a evidência de cada item.

  5. 05

    Corrigir

    Exposição confirmada: um agente de código prepara a correção, valida o build e entrega em PR para revisão humana.

A prova

Três rodadas. Três respostas com motivo.

Fim de outubro, começo de novembro de 2026. Três rodadas trouxeram CVE nova, nesta ordem. As outras não encontraram nada e ficaram em silêncio.

14

Catorze CVEs. Nenhuma nossa.

Plugins de WordPress e WooCommerce, entre eles o Ninja Forms. GNOME Epiphany. json-glib no RHEL e no OpenShift. WebDyne, para Perl. Nenhuma tocava a UNFLD. Uma linha cada, no resumo da rodada.

8

Oito CVEs. Quatro com nota alta.

Quatro eram do konflux-ci, HIGH, de 8.0 a 8.8. O Sentinela procurou konflux na nossa organização no GitHub. Nada. As outras quatro eram plugins de WordPress. Também fora.

29

Vinte e nove CVEs. Uma de 9.8.

Plugins de WordPress, de 4.3 MEDIUM a 9.8 CRITICAL. Entre eles, weDevs Project Manager e SimpleForm. O 9.8 era do Uncanny Toolkit for LearnDash. Nenhuma das 29 estava exposta.

Se o seu time também não tem tempo de ler CVE, este é o trabalho que a UNFLD faz.

A virada · 1º de novembro de 2026

E então o problema veio de outro lugar.

No dia 1º de novembro, a Vercel parou de aceitar builds novos deste site. O motivo: uma CVE de XSS conhecida, CVE-2026-102989, no @tanstack/react-start 1.168.48. Uma dependência nossa.

Quem percebeu não foi o Sentinela. Foi outro agente, o que cuida deste site. Ele achou o bloqueio. O pull request corrigido do Dependabot entrou com a minha aprovação, e a produção voltou assim que ele entrou. Os outros pull requests de dependência foram rebaseados e entraram depois que as previews passaram. Tudo no mesmo dia.

Não foi sorte. É o desenho. Um agente por trabalho, cada um no seu pedaço.

O dia, em quatro tempos.

  1. O bloqueio

    A Vercel recusou builds novos deste site.

  2. CVE-2026-102989

    XSS no @tanstack/react-start 1.168.48.

  3. O bot do site

    Achou o bloqueio. O patch do Dependabot entrou com a minha aprovação.

  4. O mesmo dia

    A produção voltou assim que o patch entrou. O resto entrou com as previews no verde.

O que mudou

Uma rodada completa. E um olho aberto a toda hora.

No começo, o Sentinela rodava a cada 30 minutos, dia e noite. Como cada rodada partia do último post lido, rodar mais vezes não trazia nenhuma CVE a mais. Só repetia a leitura. Passamos para duas rodadas completas por dia útil.

Hoje são dois ritmos. A rodada completa continua de segunda a sexta, às 9h e às 17h, horário de Brasília. E uma checagem extra roda a cada hora, 24 horas por dia, sete dias por semana. Ela vigia o KEV da CISA e as CVEs novas com CVSS 9.0 ou mais.

O que pode esperar, espera a rodada. O que não pode, não espera.

O mesmo dia, na primeira versão e agora.

Primeira versão · todos os dias

A cada 30 minutos

Dia e noite, fim de semana incluído. Cada rodada já pegava o que tinha ficado para trás. O intervalo curto só repetia a leitura.

Agora · horário de Brasília

9h e 17h. E a cada hora.

Rodada completa de segunda a sexta, às 9h e às 17h. A cada hora, todos os dias, uma checagem extra vigia o KEV da CISA e CVEs novas com CVSS 9.0 ou mais.

A evolução

A primeira versão avisava. A de hoje prepara a correção.

O Sentinela não nasceu pronto. Cada rodada mostrou onde ele podia ver mais longe. E a gente foi ajustando.

Linha por linha, o que mudou.

Fonte
Primeira versãoO @CVEnew, no X.
HojeOSV, GitHub Advisory, NVD, CISA KEV e EPSS. O X só avisa rápido.
Ritmo
Primeira versãoA cada 30 minutos. Depois, 9h e 17h em dia útil.
Hoje9h e 17h em dia útil, mais uma checagem por hora, 24/7, para KEV e CVSS 9.0 ou mais.
O que ele olha
Primeira versãopackage.json, lockfiles, Dockerfiles, workflows e wrangler.toml no GitHub. Workers e Pages na Cloudflare.
HojeLockfiles com dependências transitivas, imagens Docker, Cloudflare Workers e Vercel. npm, PyPI e GitHub Actions.
Prioridade
Primeira versãoCVSS e uma urgência por alerta: crítica, alta, média ou baixa.
HojeCVSS, EPSS, KEV e exploração conhecida, em quatro faixas: ação imediata, ação, monitorar, não exposto.
Com exposição
Primeira versãoUma correção sugerida e um prompt em inglês para colar.
HojeUm agente de código do Cursor prepara a correção, valida o build e entrega em PR para revisão humana.

O que não mudou: só leitura, evidência em cada alerta, e incerto quando falta dado.

Em números

Seis números. Todos reais.

Nenhum arredondado. Nenhum somado. Só o que as rodadas e a rotina mostram.

14

CVEs novas numa rodada

Ninja Forms, GNOME Epiphany, json-glib, WebDyne e outras. Nenhuma tocava a UNFLD.

8

CVEs em outra rodada

Quatro do konflux-ci, HIGH, de 8.0 a 8.8. Busca no GitHub: nenhum arquivo.

29

CVEs de plugins WordPress

De 4.3 MEDIUM a 9.8 CRITICAL. O 9.8 é do Uncanny Toolkit for LearnDash. Nenhuma exposta.

5

fontes oficiais

OSV, GitHub Advisory, NVD, CISA KEV e EPSS. O X virou só um sinal de velocidade.

1 h

checagem extra, 24/7

Vigia o KEV da CISA e CVEs novas com CVSS 9.0 ou mais. A rodada completa segue às 9h e às 17h, de segunda a sexta.

6

projetos com correção pronta

Na primeira execução, com o build passando. Cada uma espera revisão humana.

A sua empresa

A UNFLD constrói este agente para a sua empresa.

O Sentinela é como a UNFLD protege o que opera. Fontes oficiais. Versão exata. Leitura sem tocar em nada. Prioridade com quatro sinais. Correção pronta para revisão humana.

Podemos construir e operar um agente assim para você. Nos seus repositórios, na sua infraestrutura, com o seu time e os seus critérios de urgência. Um agente que vigia a stack para que o seu time não precise.

Conte para a gente o que ninguém aí tem tempo de olhar.