Skip to main content

Vulnerabilidade vs. falha: entenda as principais diferenças em AppSec

Escrito por

17 de novembro de 2023

0 minutos de leitura

Entender claramente as vulnerabilidades e as falhas é essencial para garantir a segurança dos seus sistemas e dados. Muitas vezes ocultas em softwares e tecnologias, as vulnerabilidades podem representar riscos significativos. Elas são possíveis pontos de entrada para agentes mal-intencionados. Mas o que são vulnerabilidades e como elas diferem das falhas?

Imagine um aplicativo web que usa algoritmos robustos de criptografia para proteger dados confidenciais dos usuários. Porém, devido a um erro de programação, a chave de criptografia está codificada diretamente no código-fonte do aplicativo, ficando facilmente acessível a qualquer pessoa que examine o código.

Agora imagine que, em um aplicativo semelhante, seja usado um algoritmo de criptografia fraco, como o MD5 inseguro, que está desatualizado. Com o tempo, um agente mal-intencionado poderia quebrar as senhas protegidas pela criptografia MD5, deixando o sistema mais vulnerável a violações relacionadas a senhas.

Os dois cenários apresentam problemas de segurança. No entanto, um é uma vulnerabilidade causada por uma falha imediata e explorável no código (dica: cenário um), enquanto o outro é uma falha decorrente do uso de um algoritmo de criptografia inseguro, que aumenta a suscetibilidade do sistema a ataques futuros (dica: cenário dois).

Entender as diferenças entre vulnerabilidades e falhas é fundamental para a segurança de aplicações. Com esse conhecimento, os desenvolvedores podem identificar falhas antes que sejam exploradas e agir de forma proativa para corrigir possíveis vulnerabilidades, tornando os aplicativos mais seguros. Por outro lado, entender as vulnerabilidades permite que os desenvolvedores corrijam problemas conhecidos para evitar futuras explorações.

Entenda as vulnerabilidades

Uma vulnerabilidade de segurança é uma falha no código de um software ou uma configuração incorreta do sistema, como o Log4Shell, que permite que invasores obtenham acesso não autorizado diretamente a um sistema ou rede.

Vulnerabilidades são falhas no projeto, na implementação, na operação ou nos controles internos de um sistema que podem ser exploradas para violar suas políticas de segurança. No desenvolvimento de software, geralmente são causadas por erros ou omissões no código que podem ser explorados por agentes mal-intencionados.

Por exemplo, uma vulnerabilidade comum em aplicativos web é a injeção de SQL. Ela ocorre quando um aplicativo inclui dados fornecidos pelo usuário em consultas SQL sem validá-los nem escapar os caracteres adequadamente, permitindo que um invasor manipule a consulta.

# Example of vulnerable code__
Query = "SELECT * FROM users WHERE name = ' " + userName + " ';"

No trecho de código Python acima, um invasor poderia inserir comandos SQL na variável `userName`, possivelmente obtendo acesso não autorizado ou causando perda de dados.

Como as vulnerabilidades são exploradas?

Agentes mal-intencionados podem explorar vulnerabilidades de várias maneiras.

Por exemplo, um método comum é a injeção de código, em que invasores inserem código malicioso em um sistema que não valida nem filtra corretamente os dados fornecidos pelos usuários. Isso pode levar a ataques de injeção de SQL, estouros de buffer ou ataques de cross-site scripting (XSS), permitindo que o invasor manipule ou comprometa a funcionalidade ou os dados do sistema.

Além disso, os invasores podem explorar vulnerabilidades usando credenciais fracas ou padrão, explorando softwares sem correção ou recorrendo a técnicas de engenharia social para obter acesso não autorizado aos sistemas.

Entender essas táticas é essencial para reforçar os sistemas contra possíveis explorações de vulnerabilidades.

Prepare-se para vulnerabilidades de dia zero com a Snyk

Saiba como a Snyk ajuda seus desenvolvedores a corrigir vulnerabilidades de dia zero mais rapidamente, reduzindo a exposição e os riscos.

Vulnerabilidades e AppSec

Entender os riscos e as ameaças potenciais dos aplicativos de software é fundamental para a função das vulnerabilidades em AppSec. Essas vulnerabilidades, que podem assumir várias formas, servem como pontos de entrada para invasores comprometerem a segurança, a integridade e a confidencialidade dos dados no aplicativo. Para aumentar a segurança das aplicações, é essencial identificar e se proteger contra vulnerabilidades comuns exploradas por invasores.

Na Snyk, acreditamos que todo desenvolvedor comprometido com a segurança deve conhecer o OWASP Top 10. Para ajudar a proteger os aplicativos contra agentes mal-intencionados, abordamos o tema em detalhes no Snyk Learn. Também lançamos o Snyk Top 10 Open Source Vulnerabilities.

