DEV Community

Cover image for Protegendo sua API NodeJs contra ReDos Attack[Parte 1]
Ronaldo Modesto
Ronaldo Modesto

Posted on

Protegendo sua API NodeJs contra ReDos Attack[Parte 1]

Fala povo bonito, como estão ?
Espero que esteja indo tudo bem por aí 🙂
Hoje vamos falar sobre ReDos Attack.

Antes de começarmos quero dizer que decidi dividir esse artigo em 3 partes, pois quero que quem esteja começando no mundo do NodeJs/Javascript, seja backend ou front end, entenda o que eu estou dizendo. Não sou muito fã de deixar conhecimentos implícitos e meu objetivo é atingir pessoas que ainda não conheciam esses conceitos/funcionalidades 🙂.

Portanto temos a seguinte divisão para artigo:

  1. Protegendo sua API NodeJs contra ReDos Attack[Parte 1]: É definição do que é expressão regular, como usar, o que é ReDos e como ele ocorre;

  2. Protegendo sua API NodeJs contra ReDos Attack[Parte 2]: Aqui é a apresentada a minha proposta de solução, que inclusive pode ser generalizado para outros casos de operações que levem muito tempo para serem computadas e possam prejudicar o funcionamento do NodeJs. Explicando o que eu usei e porquê eu usei;

  3. Protegendo sua API NodeJs contra ReDos Attack[Parte 3]: Aqui é feito um teste de funcionalidade da solução proposta para ver se ela de fato resolve o problema, além de ser feito um teste de carga para verificar se a solução é escalável quando nossa API ficar sob um tráfego intenso de requisições.

Lembrando que isso é apenas uma proposta de solução, baseado nas situações que já vi e que já tratei. Não estou dizendo que seja a melhor, nem a pior, é apenas mais uma opção, beleza 🙂?
Por isso se você só quer ver a solução, pode pular para a segunda parte, e se você só quer ver se isso realmente funciona, então a terceira parte é o seu objetivo !!

Sem mais delongas, bora pro conteúdo!!

ReDos Attack ou Regular Expression Denial of Service Attack é um tipo de ataque onde um atacante explora o uso de uma expressão regular mal escrita enviando para a o sistema alvo um payload malicioso que pode fazer com que a expressão regular leve muito tempo para ser computada, consumindo uma grande quantidade de recursos computacionais durante esse processo. Vamos ver o que é uma expressão regular, o que é e como ocorre um ReDos Attack e o que podemos fazer para mitigar esse risco.

Regex Expression(Expressão regular)
Para entender o que é o ReDos, primeiro precisamos ter uma noção do que é uma expressão regular.
De forma simples, uma expressão regular é um padrão que identifica vários elementos de um conjunto, ou seja, uma expressão regular é um padrão utilizado para saber se determinado texto, ou partes desse texto, possui alguma característica.
Por exemplo, suponha que você tem o seguinte texto (não se preocupe com o conteúdo, é apenas para ilustrar o exemplo):

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam sed tempus lorem, non tincidunt nisl. Nullam eget dui vestibulum, blandit lorem ex a, sollicitudin erat. Phasellus aliquet pharetra orci molestie tincidunt. Pellentesque vel egestas nisl. Donec malesuada mauris urna, eu luctus tortor gravida efficitur. Aliquam suscipit risus in sem convallis imperdiet. tempus lorem, Nullam tincidunt  lorem luctus eu urna lorem, vestibulum lorem.
Enter fullscreen mode Exit fullscreen mode

Suponha que você quer saber quantas e quais são as palavras que possuem exatamente 5 letras.
Neste caso você poderia utilizar a seguinte expressão regular:

\b[a-zA-Z]{5}\b
Enter fullscreen mode Exit fullscreen mode

Basicamente o que essa expressão regular diz é: "Encontre todas as palavras que se inicie com qualquer caractere minúsculo ([a-z]) ou se inicie com um caractere maiúsculo ([A-Z]) e que tenha exatamente 5 caracteres ({5}). O "\b" No início e no final da expressão regular marca o limite de palavra, isso serve para evitar que sub palavras sejam contabilizadas, ou seja, considera apenas palavras inteiras.
A seguir temos o resultado da expressão regular acima para o texto utilizado no exemplo.

Regular Expression example execution result
Não é nosso objetivo aqui estudar com profundidade o que é uma expressão regular, porém, se você faz uso desse mecanismo em seu dia a dia como desenvolvedor, então sugiro fortemente se aprofundar mais nesse assunto, caso não seja um desenvolvedor sugiro ler mesmo assim pois conhecimento nunca é demais🙂. Mais informações sobre expressões regulares pode ser lido aqui definição de Expressão regular.

Ok, agora que já temos uma noção do que é uma expressão regular e como podemos utilizá-la vamos ver como ela pode ser prejudicial para o desenvolvimento de um software.

ReDos Attack

No desenvolvimento de software é comum que os desenvolvedores utilizem expressões regulares para fazer validações de dados, em uma validação de formulário é muito comum utilizá-las para validar se um e-mail está correto por exemplo.
Porém, devemos tomar cuidado ao lançar mão de tal artifício pois dependendo de como se monta a expressão podemos deixar nosso sistema vulnerável, principalmente quando falamos do NodeJs.
Dependendo da expressão e da entrada é possível que ocorra um fenômeno chamado Catastrophic evaluation (Avaliação catastrófica) ou Catastrophic backtracking( Retorno catastrófico).
Essa situação ocorre quando a compilação da expressão regular para uma dada entrada leva tanto tempo e é tão custosa que todo o CPU fica ocupado executando aquele processamento, impedindo assim que outras tarefas sejam executadas.
No caso do NodeJs, esse fenômeno pode levar ao bloqueio da main thread (thread principal), o que por sua vez pode levar toda a API/Sistema a parar de responder. E é exatamente isso que chamados de ReDos Attack, ou seja, é quando um atacante envia intencionalmente payloads(dados) maliciosos para a API/Sistema alvo afim de explorar essa falha, deixando assim o sistema alvo inoperante, por isso o nome ReDos, Re de Regular Expression, Dos de Denail of Serviçe, ou seja, negação de serviço baseado em regex.
A seguir é exibido um exemplo de expressão regular e input que podem levar à essa situação.

Catastrophic evaluation

O site, inclusive, identifica a situação de loop infinito e interrompe a avaliação da nossa expressão, conforme pode ser visto a seguir.

Catastrophic evaluation halted by website

Conforme veremos mais adiante, essa situação no nodeJs pode travar todo o seu sistema e com certeza é algo que não queremos.

Então bora para a parte 2 para ver como podemos resolver essa situação?
Te espero lá 🙂
Segunda Parte

Top comments (0)