[PT-BR] Node Secure update. Quais foram os problemas ?
Tags: node, http
Published: 2020-02-08 03:06:12

Em fevereiro de 2020 foi liberada uma atualização para as versões 10x, 12x e 13x do Node.js e que causou uma certa ansiedade de discussão na comunidade em todo o globo. Ela veio para corrigir 3 problemas de servidores HTTP, principalmente aqueles que utilizam parser's nativos, como é o caso do mais utilizado e conhecido atualmente, o Express. Ambos os 3 problemas são encontrados na forma de interpretar uma conexão HTTP entre 2 (ou mais) pontas, podendo deixar os servidores vulnerareis ao ataque tanto em seu formato TSL quanto no inseguro HTTP.

## Quais foram os problemas encontrados ?

O principal dos 3 se deve à uma má interpretação do header "Transfer-Encoding". Este header tem como objetivo deixar claro ao servidor como os dados do payload serão formatados, sendo valores possíveis para este: chunked, compress, deflate, gzip, identity. E todos podendo ser combinados usando uma virgula, como "chunked, compress" que neste caso seria interpretado como ou sendo "chunked" ou sendo "compress".

O ataque poderia ser feito colocando uma formatação que não existe, como "eeee" e passando como body uma outra request. O servidor então terminava de interpretar o header do request e parava, enviando como response dados sensíveis, dando assim vazão ao ataque, que como no próprio release-note do node diz: "The payloads can be crafted by an attacker to hijack user sessions, poison cookies, perform clickjacking, and a multitude of other attacks depending on the architecture of the underlying system."

O problema foi evidenciado pelo engenheiro de software do Ebay, Ethan Rubinson!

Os relatados deste problema podem ser encontrados neste link:
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-15605

O segundo problema que iremos entender é também um problema na forma de interpretar o header do HTTP, ou HTTPS. Dessa vez quem revelou o problema à comunidade foi Alyssa Wilk, que trabalha no Google.

Neste caso a interpretação dos parser's nativos tratavam de forma errada os espaços em branco de alguns headers que até então não "tratava" os valores passados para o cabeçalho, com isso alguns ataques conseguiam fazer os servidores ignorarem alguns algoritmos de segurança que checavam a integridade da conexão entre os nós envolvidos.

Esse ataque está relocionado no link abaixo:
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-15606

Agora vamos para o terceiro problema de segurança corrigido, onde dessa vez tivemos 2 "autores" que informaram o problema, Rogier Schouten e Melvin Groenhoff.

Este ataque consiste em configurar uma chamada TLS, ou seja HTTPS, onde seja passado a propriedade subjectAltName com 19 strings como certificado da conexão, isso fará com que o servidor caia e possibilitaria uma invasão por queda (ou um ataque de negação de serviço também) caso o servidor tente ler o certificado do nó que faz a requisição.

Como esse caso é um pouco mais técnico e só acontecia em servidores que utilizassem o HTTPS e que o certificado estivesse mal configurado, o problema pode ter sido pouco utilizado pelos atacantes.

Vocês podem acompanhar usando o link:
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-15604

Mesmo sendo uma atualização importantíssima para os servidores e todos os programas afetados, os mantenedores do Node.js ainda deixaram claro que para quais-quer fins você pode usar a flag "--insecure-http-parser" para não levar essas atualizações para o seu sistema, mas é de suma importância entender os riscos e que os desenvolvedores da plataforma dizem que não seria uma boa prática.

## Legal, como eu faço para ver as correções ?

O mais legal da comunidade Node.js é a facilidade de ver o trabalho dos mantenedores, você pode ficar atento ao próprio site nodejs.org e entrar nas versões e acompanhar os change logs de cada versão. Além de consultar vários artigos sobre as versões e atualizações da plataforma, no site mesmo.

Outra ótima maneira é acessar o repositório no github e verificar os commits :) https://github.com/nodejs/node

O mais legal de tudo, é que como tudo é documentado, testado e explicado dentro do próprio repositório, os casos de teste também podem ser rodados e avaliados por vocês.

Como é o caso deste link, que mostra o commit feito para testar a solução do primeiro problema que apresentei aqui:
https://github.com/nodejs/node/commit/eea3a7429b

Além desses canais, de tempos em tempos são feitas reuniões online da comunidade e dos mantenedores e tudo é postado no canal do Youtube. Exemplo de post: https://www.youtube.com/watch?v=mj33ibz7Ias

## Comunidade acima de tudo

Essas correções de segurança e os problemas que foram encontrados (até os quais ainda não temos solução) podem ser encontrados (e reportados por vocês) em sites como o https://cve.mitre.org/index.html e é muito importante, para todo o ecossistema, que a comunidade esteja ativa e troque bastante figurinha sobre todos os assuntos. 

Se os desenvolvedores que citei aqui não tivessem relatado os problemas e os mantenedores do Node correrem para os corrigir, talvez sua aplicação sofresse os ataques e você nunca iria entender à fundo o que houve.

Contribua com a sua plataforma, com sua comunidade, com sua linguagem de programação favorita. O importante aqui é você participar :)