A importância de usar versões atualizadas de software

Thiago Ferreira
WhatsGood Dev
Published in
5 min readDec 15, 2021

Usar versões desatualizadas de software pode ter consequências graves para um produto, desde falhas de segurança até dificuldade de manutenção e evolução. Nesse artigo iremos navegar por como funciona o versionamento de software e como podemos nos prevenir desses problemas.

Entendendo o ciclo de vida

A grande parte dos softwares que usamos possui algum tipo de ciclo de vida. Desde sistemas operacionais completos, como Android, iOS e Windows tanto como pequenos componentes que fazem parte de um determinado software.

Esse ciclo de vida é importante para a evolução do software, ou seja, para que possam ser adicionadas novas funcionalidades e grandes mudanças de arquitetura, acompanhando as melhorias tecnológicas do mercado.

Essa informação geralmente fica disponível na página de releases do software, como por exemplo essa página do framework Django

Entendendo o versionamento semântico

Para poder navegar bem no mundo de desenvolvimento de software, precisamos entender a forma de versionamento mais comum, o versionamento semântico (semantic versioning). Consiste no seguinte (como descrito no site oficial):

Dado um número de versão MAJOR.MINOR.PATCH, incremente a:
1. versão Maior(MAJOR): quando fizer mudanças incompatíveis na API,
2. versão Menor(MINOR): quando adicionar funcionalidades mantendo compatibilidade, e
3. versão de Correção(PATCH): quando corrigir falhas mantendo compatibilidade.

Vamos ver alguns exemplos do que isso significa na prática:
- Dado que temos uma versão atual seja 2.8.1
- Se tiver uma atualização para 2.8.2, isso quer dizer que foi corrigida alguma falha e a compatibilidade foi mantida.
- Se atualizarmos para 2.9.0, isso quer dizer que existem novas features compatíveis com a versão anterior.
- Se atualizarmos para 3.0.0, isso quer dizer que temos novas features e correções, mas também temos breaking changes que são mudanças não são compatíveis com a versão anterior.

No dia a dia, precisamos estar atentos ao atualizar versões para evitar ter problemas com as mudanças incompatíveis explicadas a seguir.

Mudanças incompatíveis (breaking changes)

Ao longo do ciclo de vida de um software, haverá momentos onde uma atualização de versão não irá ter compatibilidade com versões anteriores, o que requer que a pessoa usuária desse software também faça mudanças para acompanhar as atualizações.

Do lado de quem cria e mantém software, retrocompatibilidade pode ser bastante desafiador e complexo. Dessa forma, quando as pessoas mantenedoras deixam de oferecer compatibilidade com versões antigas, elas poderão ter mais produtividade e liberdade para criar novas features e melhorias, sem se preocupar com partes muito antigas do código. Um bom exemplo de como isso funciona são as políticas de versionamento do React JS.

Versões com suporte de longo prazo (LTS)

O suporte de longo prazo é um período no ciclo de vida de um determinado software onde as pessoas mantenedoras irão continuar trabalhando ativamente no projeto, fazendo melhorias e correções de bug.

Se surgir algum problema crítico nesse tipo de versão, é esperado que o problema seja corrigido e uma nova versão seja disponibilizada para atualização.

Podemos ver o ciclo de versões do framework Django na imagem abaixo e observar que a versão 2.2 terá suporte até o começo de 2022. Depois disso, a nova versão com suporte LTS será a 3.2. Ter essas informações é crucial para o planejamento de atualizações de versões que possuem mudanças incompatíveis.

Como as versões de softwares distintos conversam entre si?

É interessante notar que as versões de diversos softwares “conversam” entre si. Vamos ver o exemplo do python 2, que foi descontinuado completamente em janeiro de 2020.

Isso quer dizer que mesmo se surgirem problemas de segurança na versão 2, esses problemas não serão corrigidos, e por isso é importante atualizar para a nova versão o quanto antes.

Assim que a versão 2 do python é descontinuada, todas as versões de bibliotecas como o Django e o Flask também irão descontinuar o python 2 e assim por diante.

Por isso é muito importante notar o efeito “cascata” das versões que perdem o suporte oficial e atualizar o quanto antes.

O que acontece se eu não atualizar?

Como podemos ver na fonte de dados de vulnerabilidades https://www.cvedetails.com/, novos problemas podem e são descobertos a todo momento.

Com isso, se usamos uma versão antiga de software que não possui suporte oficial, não teremos uma correção de segurança e ficaremos vulneráveis.

Temos a opção de fazer o update para a versão mais nova, mas como existem as mudanças incompatíveis (breaking changes), é possível que seja muito difícil e trabalhoso fazer a atualização para a nova versão.

Um exemplo tangível: Log4j

Particularmente eu acho muito abstrato entender a importância de usar software atualizado olhando apenas para problemas futuros. Por isso, vamos olhar para um caso recente:

Em dezembro de 2021 foi reportada uma falha de segurança gravíssima na ferramenta de logs para java chamada log4j. Essa falha permite ganhar acesso a um computador remoto, simplesmente injetando um comando em inputs de formulário, urls ou headers.

A elastic stack que foi bastante afetada por essa vulnerabilidade e na página https://www.elastic.co/support/eol podemos ver quais versões não oferecem suporte mais. Perceba que:

Versões 7.x são as versões atuais com suporte ativo, logo terão atualizações.
Versão 6.8 está em suporte de longo prazo até 2022, então em dezembro de 2021 ainda terá atualizações.

Isso significa que, qualquer pessoa em versões mais antigas como a 5.x ou anteriores terá bastante trabalho para atualizar todas as versões necessárias e chegar na versão 7.x (por conta das mudanças incompatíveis).

Se tratando de uma falha de segurança crítica, todo tempo é valioso, então no melhor cenário sempre precisamos manter nossas versões atualizadas para ter agilidade na atualização.

Outras referências

A OWASP é uma organização que trabalha para mapear as principais falhas de segurança da web e disponibilizá-las de forma clara para que toda a comunidade possa construir software mais seguro.

O projeto “Owasp Top 10” mapeia as 10 principais falhas de segurança e o item 6 da lista fala exatamente sobre o uso de componentes desatualizados e vulneráveis. Segue a referência completa:

--

--