
Security Researcher
Heitor Gouvêa

O problema que ninguém visualiza
Quando uma vulnerabilidade é corrigida em um projeto open source, a cadeia até a sua imagem de produção não é direta. Ela tem múltiplas etapas, e cada uma tem seu próprio tempo.
O fluxo típico funciona assim:
Fix é mergeado no upstream (por exemplo, no repositório do OpenSSL, Node.js, ou Python);
Maintainers da distribuição (Debian, Ubuntu, Alpine) trazem essa nova versão com a correção para seus pacotes;
Seu CI/CD reconstrói a imagem final da aplicação;
O deploy acontece e a correção finalmente chega à produção.
Em condições ideais: coordenação de disclosure, maintainers rápidos, CI configurado para detectar mudanças na base, esse fluxo leva entre uma e quatro semanas. Em condições reais: leva muito mais.
Uma simples análise rastreando seis vulnerabilidades de alto impacto de 2021 a 2024 revelou um padrão consistente: mesmo nos casos de melhor coordenação, onde o pacote atualizou com o patch, no mesmo dia que o upstream, as imagens de container continuaram expostas por uma a quatro semanas. No pior cenário, meses.
Para ilustrar:
CVE | Fix disponível upstream | Patch na distro | Janela de exposição real |
CVE-2024-6119 (OpenSSL) | Dia 0 | Dia 0 | 7–28 dias (imagem Docker) |
CVE-2023-38545 (curl SOCKS5 heap overflow) | Dia 0 | Dia 0 | 7–14 dias |
CVE-2021-44228 (Log4Shell, CVSS 10.0) | Dia 1 | Dia 1–7 | 14–60+ dias |
CVE-2023-44487 (HTTP/2 Rapid Reset) | Dia 0 (Tomcat) | 43 dias (nghttp2) | 7–50+ dias |
Essa janela tem um nome: patch gap. E ela existe não por negligência, mas por estrutura.

Quor Newsletter
Por que o patch gap é estrutural
Os maintainers de distribuições Linux fazem um trabalho sério. Mas a realidade é que o Debian, por exemplo, tem cerca de mil maintainers ativos para mais de trinta mil pacotes-fonte. Quando uma CVE é divulgada, o maintainer responsável pelo pacote específico precisa identificar o fix, fazer o backport para a versão que a distribuição empacota (não necessariamente a versão atual do upstream), testar, publicar, e aguardar o build. Para pacotes de alto perfil como openssl e curl, isso é rápido. Para os outros, é quando alguém encontra tempo.
Há outro mecanismo menos óbvio: as distribuições geralmente não atualizam para a nova versão do software. Elas aplicam o fix específico sobre a versão que já empacotam. Isso é mais conservador e menos propenso a quebrar compatibilidade, mas significa que o processo inclui uma etapa de backport manual que tem seu próprio tempo e pode ser incompleta.
O resultado concreto: mesmo com poucos pacotes na imagem (condição necessária, não suficiente), a velocidade com que correções chegam até você depende de quantas camadas intermediárias existem entre o upstream e a sua imagem. E cada camada é um delay.
A abordagem do Quor: construir diretamente do código fonte
No Quor, nós eliminamos a maior parte dessas camadas intermediárias compilando os runtimes e dependências diretamente do código fonte dos projetos upstream. Isso significa que, quando um fix é mergeado na branch principal do Node.js, do Python, ou de qualquer runtime que suportamos, não precisamos esperar que o Debian, Ubuntu ou Alpine empacotem essa correção. Nós fazemos o build a partir do commit que já contém o fix.
O processo funciona assim:

A diferença crítica é que o nosso pipeline opera sobre o repositório upstream diretamente. Quando um security fix passa pelos testes do projeto oficial e é mergeado, ele já satisfaz dois conjuntos de validação: os testes de regressão do projeto upstream, e os nossos próprios testes de integração. Não precisamos aguardar a próxima tag de release.
O gap entre merge e release
Esse ponto merece atenção porque é frequentemente mal compreendido. Projetos open source maduros têm ciclos de release previsíveis. O Python segue releases mensais para correções de segurança. O Node.js tem releases pontuais para vulnerabilidades críticas, mas também agrupa múltiplas correções em releases planejadas. Outros projetos têm cadências trimestrais ou até mais espaçadas.
Considere o que isso significa na prática: uma correção para uma vulnerabilidade de severidade moderada pode ser mergeada hoje e incluída em um release apenas daqui a dois ou três meses. A vulnerabilidade é conhecida pelos maintainers. O fix existe no repositório. Mas ainda não está em nenhuma imagem pública baseada em versões oficialmente lançadas.
Um exemplo recente ilustra bem: uma vulnerabilidade de path traversal no pip teve seu fix revisado, aprovado e mergeado no repositório do projeto. Mas como o pip segue um ciclo de release trimestral (janeiro, abril, julho, outubro), organizações que dependem de versões estáveis foram forçadas a aguardar até noventa dias pela correção em um release oficial.
Ao construir a partir da fonte, o Quor pode incluir esse fix antes que ele chegue a qualquer release público. A imagem produzida já contém a correção. O código passou pelos testes da equipe upstream. Passou pelos nossos testes. E está disponível.
Como identificamos commits relevantes
O monitoramento de repositórios upstream não é trivial quando feito com rigor. Commits com impacto de segurança nem sempre são rotulados explicitamente, e analisar cada commit individualmente seria inviável em escala.
Nossa abordagem combina algumas estratégias:
Análise de mensagens de commit e pull requests: palavras-chave relacionadas a segurança (fix, vulnerability, CVE, security, sanitize, bounds check) são sinais iniciais, mas insuficientes por si sós. São usados como filtros de atenção, não como critério de decisão.
Correlação com bases de vulnerabilidade: quando uma CVE é publicada no NVD, OSV, ou GHSA, ela frequentemente referencia commits específicos ou pull requests no repositório upstream. Isso nos permite identificar o fix exato e verificar se ele já foi mergeado antes de um release.
Análise do diff: Para commits identificados como candidatos relevantes, analisamos o diff, quais arquivos foram alterados, que tipo de mudança foi feita, quais módulos são afetados. Isso permite avaliar o impacto real antes de decidir se um rebuild é necessário.
Testes de regressão próprios: todo build gerado pelo Quor passa por uma suite de testes antes de ser publicado. Isso serve como segunda camada de validação além dos testes do upstream, especialmente importante quando buildamos a partir de commits que ainda não foram oficialmente lançados.
Por que isso importa para o seu pipeline
A consequência mais direta de ter imagens construídas da fonte com fixes incorporados mais cedo é a redução do tempo que sua infraestrutura fica exposta a vulnerabilidades conhecidas. Mas há um segundo efeito, menos óbvio e igualmente importante: redução do ruído nos seus pipelines de segurança. Scanners integrados ao CI/CD que bloqueiam builds com CVEs de alta ou crítica severidade frequentemente reportam vulnerabilidades que já têm fix disponível upstream, mas que ainda não chegaram à imagem base que você consome.
O resultado é um ciclo de triagem manual: verificar se o fix existe, quando vai chegar, se é realmente relevante para o seu contexto, que consome horas de engenharia por semana. Quando a imagem já incorpora o fix antes que a CVE seja publicada nos bancos de dados (ou imediatamente após), esse ruído diminui. O pipeline fala menos, e quando fala, o que diz é mais relevante.
→ Confira a primeira parte deste conteúdo: Como estamos construindo imagens com zero CVEs #1: reduzindo a superfície de ataque (Alpine e distroless)
With Quor, security becomes your competitive edge. See how in a personalized demo.