Несколько часов назад мы выпустили рекомендации по безопасности в ASP.NET (Microsoft Security Advisory). Эта уязвимость существует во всех версиях ASP.NET.
Эта уязвимость была публично раскрыта вечером в пятницу на конференции по безопасности. Мы рекомендуем все клиентам использующим ASP.NET немедленно применить временное решение (описанное ниже) для предотвращения атак с ее использованием.
Чем опасна уязвимость?
При помощи этой уязвимости злоумышленник может запрашивать и загружать с сервера файлы входящие в приложение ASP.NET такие как web.config (который часто содержит секретные данные).
Злоумышленник при помощи эксплуатации этой уязвимости может также расшифровать данные посланные клиенту в зашифрованном состоянии (такие как данные ViewState на странице).
Как работает уязвимость
Чтобы понять как работает уязвимость, вы должны иметь представление о криптографических оракулах. Оракул в контексте криптографии это система которая предоставляет подсказки в ответ на вопросы которые вы ей задаете. В данном случае уязвимость которая присутствует в ASP.NET и действует как оракул. Это позволяет атакующему посылать шифрованный текст веб-серверу и выяснять, правильно ли он расшифрован путем исследования кодов ошибок возвращаемых сервером. Выполнив много подобных запросов (и наблюдая какие ошибки возвращаются) злоумышленник может получить достаточно информации для того чтобы расшифровать остальной зашифрованный текст.
Как закрыть уязвимость
Временное решение которое вы можете использовать для закрытия этой уязвимость состоит во включении опции ASP.NET и явной конфигурации ваших приложений таким образом, чтобы они всегда возвращали одинаковую страницу ошибки в не зависимости от того какая ошибка на самом деле произошла на сервере. Переадресовав все страницы ошибок на единую страницу ошибок вы не дадите хакеру возможности отличать различные типы ошибок возникающих на сервере.
Важно: Недостаточно просто включить опцию CustomErrors и установить ее атрибут RemoteOnly в значение true. Вам также нужно убедится что все ошибки сконфигурированы возвращать одну и туже страницу. Вам нужно явно установить атрибут «defaultRedirect» секции <customErrors> и убедиться что не установлены постатусные коды.
Временное решение на ASP.NET с V1.0 по V3.5
Если вы используете ASP.NET 1.0, ASP.NET 1.1, ASP.NET 2.0 или ASP.NET 3.5 тогда вы должны выполнить следующие шаги для включения и адресации всех ошибок на одну и туже страницу ошибки:
1) Отредактируйте файл Web.Config в корневом каталоге вашего приложения ASP.NET. Если файл не существует, создайте его в корневом каталоге приложения.
2) Создайте или отредактируйте в файле web.config секцию чтобы ее установки были такими как указано ниже:
3) Затем вы можете добавить в ваше приложение файл error.html который содержит страницу ошибки соответствующего внешнего вида. Этот файл будет отображаться каждый раз когда происходит ошибка в веб-приложении.
Замечания: Вот, что нужно отметить в примере приведенном выше, что customErrors установлено в значение «on», а все ошибки обрабатываются страницей ошибок указанной в атрибуте «defaultRedirect». Что также не определено постатусных страниц ошибок — это можно проверить убедившись в отсутствии элементов <error> внутри секции <code><customErrors></code>. Выполнение этих условий не позволит злоумышленнику различать ошибки когда они происходят на сервере и предотвратит раскрытие информации.
Временное решение на ASP.NET V3.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 file так, чтобы в итоге у вас было следующее содержимое. Обратите внимание на использование redirectMode=«ResponseRewrite» в .NET 3.5 SP1 и .NET 4.0:
3) Вы можете вы можете добавить в ваше приложение Error.aspx который содержит страницу ошибки соответствующего внешнего вида. Этот файл будет отображаться каждый раз когда происходит ошибка в веб-приложении.
4) Мы рекомендуем добавить следующий код в обработчик северного события Page_Load() в файле Error.aspx, чтобы добавить небольшую случайную маленькую задержку. Это поможет в дальнейшей обфускации ошибок.
Версия для VB
Ниже представлена версия файла Error.aspx для VB, которую вы можете использовать и которая имеет небольшую случайную задержку. Вам не нужно компилировать этот код в приложении, опционально вы можете просто сохранить файл Error.aspx в директории приложения на веб-сервере:
Версия для C#
Ниже приведена версия файла Error.aspx для C# которую вы можете использовать и которая имеет небольшую случайную задержку. Вам не нужно компилировать этот код в приложении, опционально вы можете просто сохранить файл Error.aspx в директории приложения на веб-сервере:
Как проверить, что временное решение работает
После того как вы применили указанное выше временное решение вы можете проверить что секция <customErrors> корректно сконфигурирован запросив URL подобный этому с вашего сайта: mysite.com/pagethatdoesnotexist.aspx
If you see the custom error page appear (because the file you requested doesn’t exist) then your configuration should be setup correctly. If you see a standard ASP.NET error then it is likely that you missed one of the steps above. To see more information about what might be the cause of the problem, you can try setting <customErrors mode=”remoteOnly”/> – which will enable you to see the error message if you are connecting to the site from a local browser.
Как найти уязвимые приложения ASP.NET на сервевре
Мы опубликовали сценарий .vbs, который вы можете сохранить и запустить на вашем веб-сервере чтобы определить есть ли установленные приложения ASP.NET у которых отключена секция или которые различают сообщения об ошибке по коду статуса.
Вы можете загрузить сценарий .vbs отсюда. Просто скопируйте/вставьте сценарий в текстовый файл с именем «DetectCustomErrors.vbs» и сохраните его на диск. Затем откройте окно с командной строкой которое выполняется с правами администратора и выполните «cscript DetectCustomErrors.vbs», чтобы выполнить этот сценарий на локальном веб-сервере. Он просмотрит все приложения на веб-сервере и проверит указана ли корректная конфигурация <customErrors>.
Сценарий отметит каждое приложение, у которого будет найдено, что файл web.config не имеет секции <customErrors> (в таком случае вам нужно добавить ее) или она не настроена правильно, чтобы предлагать временное решение для выключения уязвимости (в таком случае вам нужно обновить ее). Сценарий будет выводить «ok» для файла web.config каждого приложения который будет определен как правильно настроенный. Надеемся, что это облегчить поиск источников ошибок.
Замечание: Мы разработали этот определяющий сценарий в течении нескольких последних часов и будем улучшать его дальше в будущем. Я буду обновлять этот раздел каждый раз, когда мы будем вносить в него изменения.
Как найти больше информации об этой уязвимости
Вы можете узнать больше об этой уязвимости из следующих источников:
Форум для вопросов
Мы настроили отдельный форум на сайте www.asp.net, для того чтобы помочь ответить на вопросы об этой уязвимости.
Публикуйте вопросы здесь, чтобы их задать и получить помощь по уязвимости.
Выводы
Мы будем публиковать больше деталей как будем узнавать больше, и также выпустим заплатку которую можно будет использовать для исправления самой причины проблемы (и больше не использовать указанное выше временное решение).
До этого момента, пожалуйста применяйте временное решение указанное выше ко всем вашим приложениям ASP.NET, чтобы избежать эксплуатации уязвимости злоумышленниками.
Спасибо,
Скотт
Эта уязвимость была публично раскрыта вечером в пятницу на конференции по безопасности. Мы рекомендуем все клиентам использующим ASP.NET немедленно применить временное решение (описанное ниже) для предотвращения атак с ее использованием.
Чем опасна уязвимость?
При помощи этой уязвимости злоумышленник может запрашивать и загружать с сервера файлы входящие в приложение ASP.NET такие как web.config (который часто содержит секретные данные).
Злоумышленник при помощи эксплуатации этой уязвимости может также расшифровать данные посланные клиенту в зашифрованном состоянии (такие как данные ViewState на странице).
Как работает уязвимость
Чтобы понять как работает уязвимость, вы должны иметь представление о криптографических оракулах. Оракул в контексте криптографии это система которая предоставляет подсказки в ответ на вопросы которые вы ей задаете. В данном случае уязвимость которая присутствует в ASP.NET и действует как оракул. Это позволяет атакующему посылать шифрованный текст веб-серверу и выяснять, правильно ли он расшифрован путем исследования кодов ошибок возвращаемых сервером. Выполнив много подобных запросов (и наблюдая какие ошибки возвращаются) злоумышленник может получить достаточно информации для того чтобы расшифровать остальной зашифрованный текст.
Как закрыть уязвимость
Временное решение которое вы можете использовать для закрытия этой уязвимость состоит во включении опции ASP.NET и явной конфигурации ваших приложений таким образом, чтобы они всегда возвращали одинаковую страницу ошибки в не зависимости от того какая ошибка на самом деле произошла на сервере. Переадресовав все страницы ошибок на единую страницу ошибок вы не дадите хакеру возможности отличать различные типы ошибок возникающих на сервере.
Важно: Недостаточно просто включить опцию CustomErrors и установить ее атрибут RemoteOnly в значение true. Вам также нужно убедится что все ошибки сконфигурированы возвращать одну и туже страницу. Вам нужно явно установить атрибут «defaultRedirect» секции <customErrors> и убедиться что не установлены постатусные коды.
Временное решение на ASP.NET с V1.0 по V3.5
Если вы используете ASP.NET 1.0, ASP.NET 1.1, ASP.NET 2.0 или ASP.NET 3.5 тогда вы должны выполнить следующие шаги для включения и адресации всех ошибок на одну и туже страницу ошибки:
1) Отредактируйте файл Web.Config в корневом каталоге вашего приложения ASP.NET. Если файл не существует, создайте его в корневом каталоге приложения.
2) Создайте или отредактируйте в файле web.config секцию чтобы ее установки были такими как указано ниже:
<configuration>
<system.web>
<customErrors mode="On" defaultRedirect="~/error.html" />
</system.web>
</configuration>
* This source code was highlighted with Source Code Highlighter.
3) Затем вы можете добавить в ваше приложение файл error.html который содержит страницу ошибки соответствующего внешнего вида. Этот файл будет отображаться каждый раз когда происходит ошибка в веб-приложении.
Замечания: Вот, что нужно отметить в примере приведенном выше, что customErrors установлено в значение «on», а все ошибки обрабатываются страницей ошибок указанной в атрибуте «defaultRedirect». Что также не определено постатусных страниц ошибок — это можно проверить убедившись в отсутствии элементов <error> внутри секции <code><customErrors></code>. Выполнение этих условий не позволит злоумышленнику различать ошибки когда они происходят на сервере и предотвратит раскрытие информации.
Временное решение на ASP.NET V3.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 file так, чтобы в итоге у вас было следующее содержимое. Обратите внимание на использование redirectMode=«ResponseRewrite» в .NET 3.5 SP1 и .NET 4.0:
<configuration>
<system.web>
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/error.aspx" />
</system.web>
</configuration>
* This source code was highlighted with Source Code Highlighter.
3) Вы можете вы можете добавить в ваше приложение Error.aspx который содержит страницу ошибки соответствующего внешнего вида. Этот файл будет отображаться каждый раз когда происходит ошибка в веб-приложении.
4) Мы рекомендуем добавить следующий код в обработчик северного события Page_Load() в файле Error.aspx, чтобы добавить небольшую случайную маленькую задержку. Это поможет в дальнейшей обфускации ошибок.
Версия для VB
Ниже представлена версия файла Error.aspx для 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>
* This source code was highlighted with Source Code Highlighter.
Версия для C#
Ниже приведена версия файла Error.aspx для 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>
* This source code was highlighted with Source Code Highlighter.
Как проверить, что временное решение работает
После того как вы применили указанное выше временное решение вы можете проверить что секция <customErrors> корректно сконфигурирован запросив URL подобный этому с вашего сайта: mysite.com/pagethatdoesnotexist.aspx
If you see the custom error page appear (because the file you requested doesn’t exist) then your configuration should be setup correctly. If you see a standard ASP.NET error then it is likely that you missed one of the steps above. To see more information about what might be the cause of the problem, you can try setting <customErrors mode=”remoteOnly”/> – which will enable you to see the error message if you are connecting to the site from a local browser.
Как найти уязвимые приложения ASP.NET на сервевре
Мы опубликовали сценарий .vbs, который вы можете сохранить и запустить на вашем веб-сервере чтобы определить есть ли установленные приложения ASP.NET у которых отключена секция или которые различают сообщения об ошибке по коду статуса.
Вы можете загрузить сценарий .vbs отсюда. Просто скопируйте/вставьте сценарий в текстовый файл с именем «DetectCustomErrors.vbs» и сохраните его на диск. Затем откройте окно с командной строкой которое выполняется с правами администратора и выполните «cscript DetectCustomErrors.vbs», чтобы выполнить этот сценарий на локальном веб-сервере. Он просмотрит все приложения на веб-сервере и проверит указана ли корректная конфигурация <customErrors>.
Сценарий отметит каждое приложение, у которого будет найдено, что файл web.config не имеет секции <customErrors> (в таком случае вам нужно добавить ее) или она не настроена правильно, чтобы предлагать временное решение для выключения уязвимости (в таком случае вам нужно обновить ее). Сценарий будет выводить «ok» для файла web.config каждого приложения который будет определен как правильно настроенный. Надеемся, что это облегчить поиск источников ошибок.
Замечание: Мы разработали этот определяющий сценарий в течении нескольких последних часов и будем улучшать его дальше в будущем. Я буду обновлять этот раздел каждый раз, когда мы будем вносить в него изменения.
Как найти больше информации об этой уязвимости
Вы можете узнать больше об этой уязвимости из следующих источников:
- Microsoft Security Advisory 2416728
- Understanding the ASP.NET Vulnerability
- Microsoft Security Response Center Blog Post
Форум для вопросов
Мы настроили отдельный форум на сайте www.asp.net, для того чтобы помочь ответить на вопросы об этой уязвимости.
Публикуйте вопросы здесь, чтобы их задать и получить помощь по уязвимости.
Выводы
Мы будем публиковать больше деталей как будем узнавать больше, и также выпустим заплатку которую можно будет использовать для исправления самой причины проблемы (и больше не использовать указанное выше временное решение).
До этого момента, пожалуйста применяйте временное решение указанное выше ко всем вашим приложениям ASP.NET, чтобы избежать эксплуатации уязвимости злоумышленниками.
Спасибо,
Скотт