(*É importante observar que estamos analisando tipos específicos de vulnerabilidade, e não agrupando-os como a OWASP faz.)

Negação de serviço:


Ataques de negação de serviço (DoS) são usados para interromper o acesso a uma rede ou servidor, bombardeando o alvo com tantas solicitações que ele não consegue processar a carga. Google e AWS já sofreram ataques DoS de grande escala, mas esse tipo de ataque não se limita a grandes provedores de nuvem.

Execução remota de código:


Esses ataques acontecem quando um agente mal-intencionado consegue executar comandos em um sistema remoto ao qual não deveria ter acesso. A execução remota de código (RCE) pode ocorrer de várias maneiras, como pelo uso de malware ou pela exploração de uma biblioteca vulnerável que não foi corrigida. Essa vulnerabilidade permite que invasores explorem um servidor ou aplicativo executando código nele.

Desserialização de dados não confiáveis:


Isso acontece quando um aplicativo desserializa dados não confiáveis sem verificar adequadamente se os dados resultantes são válidos, permitindo que o invasor controle o estado ou o fluxo da execução. Uma vulnerabilidade de desserialização em Java ocorre quando um usuário mal-intencionado tenta inserir no sistema um objeto serializado modificado para comprometer o sistema ou seus dados.

Injeção de SQL:



É um tipo de vulnerabilidade que ocorre quando um aplicativo recebe dados do usuário sem validá-los e os envia ao banco de dados para processamento. Isso permite que um invasor insira dados não confiáveis em uma consulta ao banco de dados. Por exemplo, ao preencher um formulário web, um ataque de injeção de SQL pode permitir que um invasor crie uma entrada para roubar dados valiosos, contornar a autenticação ou corromper registros.

Poluição de protótipo:


Essa vulnerabilidade afeta o JavaScript e se refere à capacidade de injetar propriedades em protótipos existentes da linguagem JavaScript, como objetos. O JavaScript permite alterar todos os atributos de Object. Um invasor manipula esses atributos para sobrescrever e poluir o protótipo de um objeto de uma aplicação JavaScript base, injetando outros valores.

Arquivo temporário inseguro


Arquivos temporários inseguros são exatamente o que o nome sugere. Nesse tipo de vulnerabilidade, arquivos temporários que contêm informações confidenciais são criados com permissões incorretas ou em pastas sem as permissões adequadas. Esse tipo de vulnerabilidade se enquadra no que a OWASP chama de falha no controle de acesso.

Travessia de diretório/caminho

Um ataque de travessia de diretório (também chamado de travessia de caminho) tenta acessar arquivos e diretórios armazenados fora da pasta prevista. Ao manipular arquivos com sequências de "ponto-ponto-barra (../)" e suas variações, ou usar caminhos absolutos, é possível acessar arquivos e diretórios arbitrários no sistema de arquivos, inclusive o código-fonte do aplicativo, arquivos de configuração e outros arquivos críticos do sistema.

Negação de serviço por expressão regular (ReDoS):

Vulnerabilidades de negação de serviço por expressão regular (ReDoS) são um tipo de ataque DoS. Expressões regulares (regex) são extremamente poderosas, mas pouco intuitivas, e podem facilitar ataques que tiram seu site do ar. O objetivo do ataque é sobrecarregar o servidor alvo, fazendo com que ele processe um grande volume de expressões regulares inválidas.

Elevação de privilégios:


A elevação de privilégios é uma vulnerabilidade de falha no controle de acesso. Nesse caso, um invasor contorna os controles de acesso para obter permissões mais amplas sobre um recurso.

Desreferência de ponteiro NULL:

Por fim, a desreferência de ponteiro nulo foi a décima vulnerabilidade de alta ou criticidade mais grave encontrada com maior frequência nas análises da Snyk. Além disso, foi a principal vulnerabilidade de alta ou criticidade mais grave em Go e uma das mais comuns em C e C++. Essa vulnerabilidade ocorre quando um aplicativo tenta desreferenciar um ponteiro que espera ser válido, mas encontra um valor nulo, causando uma falha. Essa falha, por sua vez, cria uma vulnerabilidade de negação de serviço.

Ao entender essas vulnerabilidades comuns e sua prevalência no desenvolvimento de software, desenvolvedores e organizações podem implementar proativamente medidas de segurança e boas práticas para proteger seus aplicativos contra possíveis vulnerabilidades e ameaças.

Entenda as falhas

Falhas são problemas específicos que reduzem a segurança de um sistema, mesmo que nenhuma exploração real tenha sido identificada. Em essência, as falhas representam vulnerabilidades potenciais.

Um exemplo clássico de falha é usar algoritmos criptográficos fracos ou inseguros para proteger senhas. Embora isso não leve diretamente a uma exploração, deixa o aplicativo mais suscetível a ataques de força bruta ou à quebra de senhas.

// Example of weak code
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(password.getBytes());
Byte[] digest = md.digest();


No código Java acima, o uso de MD5 para gerar hashes de senhas é considerado uma falha, pois o MD5 é um algoritmo de hash fraco e desatualizado que pode ser quebrado facilmente.

Como as falhas são exploradas?

Embora vulnerabilidades e falhas sejam conceitos diferentes, elas estão intrinsecamente relacionadas porque podem ser exploradas. Uma falha pode existir em um sistema sem ser classificada como vulnerabilidade. Porém, quando um invasor identifica uma forma de explorá-la, ela se torna uma vulnerabilidade.

Falhas e AppSec

A segurança de aplicações é um elemento fundamental do desenvolvimento de software. Ela envolve proteger aplicativos de software e os dados que eles processam contra várias ameaças e vulnerabilidades. Entender as possíveis falhas é essencial para aprimorar as medidas de segurança.

Fazer uma avaliação de AppSec é essencial para entregar softwares e aplicativos seguros. Sem conhecer a postura de segurança atual dos seus aplicativos, é difícil saber onde sua organização apresenta falhas ou está vulnerável a futuras explorações.

Vulnerabilidades vs. falhas: qual é a diferença?

Falhas e vulnerabilidades são condições que indicam riscos de segurança.

Uma falha em um aplicativo é um erro ou bug que pode levar a uma vulnerabilidade explorável para realizar ações mal-intencionadas. O que diferencia uma falha de uma vulnerabilidade é a presença de uma carga útil específica que permite explorá-la. Quando uma exploração é identificada, a vulnerabilidade é confirmada e passa a representar um risco maior para a segurança do aplicativo. Uma boa prática é corrigir as falhas antes que se tornem vulnerabilidades urgentes.

Como identificar e corrigir vulnerabilidades e falhas

Com tantas vulnerabilidades para acompanhar e novas surgindo constantemente, as organizações precisam ter procedimentos e processos adequados para lidar com elas antes que a situação saia do controle. A avaliação de vulnerabilidades é parte fundamental desse trabalho.

A avaliação de vulnerabilidades é o processo contínuo de analisar falhas e pontos fracos de segurança nos seus sistemas. O objetivo é verificar falhas, possíveis vulnerabilidades conhecidas, sua relevância e o impacto que podem ter nos sistemas e ambientes.

Por exemplo:

  • O teste estático de segurança de aplicações (SAST), um método de teste de caixa branca com acesso ao código-fonte em repouso, pode ajudar a identificar falhas que podem levar a uma vulnerabilidade e gerar um relatório.

  • O teste de penetração consiste em invadir sistemas de forma ética a partir de um perímetro externo para identificar falhas e vulnerabilidades de segurança — simulando, na prática, as tentativas de um invasor de comprometer um sistema ou uma entidade.

  • Revisões seguras de código são ferramentas automatizadas que verificam espaçamentos e erros de nomenclatura no código e o comparam com funções padrão conhecidas; as revisões manuais avaliam o estilo, a intenção e o resultado funcional do código. As revisões de segurança de código verificam a robustez do código dos desenvolvedores. Uma revisão segura de código pode identificar pontos fracos antes que se tornem vulnerabilidades.

A boa notícia é que as ferramentas de teste estático de segurança de aplicações (SAST) existentes — como o Snyk Code — podem detectar pontos fracos e vulnerabilidades antes mesmo da revisão de código.

Fique à frente de vulnerabilidades e pontos fracos com a Snyk

A avaliação contínua de vulnerabilidades é essencial para criar produtos seguros.

As ferramentas de avaliação de vulnerabilidades facilitam esse processo e ajudam a corrigir vulnerabilidades no seu código. Escolher as ferramentas certas ajuda você a ficar um passo à frente de agentes mal-intencionados.

Encontre, priorize e corrija vulnerabilidades no seu código e nas suas dependências de código aberto automaticamente durante todo o ciclo de desenvolvimento com a Snyk.

Ou, se você é desenvolvedor e quer saber mais, confira o Snyk Learn, onde desenvolvedores descobrem como se manter seguros com aulas interativas sobre vulnerabilidades em diversas linguagens de programação e ecossistemas.

Por exemplo, confira nossos módulos de aprendizagem sobre:

Segurança de aplicações que acelera o desenvolvimento

Conheça a solução de segurança de aplicações da Snyk ou leia nosso guia de compra de ferramentas de segurança para desenvolvedores.