
Pesquisando sobre a vulnerabilidade CVE-2023-26136
Pesquisando sobre a vulnerabilidade CVE-2023-26136
As versões do pacote tough-cookie anteriores a 4.1.3 são vulneráveis a Prototype Pollution devido ao tratamento inadequado de Cookies ao usar CookieJar no modo rejectPublicSuffixes=false. Este problema decorre da forma como os objetos são inicializados.
https://nvd.nist.gov/vuln/detail/CVE-2023-26136
JavaScript tem o conceito de objetos, que é algo como dicionários. Um objeto pode conter um conjunto de variáveis de diferentes tipos (ex.: string, Boolean, int etc.), o nome da variável é uma chave, e seu valor é o valor, se continuarmos com a analogia de dicionários e objetos. Mais precisamente, o objeto é análogo à própria estrutura de dados do dicionário, e cada variável é análoga a um par chave-valor. Objetos também possuem a palavra-chave proto, que permite adicionar variáveis adicionais a um objeto através da modificação de seu protótipo. Prototype Pollution é um ataque no qual o atacante polui seu objeto, adicionando variáveis adicionais a ele, por meio da palavra-chave proto. A interação abaixo com o console do navegador demonstra o ataque.

Como podemos ver, temos dois usuários: admin1 e user1. O objeto admin1 possui uma variável Boolean: "isAdmin", que está definida como true. user1 não possui essa variável. Na linha 7, adicionamos a variável isAdmin ao protótipo do user1, e embora seja evidente na linha 10 que a variável não foi adicionada ao próprio objeto user1, o console responde positivamente, desta vez, quando verificamos o valor de user1.isAdmin. Isso ocorre porque user1 está herdando as propriedades de seu protótipo.

Também vale mencionar que o protótipo é um objeto por si só, que por sua vez herda propriedades e métodos de seu protótipo, criando assim uma cadeia de protótipos. A cadeia termina com um protótipo nulo, portanto uma abordagem razoável para prevenir a Prototype Pollution é fazer com que o objeto com o qual estamos trabalhando herde explicitamente de um protótipo nulo.
Cookies (frequentemente conhecidos como cookies de internet) são arquivos de texto com pequenos pedaços de dados — como um nome de usuário e senha — que são usados para identificar seu computador enquanto você usa uma rede. Cookies específicos são usados para identificar usuários específicos e melhorar sua experiência de navegação na web.
Cortesia da Kaspersky: https://www.kaspersky.com/resource-center/definitions/cookies
CookieJar é um objeto para armazenar cookies.
De acordo com a descrição da vulnerabilidade, ela decorre da forma como o Tough-Cookie inicializa os Cookies. Como Cookies são objetos, eles são, pelo menos teoricamente, vulneráveis à Prototype Pollution.
Ao ser capaz de adulterar objetos e particularmente cookies, através do protótipo do objeto, o atacante pode potencialmente acessar dados não autorizados, executar código remoto, causar negação de serviço, sequestrar a sessão se o site depender de cookies para gerenciar a sessão, e extrair dados sensíveis dos próprios cookies.
O patch foi feito no arquivo: memstore.js. De acordo com o rastreamento do problema, bem como com o patch introduzido na versão 4.1.3, para corrigir a vulnerabilidade, precisamos armazenar os cookies em um mapa ou criar o objeto this.idx. Ao criar this.idx usando: this.idx = Object.create(null); em vez de this.idx = {}, praticamos minha sugestão sobre como prevenir Prototype Pollution na introdução, herdando de um protótipo nulo e cortando a cadeia de protótipos.
A Snyk publicou uma Prova de Conceito (PoC) para a vulnerabilidade discutida. Construí o index.js baseado nela. Envolvi em uma lógica try-catch para capturar exceções caso ocorressem, adicionei saída adicional para acompanhar o progresso dos testes e terminei com a saída necessária (ex.: "EXPLOITED SUCCESSFULLY" ou "EXPLOITED FAILED"). Ao executar o comando: npm install [email protected] && node index.js Obtemos a seguinte saída:

Ao executar o comando: npm install ./tough-cookie-2.5.0-PATCHED.tgz && node index.js Obtemos a seguinte saída:

Em ambos os cenários (executando com a versão publicada 2.5.0 e executando com minha versão corrigida), conseguimos configurar tanto o cookie normal quanto o cookie explorado, mas na versão corrigida, não conseguimos acessar o cookie explorado.
Nesta tarefa aprendi sobre o ataque de Prototype Pollution, aprendi sobre o objeto JavaScript e fui apresentado ao pacote Tough-Cookie.