Estouro de buffer em curl e libcurl, manifestado ao acessar através de um proxy SOCKS5

Foi identificada uma vulnerabilidade (CVE-2023-38545) no utilitário de recebimento e envio de dados pela rede curl e pela biblioteca libcurl, que está sendo desenvolvida em paralelo, o que pode levar a um buffer overflow e potencialmente à execução de código invasor em do lado do cliente, quando acessado usando o utilitário curl ou um aplicativo usando libcurl, para um servidor HTTPS controlado pelo invasor. O problema só aparece se o acesso via proxy SOCKS5 estiver habilitado no curl. Ao acessar diretamente sem proxy, a vulnerabilidade não aparece. A vulnerabilidade foi corrigida na versão curl 8.4.0. O pesquisador de segurança que descobriu o bug recebeu uma recompensa de US$ 4660 como parte da iniciativa Internet Bug Bounty da Hackerone.

A vulnerabilidade é causada por um erro no código de resolução do nome do host antes de acessar o proxy SOCKS5. Se o nome do host tiver até 256 caracteres, curl imediatamente passa o nome para o proxy SOCKS5 para resolução em seu lado, e se o nome tiver mais de 255 caracteres, ele alterna para o resolvedor local e passa o endereço já definido para SOCKS5 . Devido a um erro no código, o flag que indica a necessidade de resolução local pode ter sido configurado com o valor errado durante a negociação lenta de uma conexão via SOCKS5, o que levou à gravação de um nome de host longo em um buffer alocado com a expectativa de armazenar o endereço IP ou nome, não excedendo 255 caracteres.

O proprietário de um site acessado por curl por meio de um proxy SOCKS5 pode acionar um buffer overflow do lado do cliente retornando um código de redirecionamento de solicitação (HTTP 30x) e definindo o cabeçalho "Location:" para uma URL com um nome de host variando em tamanho de 16 até 64 KB (16 KB é o tamanho mínimo necessário para estourar o buffer alocado e 65 KB é o comprimento máximo permitido do nome do host em uma URL). Se o redirecionamento de solicitação estiver habilitado nas configurações do libcurl e o proxy SOCKS5 usado for lento o suficiente, o nome longo do host será gravado em um buffer pequeno, obviamente de tamanho menor.

A vulnerabilidade afeta principalmente aplicativos baseados em libcurl e aparece no utilitário curl apenas ao usar a opção “--limit-rate” com valor menor que 65541 - libcurl por padrão aloca um buffer de 16 KB de tamanho, e no utilitário curl tem 100 KB, mas o tamanho muda dependendo do valor do parâmetro “-limit-rate”.

Daniel Stenberg, autor do projeto, mencionou que a vulnerabilidade permaneceu sem ser detectada por 1315 dias. Ele também diz que 41% das vulnerabilidades identificadas anteriormente no curl provavelmente poderiam ter sido evitadas se o curl tivesse sido escrito em uma linguagem segura para memória, mas não há planos para reescrever o curl em outra linguagem em um futuro próximo. Como medidas para melhorar a segurança da base de código, propõe-se ampliar as ferramentas de teste de código e utilizar mais ativamente dependências escritas em linguagens de programação que garantam a operação segura com memória. Também está considerando a possibilidade de substituir gradualmente partes do curl por opções escritas em linguagens seguras, como o backend experimental Hyper HTTP implementado em Rust.

Fonte: opennet.ru

Adicionar um comentário