A segurança de contêineres começa com sua imagem base.
Mas aqui está o problema:
- Simplesmente atualizar para a versão "mais recente" de uma imagem base pode quebrar sua aplicação.
- Você é forçado a escolher entre lançar com vulnerabilidades conhecidas ou passar dias corrigindo problemas de compatibilidade.
- E, muitas vezes... você nem tem certeza se uma atualização vale a pena.
Neste post, exploraremos por que atualizar imagens base é mais difícil do que parece, analisaremos exemplos reais e mostraremos como você pode automatizar atualizações seguras e inteligentes sem quebrar seu aplicativo.
O Problema: “Apenas atualize sua imagem base” — Mais fácil falar do que fazer
Se você está lendo isso, provavelmente já pesquisou algo como “Como proteger seus Containers” e o primeiro ponto em todo artigo genérico gerado por IA que você leu é este: atualize sua imagem base. Simples, certo? Bem, não tão rápido.
Sua imagem base é seu ponto central de segurança; se sua imagem base tiver vulnerabilidades, sua aplicação as carregará consigo. Vamos simular este cenário.
Você executa uma varredura em sua imagem de contêiner e uma CVE de alta gravidade é encontrada. A recomendação útil é atualizar a imagem base, fantástico, você terminará antes do almoço.
⚠️ CVE-2023-37920 encontrado em ubuntu:20.04
Severidade: Alta
Corrigido em: 22.04
Recomendação: Atualizar imagem base…mas você descobre um problema.
Ao fazer um upgrade às cegas de ubuntu:20.04 para ubuntu:22.04, sua aplicação se estilhaça.
Vamos analisar alguns exemplos de atualização de uma imagem base e o que acontece na realidade.
Exemplo 1: Um Dockerfile que Quebra Após um Upgrade
Dockerfile Inicial:
FROM python:3.8-buster
RUN apt-get update && apt-get install -y libpq-dev
RUN pip install psycopg2==2.8.6 flask==1.1.2
COPY . /appCMD ["python", "app.py"]A equipe faz o upgrade para:
FROM python:3.11-bookworm
RUN apt-get update && apt-get install -y libpq-dev
RUN pip install psycopg2==2.8.6 flask==1.1.2COPY . /appCMD ["python", "app.py"]Resultado:
psycopg2==2.8.6falha ao compilar contra versões mais recentes delibpqheaders embookworm.flask==1.1.2não oferece suporte aPython 3.11recursos de runtime (APIs obsoletas quebram).- A build quebra na CI.
- Sua equipe de desenvolvimento fica irritada e seu almoço é arruinado.
Exemplo 2: Upgrades de Imagem Base que Introduzem Bugs de Runtime Sutis
Original:
FROM node:14-busterCOPY . /app
RUN npm ci
CMD ["node", "server.js"]Atualizar para:
FROM node:20-bullseye
COPY . /app
RUN npm ci
CMD ["node", "server.js"]Problema de Runtime:
node:20usa versões mais recentesOpenSSL— a verificação TLS estrita quebra configurações mais antigas do axios.- O aplicativo gera
UNABLE_TO_VERIFY_LEAF_SIGNATUREerros em runtimeHTTPchamadas para serviços legados.
Por que “latest” é uma armadilha
O ecossistema Docker incentiva o uso de tags 'latest' ou releases de ponta. Mas isso frequentemente significa que sua aplicação que estava funcionando na segunda-feira de repente falha na terça-feira. Isso é frequentemente uma armadilha que causará dores de cabeça, interrupções e um desenvolvimento mais lento enquanto você gasta tempo corrigindo bugs.
Então, a solução óbvia seria fixar uma versão secundária que você testou... Mas não tão rápido, pois agora você entrou no jogo de 'whack-a-mole' da segurança, onde estará para sempre descobrindo novas CVEs que podem deixá-lo vulnerável.
Paralisia da Decisão: Atualizar ou não?
Equipes de segurança pressionam por atualizações.
Desenvolvedores resistem devido à estabilidade.
Quem está certo? Depende.
MAS, para sequer entender a decisão, você precisa analisar todas as opções, o que significa criar uma planilha massiva com todas as versões, riscos de segurança, riscos de estabilidade e disponibilidade.
Vejamos como isso poderia ser.
Isso te deixa com escolhas complexas, problemáticas e inviáveis.
- Permanecer na imagem antiga e aceitar vulnerabilidades
- Fazer o upgrade e quebrar seu aplicativo, arriscando tempo de inatividade na produção
- Realizar testes manuais de compatibilidade — dias de trabalho
O fluxo de trabalho de atualização manual:
Se você estiver fazendo isso manualmente, é assim que se parece:
- Verificar CVEs:
trivy image python:3.8-buster - Pesquisar cada CVE: É acessível no contexto da sua aplicação?
- Decidir sobre o candidato à atualização
- Testar a nova imagem:
- Construir
- Executar testes unitários
- Executar testes de integração
- Em caso de falha, tente aplicar patch no código ou atualizar bibliotecas.
- Repita para cada Container.
É exaustivo.
O Custo de Permanecer Estático
Você pode pensar “se não está quebrado, não conserte.”
Mas CVEs de Container não corrigidas são um grande contribuinte para violações de segurança: “87% das imagens de Container em produção tinham pelo menos uma vulnerabilidade crítica ou de alta severidade." fonte
Também existem muitos exploits conhecidos em imagens base populares.
- Vulnerabilidade de Path Traversal no Unzip (
CVE-2020-27350) — permaneceu em milhões de Containers por anos. - Heartbleed (
CVE-2014-0160) permaneceu em Containers legados muito tempo depois das correções oficiais. PHP-FPM RCE(CVE-2019-11043) permitem que invasores remotos executem código arbitrário por meio de requisições HTTP maliciosas e era extremamente comum em imagens base de Container comPHP-FPM pré-instaladoantes de ser corrigido
Como Nosso Recurso de Auto-Correção Ajuda
Para resolver este cenário exato, a Aikido Security lançou nosso recurso de auto-correção de Container porque, bem, nós também vivenciamos essa dor.
O recurso funciona assim: a Aikido verifica seus Containers em busca de vulnerabilidades. Se (ou mais provavelmente quando) encontrarmos vulnerabilidades, como sempre, nós o alertamos. Então, em vez de exigir que você atualize sua imagem base, nós oferecemos diferentes opções. Criamos uma tabela que informa qual versão da imagem base resolverá quais CVEs, dessa forma, você pode ver rapidamente que uma pequena atualização pode remover todas ou a maioria das CVEs de alta severidade, o que significa que esta é uma atualização adequada da imagem base.
Se a atualização for um pequeno incremento, você pode criar automaticamente um pull request para aumentar a versão.
Isso representa horas de trabalho economizadas
Conclusão:
- Atualizar imagens base de Container é realmente difícil.
- O conselho de “apenas atualizar” simplifica demais um processo complexo e cheio de riscos.
- Suas equipes estão certas em ser cautelosas — mas elas não deveriam ter que escolher entre segurança e estabilidade.
- O autofix de Container da Aikido faz o trabalho difícil para você, para que você possa tomar uma decisão informada.
- Então, da próxima vez que você vir um alerta de vulnerabilidade de imagem base, você não entrará em pânico. Você receberá um PR.

