Importante! Vulnerabilidade de Segurança do ASP.NET

Importante! Vulnerabilidade de Segurança do ASP.NET

A algumas horas foi publicado no Microsoft Security Advisory informações sobre uma vulnerabilidade de segurança do ASP.NET

Esta vulnerabilidade foi tornada publica turante a conferencia de segurança de sexta-feira.  É recomendado que todos apliquem imediatamente um "corretivo" para prevenir que scripts maliciosos se utilizem deste problema nas aplicações ASP.NET.

O que a vulnerabilidade permite?

Um atacante pode utilizar esta vulnerabilidade para requisitar e fazer o download de arquivos da aplicação ASP.net como o web.config (que pode conter dados importantes)

Quando o ataque explorar a falha pode descriptografar dados enviados ao cliente em um estado criptografado (como ViewState em uma página).

Como a vulnerabilidade funciona

Para entender esta falha é necessário conhecer profundamente sobre a criptografia das paginas ASP.NET. Existe uma parte do contexto de criptografia do ASP.net que fornece dicas de como responder as requisições. Neste caso, aqui está a vulnerabilidade no ASP.NET que trabalha como uma camada deste contexto. O que permite um atacante enviar textos criptografados para o Servidor Web e saber se foi descriptografado corretamente examinando o codigo de erro retornado.  Fazendo várias requisições (e verificando os erros retornados) o ataque pode descobrir como descriptografar o resto do texto.

Como contornar a vulnerabilidade

Uma maneira de contornar a falha e previnir ataques é habiltar a função <customErros> do ASP.NET, e configurar explicitamente que sua pagina retorne sempre a mesma pagina de errro – escondendo o erro encontrado no servidor.  Mapiando os erros para uma única pagina, você se previne que hackers diferenciem os diferentes tipos de erros acontecendo no servidor.

Importante: Não é simplesmente habilitar o CustomErros ou configurá-lo para RemoteOnly.  Você precisa ter certeza que todos os erros estão direcionados para mesma página.  Isso requer que defina explicitamente o parametro "defaultRedirect" dentro da seção customErrors e certifique-se que nenhum codigo de status está configurado.

Contornando a falha no ASP.NET V1.0 até V3.5

Se está utilizando ASP.NET 1.0, ASP.NET 1.1, ASP.NET 2.0, or ASP.NET 3.5 então devera seguir os seguintes passos para habilitar a sessão 'customErrors' e mapiar todos os erros para uma única página:

1) Edite o Web.Config de sua aplicação principal ASP.NET.  Se o mesmo não existir, crie um na raiz da aplicação.

2) Crie ou modifique a seção <customErrors> no web.config  para ter as configurações abaixo:

<configuration> <system.web> <customErrors mode="On" defaultRedirect="~/error.html" /> </system.web> </configuration>

3) Você deve então adicionar o arquivo error.html em sua aplicação e este deve conter a pagina de erro apropriada que você escolher (contendo o conteúdo que você quiser). Este arquivo será mostrado toda vez que um erro ocorrer em sua aplicação.

Nota: O importante é notar que o modo do customErros é configurado para "on", e todos os erros serão direcionados para a pagina definida em defaultRedirect.  Aqui não temos várias paginas de erro dependendo do código – o que significa que não existem sub-elementos "error" na seção "customErrors". Isso previne que atacantes consigam diferenciar o motivo que um erro ocorreu no servidor e contorna a falha.

Contornando a falha no ASP.NET V3.5 SP1 e ASP.NET 4.0

Se está utilizando ASP.NET 3.5 SP1 ou ASP.NET 4.0 então deve seguir os passos abaixo para habilitar a seção "customErrors" e mapear todos os erros para uma única página:

1) Edite o Web.Config de sua aplicação ASP.NET.  Se este não existir, crie um na pasta raiz da aplicação.

2) Crie ou modifique a seção "customErrors" do web.config para se parecer com as configurações abaixo.  Note que se usa redirectMode=”ResponseRewrite” com o .NET 3.5 SP1 e .NET 4.0:

<configuration> <system.web> <customErrors  mode="On"  redirectMode="ResponseRewrite"  defaultRedirect="~/error.aspx" /> </system.web> </configuration>

3) Você deve então adicionar uma pagina Error.aspx na sua aplicação contendo uma pagina de erro apropriada e de sua escolha (contendo o que você preferir). Este arquivo deve ser mostrado toda vez que um erro acontecer na aplicação.

4) É recomendado adicionar o código abaixo no evento Page_Load() da página Error.aspx para adicionar um pequeno e aleatorio delay. Isso ajuda a ofuscar os erros.

