This article is an automated machine-translation of an article in English. We know the translation isn't perfect, but we hope it's useful for people who don't read English.

Anatomia de uma vulnerabilidade - cURL kit de ferramentas de download da web escondidos por erro de autenticação

Filed Under: Featured, Vulnerability

Você pode não ter ouvido falar de cURL, mas provavelmente você já usou o software que utiliza.

É um conjunto de ferramentas de programação de código aberto que ajuda a lidar com a escrita de código do cliente que lida com URLs.

Nas palavras do próprio projeto ", cURL groks os URLs".

É popular porque é uma URL canivete suíço, tornando mais fácil para lidar com protocolos populares como HTTP, SMTP, POP3 e muitos mais. Ele também suporta uploads, downloads, autenticação, proxies, cookies e SSL / TLS.

Ele até suporta Gopher , se você se lembrar que, longe de volta.

Um risco com uma biblioteca de todos cantando, dançando, tudo, é claro, é que não há código de mais para dar errado.

E, às vezes, até mesmo pedaços obscuros de código que você pensou que nunca iria usar pode ficar acionado. Pior ainda, eles podem ser triggerable por circunstâncias externas que você nunca previstos.

Esse é o problema encaracolados aqui.

O código vulnerável foi introduzida na versão 7.26.0, quando o suporte para autenticação DIGEST_MD5 foi adicionada ao software cURL.

DIGEST_MD5 é uma forma rudimentar de permitir que você faça o login através de uma conexão criptografada, por exemplo, para um servidor HTTP ou POP3, sem enviar sua senha real.

O servidor envia uma string de desafio aleatório, ou nonce, juntamente com um grupo de outros dados relacionados com a autenticação , você responder com um hash criptográfico de sua senha misturado com os dados fornecidos servidor:

Assim, um cracker que fareja sua resposta não pode diretamente recuperar sua senha, a partir dele, e uma vez que o desafio é aleatória e varia a cada vez que você entrar, o cracker não pode voltar a usar a sua resposta mais tarde.

Como um aparte: evitar o uso de DIGEST_MD5 autenticação. Criptografar toda a sessão usando TLS vez.

Um cracker que fareja uma resposta DIGEST_MD5 não pode voltar a usá-lo diretamente, mas ele pode usá-lo para tentar recuperar sua senha desligada usando um ataque de dicionário.

TLS não não impede que isso, mas também mantém o segredo transação inteira, incluindo o conteúdo de sua sessão web ou e-mail. Isso é um resultado muito mais segurança.

Aqui está o código de buggy a partir de uma versão vulnerável do cURL:

Não se preocupe se você não está familiarizado com C. eu vou explicar.

No C, a gestão e uso de memória é deixada para o programador. Você pode usar o código da biblioteca para ajudá-lo a lidar com segurança com comprimento variável de dados, como seqüências de texto fornecidos pelo usuário, ou você pode lidar diretamente com a memória mesmo.

Acima, o programador fez o segundo.

Em primeiro lugar, ele aloca uma série de blocos de tamanho fixo de memória na pilha.

Em seguida, ele copia cadeias de texto fornecidos pelo chamador da função para esses blocos, mas se utiliza o sistema de funções strcpy () e strcat (), que representam "string cópia" e "string concatentate" (aderência uma corda no final de outro), respectivamente.

No código moderno, você nunca deve usar essas funções, porque não se pode limitar a quantidade de dados que copiar.

Eles simplesmente duplicar cada byte da cadeia de entrada para a cadeia de saída, até que um byte (zero) NUL foi encontrado. Um NUL é como a extremidade de uma cadeia de texto é indicada em C.

Assim, se o servidor envia muitos dados em seu desafio de autenticação, por exemplo, uma string realm excessivamente longo (o conteúdo do que pode ser o que o servidor escolhe), esta função irá encher muitos dados para o buffer ele usa para calcular a resposta de autenticação.

A sobrecarga da memória intermédia vai resultar, e, neste caso, uma vez que os blocos de dados de destino foram atribuídos automaticamente na pilha, a função irá falhar quando ele termina.

Isso porque a pilha também armazena o endereço na memória a partir do qual a função foi chamada, para que o software cURL pode voltar lá quando terminar. O endereço de retorno é substituído no código acima, se a resposta cadeia de superar-cheia.

A correção foi simples.

O strcpy incontrolável () e strcat () funções foram substituídas com a função snprintf (), que significa "impressão formatada de string em no máximo n bytes":

Você ainda pode cometer erros com snprintf, já que é até você para especificar n, e se você não for cuidadoso, você pode errar.

Mas o ponto é que é pelo menos possível para restringir a saída de snprintf para um tamanho de buffer conhecido, que você simplesmente não pode fazer com o strcpy antiquado () e strcat ().

→ O código cURL atualizados acima ainda não é perfeito. O programador deve realmente verificar o valor de retorno do snprintf (), que informa quantos bytes que queria escrever. Se o buffer não era grande o suficiente, então a saída será incompleta e inexacta. Você não deve usá-lo: aumentar o tamanho do buffer e tente novamente, ou relatar um erro em vez.

Você provavelmente está pensando, neste momento, que a exploração desta vulnerabilidade seria difícil porque a maioria dos programas que usam cURL fazê-lo no fundo. Eles não são interativos.

Autoupdating software, que pode utilizar a biblioteca cURL (conhecido como libcurl) normalmente vem pré-configurado com uma lista de URLs em boas condições, ou pede para você digitar uma URL no momento da instalação, e que é isso.

Um atacante que poderia falar com você até mudar o seu URL autoupdate em boas para um desonesto, ou que poderia convencê-lo a mudar a partir do servidor de email POP3 que você sempre usada para que você nunca ouviu falar, certamente é mais fácil para infectar você simplesmente fazendo com que você execute seu malwares diretamente.

Isso é verdade, mas ainda há um risco.

Se um atacante pode redirecionar os pedidos de seu AutoUpdater ou seu cliente POP3, por exemplo, brincar com as configurações de DNS, ou cortando um servidor na borda da rede da operadora, ele poderia lhe enviar para um site impostor e tentativa de explorá-lo de lá.

Por causa do estouro de buffer, isso poderia levar a um drive-by download, onde cURL em si é levado a se comportar mal, cortando o seu consentimento fora do circuito completamente.

As lições?

  • Não use strcpy () ou strcat ().
  • Nunca.
  • Use snprintf (ou strlcpy () e strlcat () , ou similar), em vez disso.
  • Sempre verifique o valor de retorno de string funções de tratamento de modo que você não acabar usando resultados incorretos.

Seu próximo problema é saber se, ou que, o software que você está usando, que inclui código cURL com esses bugs. (Versões do cURL de 7.26.0 a 7.28.1 inclusiva são afetados.)

Melhor começar a perguntar por aí ...

NB. Embora vários produtos Sophos use o CURL, nenhum deles usar o código das versões vulneráveis.

You might like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

About the author

Paul Ducklin is a passionate security proselytiser. (That's like an evangelist, but more so!) He lives and breathes computer security, and would be happy for you to do so, too. Paul won the inaugural AusCERT Director's Award for Individual Excellence in Computer Security in 2009. Follow him on Twitter: @duckblog