Principais conclusões
- Sua exposição vai além do próprio Flask: O Flask depende de seis dependências diretas, cada uma com seu próprio histórico de CVE.
- Migrações apressadas acarretam custos reais: Atualizações apressadas causam falhas nas extensões, forçam atualizações de versão do Python e ultrapassam as estimativas.
- O fim do ciclo de vida não significa necessariamente que o software não receba correções: O suporte estendido garante que as versões do Flask em fim de vida continuem recebendo correções de segurança enquanto você planeja a atualização.
Se você está executando o Flask em produção, provavelmente já passou por essa situação. Talvez tenha sido um aviso do pip-audit que sinalizou uma versão desatualizada no seu requirements.txt. Talvez tenha sido um e-mail da equipe de segurança perguntando sobre as versões do seu framework. Talvez tenha sido um colega encaminhando um comunicado do CVE com “Isso nos afeta?” no assunto.
E aí surge a pergunta que ninguém quer abordar: “Qual é a versão do Flask que estamos usando e o que seria necessário para atualizá-la?”
A Pallets, organização responsável pelo Flask, oferece suporte apenas à versão mais recente com novos recursos. Se você não estiver usando essa versão, estará em um ambiente sem suporte, e os riscos são maiores do que muitas equipes imaginam. Mas o fim do suporte (EOL) do Flask não precisa significar pânico. Você tem mais opções do que imagina. Vamos analisar o que significa executar uma versão do Flask sem suporte para seu ambiente de produção e, mais importante ainda, o que você pode fazer de forma realista a respeito disso sem comprometer seu plano de desenvolvimento.
Como funcionam, na verdade, as versões do Flask
Antes de entrarmos na parte de “o que fazer a respeito disso”, vale a pena entender como o Flask gerencia o ciclo de vida de suas versões, pois ele difere da maioria dos frameworks de uma forma que tem implicações diretas para sua postura de segurança.
O Flask não segue um modelo de suporte de longo prazo com datas definidas de fim de vida (EOL), como fazem o Angular ou o Node.js. Em vez disso, a Pallets (a organização responsável pela manutenção do Flask) publica uma Política de Suporte a Versões que é curta e explícita: a versão com recursos mais recente recebe correções de bugs e de segurança, enquanto as versões com recursos mais antigas não recebem. Dependendo da gravidade e do nível de esforço envolvido, uma correção de segurança pode ser retroaplicada a uma versão anterior mediante solicitação, mas isso não é garantido. Na prática, quando uma nova versão com recursos é lançada, a versão anterior deixa de receber atualizações, incluindo patches de segurança.
O histórico de lançamentos é o seguinte: a versão 1.0 foi lançada em abril de 2018, seguida pela 1.1 em julho de 2019. O Flask 2.0 foi lançado em maio de 2021, adicionando suporte a funções de visualização assíncronas e elevando as versões mínimas em todo o ecossistema do Pallets. As versões 2.1, 2.2 e 2.3 foram lançadas ao longo de 2022 e 2023. O Flask 3.0 foi lançado em setembro de 2023, exigindo o Werkzeug 3.0 e dando continuidade à reorganização da API iniciada com o Flask 2.3. O Flask 3.1.0 foi lançado em novembro de 2024, e a versão mais recente até agosto de 2026 é o Flask 3.1.3, publicada em fevereiro de 2026 – que, por sua vez, é uma versão com correções de segurança.
Essa política tem uma consequência específica. A linha de versão atual é a 3.1.x; portanto, é necessário estar na versão de correção mais recente para ter suporte completo. Qualquer versão da linha 3.0.x ou anterior fica fora do período de suporte, e não se deve esperar que vulnerabilidades recém-divulgadas que afetem essas linhas recebam uma correção do desenvolvedor original.
O que o fim do suporte ao Flask realmente significa para sua API de produção
Tudo bem, então sua versão não é a mais recente. Seu aplicativo está funcionando bem, seus endpoints estão respondendo e seu pipeline de CI está no verde. Então, qual é o problema?
As vulnerabilidades não deixam de ser descobertas só porque uma linha de versão deixa de receber correções. E cada aviso publicado indica exatamente quais versões são afetadas, o que significa que uma implantação sem suporte acumula pontos fracos documentados e permanentemente sem correção, que qualquer pessoa pode consultar.
O próprio histórico de CVEs do Flask ilustra bem isso. O exemplo mais conhecido é CVE-2023-30861 (CVSS 7,5, Alta), uma problema de vazamento de cookies de sessão que gerou boletins de segurança de fornecedores que incluem o Flask em seus produtos corporativos, incluindo o IBM Maximo Application Suite.
A falha subjacente era sutil. O Flask define um cabeçalho de resposta `Vary: Cookie` quando a sessão é utilizada, o que instrui os caches a não servir essa resposta a um usuário diferente. Em um cenário de sessão permanente, o Flask atualizou o cookie de sessão sem tratar a sessão como acessada; assim, o cabeçalho estava ausente, embora um cabeçalho `Set-Cookie` estivesse presente. Considerando um proxy de cache que não remove cookies, uma sessão permanente, a configuração SESSION_REFRESH_EACH_REQUEST mantida em seu valor padrão e a ausência de um cabeçalho `Cache-Control` explícito, uma resposta contendo o cookie de sessão de um usuário poderia ser armazenada em cache e servida a outro usuário. Quando o cookie de sessão controla o acesso a uma conta autenticada, isso não é um caso extremo meramente teórico.
O Pallets corrigiu o problema nas versões 2.3.2 e 2.2.5 do Flask — a linha de recursos então atual e a anterior a ela, exatamente como descrito na política de suporte. Nada foi publicado para a versão 2.1.x ou anteriores, portanto, as equipes que utilizavam essas versões não tinham nenhuma correção do desenvolvedor original para instalar.
Se isso parece coisa do passado, não é. Em fevereiro de 2026, a Pallets divulgou CVE-2026-27205, um problema da mesma natureza: a sessão não era marcada como acessada quando o código verificava apenas suas chaves, usando operadores como `in` e `len`, de modo que o `Vary: Cookie` era novamente omitido em condições de cache semelhantes. Isso afeta todas as versões do Flask anteriores à 3.1.3 — ou seja, todas as versões fora de suporte em uso atualmente. O Flask 3.1.1 já havia lançado uma correção separada para a assinatura de sessão (CVE-2025-47278) em maio de 2025. Três versões de segurança em três anos, e apenas a linha atual as recebeu.
As estruturas de conformidade acrescentam uma segunda dimensão. O Requisito 6.3.3 da norma PCI DSS v4.0.1 exige que as correções para vulnerabilidades críticas sejam instaladas no prazo de um mês após o lançamento. Quando não há uma versão corrigida disponível para a sua versão, esse prazo nunca começa a correr e a falha permanece em aberto. O SOC 2 e avaliações semelhantes baseadas em controles não proíbem totalmente o uso de componentes sem suporte, mas exigem uma avaliação de risco documentada, controles compensatórios ou um caminho confiável para a obtenção de correções. Executar uma versão do Flask sem suporte sem que nenhum desses elementos esteja em vigor é uma lacuna sobre a qual o avaliador certamente fará perguntas.
O risco oculto: a árvore de dependências do Flask
Quando as equipes pensam na segurança do Flask, elas pensam no próprio framework: roteamento, contexto da solicitação, gerenciamento de sessões. Essa é a camada óbvia.
Mas o framework não funciona isoladamente. A instalação do Flask atual também instala seis dependências diretas de tempo de execução: Werkzeug (a camada WSGI e a análise de solicitações), Jinja2 (sistema de modelos), MarkupSafe (escape de strings para inclusão segura em marcações), ItsDangerous (assinatura de cookies de sessão), Click (ferramentas de CLI) e Blinker (sinais). No Python 3.9, há uma sétima dependência: o importlib-metadata. Cada uma delas tem seu próprio histórico de vulnerabilidades (CVE) e cadência de lançamento, e o conjunto exato varia de acordo com a versão do Flask — o Blinker, por exemplo, só se tornou obrigatório a partir do Flask 2.3.
O que torna isso complicado é o quanto as versões estão intimamente ligadas entre si. O Flask 3.1.0 requer o Werkzeug 3.1 ou mais recente, o ItsDangerous 2.2 ou mais recente e o Blinker 1.9 ou mais recente. O Flask especifica versões mínimas, em vez de versões exatas, portanto, uma versão mais antiga do Flask, por si só, não bloqueia toda a sua árvore de dependências. A restrição prática vem de outra direção: uma vulnerabilidade na análise de solicitações do Werkzeug ou na lógica de assinatura do ItsDangerous afeta seu aplicativo tão diretamente quanto uma falha no Flask, e atualizar apenas esse pacote pode comprometer a compatibilidade com sua versão do Flask, suas extensões ou seu próprio código.
Você também pode se informar melhor sobre as questões de segurança do Python e os riscos que podem afetar as aplicações em todo o ecossistema mais amplo do Python.
Suas opções quando o Flask chegar ao fim da vida útil
Tudo bem, então você está usando uma versão do Flask que não tem mais suporte. Quais são as opções viáveis daqui para frente?
Existem três opções, e cada uma delas apresenta vantagens e desvantagens diferentes. A atualização ou a migração reduzem o risco de legados a longo prazo, mas podem exigir um trabalho de engenharia considerável. O suporte estendido elimina a falha de segurança imediata e dá tempo para que esse trabalho seja realizado adequadamente.
Opção 1: Atualizar para a versão mais recente do Flask com suporte
Esta é a resposta oficial: migre para a linha de versões atual (Flask 3.1.x no momento da redação deste artigo), instale os patches de segurança mais recentes e mantenha-se atualizado. Para equipes com bases de código bem mantidas, essa é a decisão certa a longo prazo.
O Flask 3.x traz melhorias reais. O suporte a funções de visualização assíncronas, introduzido na versão 2.0, continuou a ser desenvolvido, embora o Flask continue sendo um framework WSGI, e não um framework voltado principalmente para a assincronia. A reestruturação do Sans-IO na versão 3.0 separou a lógica central do Flask de sua infraestrutura WSGI, o que permite que projetos como o Quart o reutilizem. As versões das dependências estão atualizadas e são mantidas. Se você puder fazer a atualização sem problemas, não deixe de fazê-la.
Mas eis o que significa “atualizar para a versão mais recente” quando você está vindo do Flask 1.x ou das primeiras versões do 2.x:
Requisitos de versão do Python: O Flask 3.0 requer, no mínimo, o Python 3.8, e o Flask 3.1 elevou esse requisito mínimo para o Python 3.9, descartando completamente a versão 3.8. Se o seu ambiente de produção utiliza uma versão mais antiga do Python — o que é comum em aplicativos legados e em contêineres criados a partir de imagens base fixadas —, a atualização do Python torna-se um pré-requisito antes de você começar a usar o Flask.
Extensões com problemas: Essa é a questão principal. O ecossistema do Flask inclui Flask-Login, Flask-SQLAlchemy, Flask-Migrate, Flask-Admin e dezenas de outras extensões, cada uma com seus próprios requisitos de compatibilidade. Quando o Flask 3.0 foi lançado junto com o Werkzeug 3.0 em 30 de setembro de 2023, o Werkzeug removeu os auxiliares url_decode e url_encode — há muito tempo obsoletos — que o Flask-Login 0.6.2 importava ao carregar o módulo. Aplicativos que adotaram o novo Werkzeug não conseguiram iniciar, apresentando um erro `ImportError`, e a correção só foi implementada no Flask-Login 0.6.3, em 30 de outubro — um mês de problemas para uma das extensões mais utilizadas do Flask. Qualquer aplicativo que dependa de mais do que algumas extensões corre esse mesmo risco de coordenação a cada grande atualização.
APIs obsoletas removidas: O Flask 2.3.0 removeu um conjunto de APIs que haviam sido consideradas obsoletas na versão 2.2, incluindo app.before_first_request, bp.before_app_first_request, o json_encoder e json_decoder , o variável de ambiente FLASK_ENV e o parâmetro send_file_max_age_default, use_x_sendfilee propagate_exceptions no aplicativo. O Flask 3.0 não reintroduziu nenhuma delas. O código do aplicativo ou extensões que ainda utilizam essas APIs deixarão de funcionar assim que sua trajetória de atualização chegar à versão 2.3. Isso é mais relevante ao saltar da versão 1.x ou das primeiras versões da 2.x diretamente para a 3.x: você herda as remoções da versão 2.3 e as alterações da versão 3.0 na mesma migração.
Cascata de compatibilidade do Werkzeug: Como o Werkzeug está tão intimamente ligado ao Flask, atualizar o Flask geralmente significa atualizar o Werkzeug, o que pode afetar extensões, middleware personalizado e qualquer código que interaja diretamente com os mecanismos internos do Werkzeug.
Para um aplicativo Flask pequeno e mantido ativamente, isso pode ser um sprint bem focado. Para uma API de grande porte, com anos de padrões acumulados, extensões personalizadas e a exigência de disponibilidade contínua durante a migração, isso significa um planejamento cuidadoso, testes abrangentes e uma possibilidade real de regressões em produção.
Entenda Segurança do Werkzeug antes de atualizar o Flask.
Opção 2: Migrar para uma estrutura alternativa
Algumas equipes, ao pensar em uma atualização do Flask, pensam: “talvez seja a hora de repensar tudo”.
O FastAPI se destaca pela documentação automática de APIs, pelo suporte nativo à assíncronia e pela validação baseada no Pydantic. O Django REST Framework oferece uma abordagem do tipo “tudo incluído” para equipes que preferem convenções em vez de configurações. O Starlette fornece uma base ASGI leve para pilhas de APIs personalizadas.
Existem argumentos técnicos válidos para cada uma das opções, dependendo das suas necessidades e da direção que sua equipe está tomando.
Mas tenha clareza quanto ao escopo. Você não está simplesmente trocando uma dependência. Você está reescrevendo os manipuladores de rota para uma interface de API diferente, substituindo o modelo de contexto de solicitação do Flask, reformulando a autenticação e o gerenciamento de sessões e encontrando equivalentes para as extensões do Flask das quais você depende — Flask-Login, Flask-SQLAlchemy, Flask-Migrate — ou reconstruindo essa lógica por conta própria.
Os benefícios a longo prazo podem justificar o trabalho, no contexto adequado. O cronograma e o custo tendem a exceder as estimativas iniciais assim que todo o escopo é mapeado, e a manutenção do aplicativo Flask existente enquanto se desenvolve seu substituto acarreta uma sobrecarga adicional.
Opção 3: Suporte estendido de terceiros
A opção que as equipes costumam ignorar com mais frequência é o suporte de segurança estendido oferecido por um fornecedor especializado.
A TuxCare oferece Suporte de Ciclo de Vida Ilimitado (ELS) para versões do Flask em fim de vida. Em vez de ser forçado a migrar antes de estar pronto, ou de deixar suas APIs expostas enquanto planeja a migração, você continua executando uma versão do Flask coberta pelo serviço, com patches de segurança aplicados.
A ideia é simples: você ganha tempo e controle. Tempo para planejar uma atualização adequada quando for mais conveniente para sua equipe e seu aplicativo. Controle sobre o cronograma de migração, em vez de deixar que a divulgação de uma vulnerabilidade o determine para você no pior momento possível.
O verdadeiro custo de apressar uma atualização de fim de vida útil (EOL) de um frasco
Pense no que acontece quando uma equipe comprime uma migração do Flask em um prazo irrealista porque uma auditoria de segurança identificou dependências não suportadas.
Aumento da carga de suporte: Problemas de compatibilidade que não surgiram nos testes intensivos começam a aparecer na produção. Uma extensão que funcionava no ambiente de teste se comporta de maneira diferente sob carga. Sua fila de suporte fica lotada de problemas que têm origem na migração, e diagnosticá-los exige um conhecimento profundo sobre o que mudou em cada dependência.
Instabilidade do sistema: Uma atualização de versão do Werkzeug altera a forma como os dados de formulários com várias partes são analisados, e um endpoint de upload passa a rejeitar arquivos que antes aceitava. Uma alteração no gerenciamento de sessões causa falhas intermitentes de autenticação que só ocorrem sob padrões específicos de carga. Esses são os problemas que geram alertas às 3 da manhã e o não cumprimento dos SLAs.
Acúmulo de dívida técnica: Na pressa para garantir a conformidade, as equipes tomam atalhos. O uso de APIs obsoletas é contornado por meio de shims de compatibilidade, em vez de ser refatorado adequadamente. A ideia de “vamos limpar isso depois da migração” torna-se permanente e, seis meses depois, você está trabalhando com uma base de código tecnicamente atualizada, mas repleta de soluções provisórias e limpezas adiadas.
Excedentes orçamentários: A estimativa original era de duas semanas. Após cinco semanas, você ainda está investigando problemas de compatibilidade com extensões, a empresa contratada continua cobrando, os recursos foram adiados e os engenheiros, que deveriam estar desenvolvendo novas funcionalidades, estão corrigindo conflitos entre versões.
A diferença entre uma atualização bem planejada do Flask e uma feita no calor do momento não é sutil. É a diferença entre um projeto controlado, com escopo definido, e uma emergência contínua que consome a capacidade da sua equipe por meses.
Protegendo o Flask em fim de vida útil com a TuxCare
É aí que o Suporte de Ciclo de Vida Ilimitado da TuxCare muda o jogo.
A TuxCare vem há 15 anos fornecendo patches de segurança para sistemas operacionais, ambientes de execução, bibliotecas e estruturas de aplicativos que chegaram ao fim de vida útil. A empresa relata mais de 220.000 patches distribuídos e mais de 5.000 CVEs resolvidos em cerca de 10.000 pacotes para mais de 2.300 clientes corporativos — um histórico construído em ambientes de produção, e não apenas um conjunto de promessas a respeito deles.
O que diferencia a abordagem da TuxCare
Cobertura em toda a cadeia de dependências: O risco de fim de vida útil raramente se limita apenas ao pacote de nível superior. Para um aplicativo Flask, ele se estende pelo Werkzeug, Jinja2, MarkupSafe, ItsDangerous e tudo o que estiver abaixo deles. Quando uma dependência coberta precisa de uma correção de segurança, a TuxCare aplica patches, recompila e valida os pacotes afetados em conjunto, em vez de deixar que você atualize um componente e descubra o que isso pode causar de problemas. A cobertura de dependências diretas e transitivas está incluída sem custo adicional.
Backporting automatizado com validação por especialistas: A TuxCare monitora o NVD, os alertas dos fornecedores e os feeds de segurança do GitHub; em seguida, realiza o backporting de correções por meio de automação algorítmica e assistida por IA, com engenheiros de segurança validando o resultado. Os pacotes passam por testes de integridade, funcionalidade e regressão e são assinados antes de chegarem aos repositórios dos clientes. Para ver como o processo funciona de ponta a ponta, leia o white paper técnico da TuxCare sobre seu Processo de Aplicação de Patches em Código Aberto.
Distribuição por meio do seu fluxo de trabalho do pip já existente: Os pacotes corrigidos são distribuídos a partir de um repositório hospedado pela TuxCare, que você configura como um índice do pip ou um índice extra. Você não precisa reformular seu pipeline de compilação, treinar novamente sua equipe nem alterar seu processo de implantação — basta indicar uma fonte que continue produzindo correções mesmo depois que o Pallets for descontinuado.
Tempos de resposta garantidos pelo SLA: As metas publicadas pela TuxCare para o Suporte de Ciclo de Vida Ilimitado para Bibliotecas são: correções em até 14 dias após a divulgação pública para vulnerabilidades de alto e crítico risco (CVSS 7.0 e superior), 60 dias para risco médio e 90 dias para risco baixo. Você trabalha com prazos documentados, com base nos quais pode planejar uma janela de correção, contando com suporte 24 horas por dia, 7 dias por semana.
Custo previsível: O suporte estendido tem um preço fixo durante toda a vigência do contrato, o que facilita a comparação com uma migração. Compare esse valor com as horas de engenharia, os ciclos de teste, os honorários dos prestadores de serviços, o possível tempo de inatividade e os recursos atrasados que uma atualização acelerada exigiria, e você estará comparando dois números reais, em vez de um número e uma esperança.
Documentação pronta para auditoria: Cada versão é acompanhada de informações sobre quais CVEs foram corrigidas e quais versões de pacotes foram alteradas, além de SBOMs legíveis por máquina (SPDX e CycloneDX) e documentos VEX. Essas são as evidências exigidas nas revisões de gerenciamento de vulnerabilidades e controle de mudanças, embora os requisitos específicos sempre dependam da estrutura, dos limites do seu sistema e do seu avaliador.
Como começar
Se você estiver utilizando uma versão do Flask em fim de vida útil e quiser entender sua exposição a riscos, a TuxCare mantém um rastreador de CVEs que mostra as vulnerabilidades associadas às versões do Flask cobertas e as correções lançadas para elas. Atualmente, a cobertura publicada inclui as versões 0.12.5, 1.1.2, 1.1.4 e 2.2.1 do Flask, com versões adicionais disponíveis mediante solicitação.
Verifique as vulnerabilidades e as correções disponíveis no ELS para o Flask.
Não deixe que o fim do ciclo de vida do Flask coloque suas APIs em risco
Oferecer suporte apenas à versão mais recente com novos recursos é uma política pragmática para uma equipe pequena de código aberto. Isso é menos conveniente para organizações que executam aplicativos em produção e não podem atualizar sempre que uma nova versão é lançada.
O importante é que o fim do ciclo de vida (EOL) do Flask não precisa significar uma correria. Você tem opções. Pode planejar uma atualização bem pensada quando for mais conveniente para sua equipe, avaliar um framework diferente se houver um motivo arquitetônico válido para a mudança ou utilizar o suporte estendido para continuar recebendo correções de segurança e cumprir suas obrigações de conformidade, enquanto toma essas decisões de acordo com seu próprio cronograma, e não com o de um auditor.
As equipes que lidam bem com o fim do ciclo de vida (EOL) do Flask são aquelas que reconhecem o risco desde o início, compreendem as opções disponíveis e tomam decisões deliberadas, em vez de reativas.
Se o fim do ciclo de vida (EOL) do Flask está no seu radar, vale a pena descobrir o que o Suporte de Ciclo de Vida Ilimitado da TuxCare da TuxCare. O melhor próximo passo pode ser garantir a versão que você já utiliza enquanto planeja a atualização que realmente deseja.