Versão em VB

Abaixo está uma versão em VB do Error.aspx que pode usar para criar o delay. Você não precisa compilar isso em sua aplicação. – Você pode opcionalmente apenas salber este Error.aspx em seu diretório da aplicação ou em seu servidor web:

<%@ Page Language="VB" AutoEventWireup="true" %> <%@ Import Namespace="System.Security.Cryptography" %> <%@ Import Namespace="System.Threading" %> <script runat="server"> Sub Page_Load() Dim delay As Byte() = New Byte(0) {} Dim prng As RandomNumberGenerator = New RNGCryptoServiceProvider() prng.GetBytes(delay) Thread.Sleep(CType(delay(0), Integer)) Dim disposable As IDisposable = TryCast(prng, IDisposable) If Not disposable Is Nothing Then disposable.Dispose() End If End Sub </script> <html> <head runat="server"> <title>Error</title> </head> <body> <div> Sorry - an error occured </div> </body> </html>

Versão em C#

Abaixo está uma versão em C# do Error.aspx que pode usar para criar o delay. Você não precisa compilar isso em sua aplicação. – Você pode opcionalmente apenas salber este Error.aspx em seu diretório da aplicação ou em seu servidor web:

<%@ Page Language="C#" AutoEventWireup="true" %> <%@ Import Namespace="System.Security.Cryptography" %> <%@ Import Namespace="System.Threading" %> <script runat="server"> void Page_Load() { byte[] delay = new byte[1]; RandomNumberGenerator prng = new RNGCryptoServiceProvider(); prng.GetBytes(delay); Thread.Sleep((int)delay[0]); IDisposable disposable = prng as IDisposable; if (disposable != null) { disposable.Dispose(); } } </script> <html> <head runat="server"> <title>Error</title> </head> <body> <div> An error occurred while processing your request. </div> </body> </html>

Como verificar se a falha foi contornada

Uma vez aplicada as alterações, você pode testar para ter certeza que a seção "customErrors" foi corretamente configurada fazendo uma requisição em seu site da seguinte forma: http://SeuSite.com/PaginaQueNaoExiste.aspx

Se for mostrada a pagina de erro que configurou (pois a pagina que pediu não existe) então sua configuração deve ter sido feita corretamente. Se você ver uma pagina de erro ASP.NET padrão então significa que esqueceu de seguir um dos passos acima.  Para maiores informações sobre o que está causando o problema você pode configurar da seguinte forma <customErrors mode=”remoteOnly”/> – Assim irá habilitar que veja a mensagem de erro se você estiver conectado ao site localmente.

Como encontrar a Vulnerabilidade do ASP.NET em seu Servidor Web.

Foi publicado um script .vbs que pode ser salvo e rodar em seu servidor web para determinar se nele estão instaladas aplicações ASP.NET que possuem o "customErrors" desligado, ou que possuam diferentes status de erro dependendo do código.

Você pode fazer o download do script aqui.  Simplesmente copie e cole o script em um arquivo de texto chamado “DetectCustomErrors.vbs” e salve-o no disco.  Então inicie um prompt de comando com nível de administrador e execute o comando "cscript DetectCustomErrors.vbs" para rodar o script no servidor localmente.  Ele irá enumerar todas as aplicações do servidor e fará a verificação se o "customErrors" está com a configuração correta.

Ele irá setar qualquer aplicação que encontrar onde esta não possua a seção "customErrors" (neste caso vai ser necessário adicionar), ou não tenha contornado a falha (neste caso será necessário uma alteração).  E vai imprimir "ok" para cada web.config que estiver configurado corretamente.  Isso deve tornar mais simples a localização dos problemas.

Nota: O Scritp de detecção foi desenvolvido em nas últimas horas e será atualizado no futuro.  Na pagina do autor será feito a atualização a cada mudança efetuada.

Onde encontrar mais informações sobre a vulnerabilidade

Você pode encontrar mais dados sobre a falha em:

Fonte

Este artigo foi traduzido da pagina de Scott Guthrie e o artigo original pode ser encontrado em:

http://weblogs.asp.net/scottgu/archive/2010/09/18/important-asp-net-security-vulnerability.aspx

Ele ainda disponibilizou uma página com as perguntas mais frequentes sobre a falha. Que pode ser encontrada aqui:

http://weblogs.asp.net/scottgu/archive/2010/09/20/frequently-asked-questions-about-the-asp-net-security-vulnerability.aspx

 

Devido a importância da informação decidi traduzir o post para facilitar o entendimento.

 

  1. Deixe um comentário

Deixe um comentário