ASP.NET уязвимость безопасности

Пару дней назад в Microsoft Security Advisory было опубликовано сообщение об уязвимости безопасности ASP.NET. Эта уязвимость присутствует во всех версиях ASP.NET. Информация об уязвимости была сообщена в пятницу на конференции по безопасности. Microsoft рекомендует всем пользователям срочно применить временное решение (описано ниже), чтобы не дать злоумышленникам воспользоваться уязвимостью ваших ASP.NET приложений.

Что позволяет сделать уязвимость?

Злоумышленник, использующий данную уязвимость, может запросить и скачать файлы приложения ASP.NET, например файл web.config (который часто содержит конфиденциальные данные).

Злоумышленник, использующий данную уязвимость, может также расшифровать данные посланные клиенту в зашифрованном виде (например данные ViewState на странице).

Как защититься от уязвимости

Временное решение, которым вы можете воспользоваться, чтобы избежать данной уязвимости – включить <customErrors> в ASP.NET, и сконфигурировать ваше приложение так, чтобы всегда возвращалась одна и та же страница с ошибкой – независимо от типа ошибки на сервере. Перенаправляя все сообщения об ошибках на одну страницу, вы тем самым не дадите хакеру возможности различать разные типы ошибок, происходящих на сервере.

Важно: Недостаточно просто включить CustomErrors или проставить значение RemoteOnly. Вы также должны убедиться, что все ошибки сконфигурированы таким образом, чтобы выдавать одну и ту же страницу. Для этого вы должны установить атрибут “defaultRedirect” в секции <customErrors> и убедиться, что никаких статус кодов не выставлено.

Применяем временное решение для ASP.NET версий от 1.0 до 3.5

Если вы используете ASP.NET 1.0, ASP.NET 1.1, ASP.NET 2.0 или ASP.NET 3.5, то вы должны выполнить следующие инструкции чтобы включить <customErrors> и перенаправить все ошибки на одну страницу:

1) Откройте файл Web.Config вашего приложения ASP.NET. Если файл не существует, то создайте его в корневой директории приложения.

2) Создайте или измените секцию <customErrors> файла web.config в следующим образом:

<configuration>        

   <system.web>

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

   </system.web>        

</configuration>

3) Затем вы можете добавить файл error.html в ваше приложение, который будет отображать соответствующую html страницу (с любым содержимым). Этот файл будет отображаться всегда, когда будут происходить ошибки в веб приложении.

Замечания: Важно отметить, что customErrors установлино в значение “on”, и все ошибки обрабатываются страницей defaultRedirect. Как вы видите, здесь не определено ни одного статус кода – т.е. нет ни одного элемента <error> внутри секции <customErrors>. Это не дает атакующему понять, почему произошла ошибка на сервере, и скрывает информацию.

Применяем временное решение для ASP.NET 3.5 SP1 и ASP.NET 4.0

Если вы используете ASP.NET 3.5 SP1 или ASP.NET 4.0, то вы должны выполнить следующие инструкции чтобы включить <customErrors> и перенаправить все ошибки на одну страницу:

1) Откройте файл Web.Config вашего приложения ASP.NET. Если файл не существует, то создайте его в корневой директории приложения.

2) Создайте или измените секцию <customErrors> файла web.config в следующим образом (redirectMode=”ResponseRewrite” используется только для .NET 3.5 SP1 and .NET 4.0):

<configuration>

   <system.web>

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

   </system.web>

</configuration>

3) Затем вы можете добавить файл Error.aspx в ваше приложение, который будет отображать соответствующую html страницу (с любым содержимым). Этот файл будет отображаться всегда, когда будут происходить ошибки в веб приложении.

4) Рекомендуется также добавить нижеприведенный код для метода Page_Load() в файл Error.aspx, чтобы создать небольшую случайную задержку. Это еще больше усложнит анализ ошибок.

Версия для C#

Ниже приведена C# версия файла Error.aspx, в котором делается небольшая случайная задежка. Вам не надо компилировать его в виде приложения – вы можете лишь сохранить его в директорию приложения на веб-сервере.

<%@ 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>

Версия для VB

Ниже приведена VB версия файла Error.aspx, в котором делается небольшая случайная задежка. Вам не надо компилировать его в виде приложения – вы можете лишь сохранить его в директорию приложения на веб-сервере.

<%@ 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>

Как проверить, что временное решение работает

После применения данного решения, вы можете проверить его, чтобы убедиться, что секция <customErrors> сконфигурирована правильно. Для этого в адресной строке браузера введите URL для вашего сайта: http://mysite.com/pagethatdoesnotexist.aspx

Если вы увидите настроенную страницу об ошибке (т.к. запрашиваемый файл не существует), значит вы все настроили верно. Если вы увидите стандартную ошибку ASP.NET, то скорее всего вы что-то пропустили из вышесказанного. Для того чтобы узнать больше об ошибке, которая вызвала проблему, вы можете установить <customErrors mode=”RemoteOnly”/>, что позволит вам просматривать сообщения об ошибках при подключении к сайту с локального компьютера.

Заключение

В срочном порядке примениям временное решение на своих сайтах и ждем патч от Microsoft.

 

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

Читайте также: