
tough-cookie v2.5.0 corrigido para CVE-2023-26136, vulnerabilidade de poluição de protótipo com Object.create(null) no MemoryCookieStore, incluindo demonstração de exploit e testes unitários.
Este repositório contém uma versão corrigida do pacote tough-cookie, versão 2.5.0, para resolver a vulnerabilidade crítica de Poluição de Protótipo (CVE-2023-26136). A vulnerabilidade permite que atacantes manipulem a cadeia de protótipos injetando propriedades em objetos JavaScript. Isso pode levar a comportamento inesperado, riscos de segurança como execução remota de código e problemas de compatibilidade em aplicações que dependem deste pacote.
As versões do pacote tough-cookie anteriores à v4.1.3 são vulneráveis a Poluição de Protótipo ao usar o CookieJar com o modo rejectPublicSuffixes=false. A vulnerabilidade surge do tratamento inadequado de cookies, especificamente quando o cookie.domain é definido como . Isso permite que atacantes modifiquem o objeto central, potencialmente causando problemas generalizados em toda a aplicação.
__proto__Object.prototypePara mais detalhes sobre o CVE-2023-26136, confira:
A poluição de protótipo pode introduzir vários riscos críticos, incluindo:
Vulnerabilidades de Segurança: Ao modificar o Object.prototype base, os atacantes podem manipular o comportamento dos objetos, potencialmente elevando privilégios, acessando dados sensíveis ou contornando mecanismos de segurança na aplicação.
Negação de Serviço (DoS): Poluir a cadeia de protótipos pode causar comportamento inesperado no sistema, levando a travamentos, loops infinitos ou exaustão de recursos, tornando a aplicação indisponível para usuários legítimos.
Problemas de Compatibilidade: Alterar o Object.prototype pode causar erros e comportamento inesperado ao interagir com outras bibliotecas ou frameworks. Dependências que dependem de cadeias de protótipos podem quebrar, levando a problemas de integração ou comportamento defeituoso da aplicação durante atualizações.
Comportamento Inesperado da Aplicação: A poluição de protótipo pode levar a um comportamento errático do programa, incluindo corrupção de dados, violações de segurança e potencialmente expor a aplicação a novas explorações.
A correção envolve modificar a classe MemoryCookieStore, especificamente o método putCookie, para evitar a poluição de protótipo criando objetos sem protótipo. As principais alterações incluem:
Object.create(null) em vez de {} para criar objetos sem protótipo.cookie.domain = __proto__.Para instalar a versão corrigida do tough-cookie, use o seguinte comando:
npm install ./tough-cookie-2.5.0-PATCHED.tgz
Este repositório inclui um teste unitário projetado para verificar se a vulnerabilidade de poluição de protótipo foi resolvida com sucesso.
O teste, chamado prototype_pollution_test, verifica especificamente que definir cookies com um domínio de __proto__ não afeta mais a cadeia de protótipos do JavaScript. Isso garante que a poluição de protótipo seja evitada, mantendo a integridade da aplicação.
Para executar os testes e confirmar a correção, execute o seguinte comando:
npm test
Para demonstrar a exploração nas versões original e corrigida, siga os passos abaixo:
Instale a versão vulnerável do tough-cookie:
npm install [email protected] && node index.js
Saída Esperada:
Polluted object: {
Slonser: Cookie="Slonser=polluted; Domain=__proto__; Path=/notauth; hostOnly=false; aAge=5ms; cAge=5ms",
Auth: Cookie="Auth=Lol; Domain=google.com; Path=/notauth; hostOnly=false; aAge=5ms; cAge=5ms"
} EXPLOITED SUCCESSFULLY
Isso indica que o protótipo de um objeto foi poluído, confirmando que a vulnerabilidade está presente na versão original.
npm install ./tough-cookie-2.5.0-PATCHED.tgz && node index.js
Saída Esperada:
EXPLOIT FAILED
Isso mostra que a exploração foi bloqueada com sucesso, confirmando que a vulnerabilidade de poluição de protótipo foi corrigida.
O processo de lidar com a vulnerabilidade de Poluição de Protótipo no tough-cookie v2.5.0 envolveu várias etapas metódicas para garantir que a correção fosse completa e eficaz. Abaixo está uma visão geral da abordagem que segui:
Comecei pesquisando a Poluição de Protótipo (CVE-2023-26136) para entender seu impacto. A vulnerabilidade permite que atacantes injetem propriedades na cadeia de protótipos por meio da propriedade cookie.domain, potencialmente causando riscos de segurança como execução remota de código.
Explorei issues e discussões no GitHub sobre a vulnerabilidade, incluindo a correção no tough-cookie v4.1.3, que usa Object.create(null) para evitar a poluição de protótipo. Isso me ajudou a identificar as mudanças necessárias para corrigir a v2.5.0.
Comparei a v2.5.0 com a v4.1.3 para entender as diferenças e identificar as mudanças necessárias. A modificação principal envolveu o uso de objetos sem protótipo para evitar a exploração.
Atualizei a classe MemoryCookieStore para usar Object.create(null) em vez de {}, garantindo que não haja poluição de protótipo.
Escrevi testes unitários para verificar a correção e criei um script de demonstração de exploração (index.js) para mostrar como a vulnerabilidade é evitada na versão corrigida.
Finalmente, documentei a correção, incluindo instruções de instalação e teste, e empacotei a versão corrigida (tough-cookie-2.5.0-PATCHED.tgz) para fácil distribuição.
Arquivos Adicionados/Editados a partir da v2.5.0
index.js: Script principal para demonstrar a vulnerabilidade e a correção.lib/memstore.js: A classe MemoryCookieStore modificada para evitar poluição de protótipo.test/ietf_data/parser.json: Atualizado para editar datas desatualizadas nos dados de teste.test/prototype_pollution_test.js: Testes unitários para verificar se a poluição de protótipo foi corrigida.tough-cookie-2.5.0-PATCHED.tgz: A versão corrigida do pacote tough-cookie.