Обходит ли криптографическая уязвимость ASP.NET БОЛЬШАЯ ЛОЖЬ?

Этот вопрос является своего рода продолжением Насколько серьезна эта новая уязвимость безопасности ASP.NET и как ее исправить? Итак, если мой вопрос кажется неработающим, прочтите сначала этот вопрос и его принятое решение, а затем примите это во внимание. контекст моего вопроса.

Может ли кто-нибудь объяснить, почему важно возвращать одну и ту же страницу с ошибкой и тот же код состояния для пользовательских ошибок? Я считаю, что это несущественно, особенно если это пропагандируется как часть работы над этим.

Разве для сценария / приложения не так просто выполнить эту атаку, не заботясь о том, получит ли он код состояния http и многое другое о результате? То есть, выполняя это 4000 раз, вы перенаправляетесь на страницу с ошибкой, где на 4001 вы остаетесь на той же странице, потому что это не аннулирует заполнение?

Я понимаю, почему добавление задержки на страницу с ошибкой в ​​некоторой степени актуально, но разве это не просто добавление еще одного уровня, чтобы обмануть скрипт, заставив его думать, что сайт является недопустимой целью?

Что можно сделать, чтобы предотвратить это, если сценарий учитывает, что, поскольку сайт является asp.net, он использует шифрование AES, игнорирует время появления страниц с ошибками и отслеживает перенаправление или отсутствие перенаправления в качестве вектора ответа? Если сценарий делает это, это будет означать, что его НЕВОЗМОЖНО остановить?

Изменить: я согласен с сокращением атаки по времени, но часть страницы с ошибкой - это то, что действительно кажется подделкой. Этот вектор атаки помещает их данные в состояние просмотра. Всего 2 случая. Проходят. Потерпеть поражение.

Либо Fail, они находятся на странице, и состояние просмотра не содержит их данных. Независимо от того, что вы здесь делаете, невозможно удалить случай сбоя, потому что страница просто никогда не будет содержать их вставленные данные, если они не взломали ключ. Вот почему я не могу оправдать использование пользовательских ошибок, имеющих КАКОЙ-ЛИБО ВЛИЯНИЕ.

Или Pass, они находятся на странице, а состояние просмотра содержит их вставленные данные.

Краткое изложение этой уязвимости


Берется ключ шифрования из WebResoure.axd / ScriptResource.axd, и первое предположение ключа проверки используется для генерации значения потенциального ключа с зашифрованным текстом.

Это значение передается в WebResource.axd / ScriptResource.axd на этом этапе, если ключ дешифрования был угадан правильно, их ответ будет принят, но, поскольку данные являются мусором, он ищет WebResource.axd / ScriptResource.axd вернет 404 ошибка.

Если ключ дешифрования не удалось угадать, будет выдана ошибка 500 для исключения недопустимого заполнения. На этом этапе приложение атаки знает, что нужно увеличить потенциальное значение ключа дешифрования и повторить попытку, пока не найдет первый успешный 404 из WebResource.axd / ScriptResource.axd.

После успешного вывода ключа дешифрования его можно использовать для взлома сайта, чтобы найти фактический ключ машины.


person Chris Marisic    schedule 23.09.2010    source источник
comment
@Null спасибо за исправление правописания   -  person Chris Marisic    schedule 23.09.2010
comment
см. мой обновленный ответ. Вы смешиваете атаку грубой силы с атакой оракула.   -  person Sripathi Krishnan    schedule 23.09.2010
comment
вроде. В том, что вы только что опубликовали, замените ключ шифрования зашифрованным текстом / сообщением, а ключ проверки - ключом дешифрования. Частично проблема в том, что обработчик не проверяет подпись, а только дешифрует. Все это говорит о том, что если у вас не было этих обработчиков и пользовательские ошибки были отключены, это дает еще больше информации, потому что в стеке указано недопустимое заполнение. Также обратите внимание, что ScriptResource.axd также используется в атаке, и, как я упоминал в своем сообщении в блоге, это тот, который используется для получения файла ... по крайней мере, отражатель показывает это (странно, что обходной путь команды Sharepoint работает только с WebResource. axd)   -  person eglasius    schedule 24.09.2010


Ответы (4)


re:

Как это имеет отношение к тому, перенаправляются ли они на 200, 404 или 500? Никто не может ответить на этот вопрос, это принципиальный вопрос. Вот почему я вызываю махинации с необходимостью проделать эту дурацкую шутку с пользовательскими ошибками, возвращающими 200. Просто нужно вернуть одну и ту же страницу 500 для обеих ошибок.

Я не думаю, что это было ясно из исходного вопроса, я отвечу на него:

кто сказал ошибок нужно возвращать 200? это неправильно, вам просто нужно, чтобы все ошибки возвращали один и тот же код, и все ошибки, возвращающие 500, также будут работать. Конфигурация, предложенная в качестве обходного решения, просто использует 200.

Если вы не сделаете обходной путь (даже если ваша собственная версия всегда возвращает 500), вы увидите различия 404 и 500. Это особенно верно для webresource.axd и scriptresource.axd, поскольку дешифрованные недопустимые данные - это отсутствующий ресурс / 404.

Тот факт, что вы не знаете, в какой функции возникла проблема, не означает, что в asp.net нет функций, которые дают разные коды ответов в разных сценариях, которые относятся к заполнению или недопустимым данным. Лично я не могу быть уверен, есть ли какая-либо другая функция, которая также дает другой код ответа, я просто могу сказать вам, что эти 2 имеют.


Может ли кто-нибудь объяснить, почему важно возвращать одну и ту же страницу с ошибкой и тот же код состояния для пользовательских ошибок? Я считаю, что это несущественно, особенно если это пропагандируется как часть работы над этим.

Шри уже очень четко ответил на этот вопрос в вопросе, который вы связали.

Дело не в том, чтобы скрыть произошедшую ошибку, а в том, чтобы убедиться, что злоумышленник не может различить ошибки. В частности, необходимо убедиться, что злоумышленник не может определить, не удалось ли выполнить запрос, потому что он не может расшифровать / заполнение было недопустимым, или потому что расшифрованные данные были мусором.

Вы можете возразить: хорошо, но я могу убедиться, что это не мусор для приложения. Конечно, но вам нужно будет найти в приложении механизм, который позволит вам это сделать, и способ работы атаки. Всегда нужен хотя бы крошечный кусочек мусора во входящем сообщении. Обратите внимание на это:

  • И ScriptResource, и WebResource выбрасывают, поэтому настраиваемая ошибка скрывает это.
  • Состояние просмотра по умолчанию не зашифровано, поэтому по умолчанию его вектор атаки не задействован. Если у вас возникнут проблемы с включением шифрования, вы, скорее всего, настроите его для подписи / проверки. В этом случае отказ от дешифрования и отказ от проверки одинаковы, поэтому злоумышленник снова не может знать.
  • Аутентификационный билет также подписывается, так что это похоже на сценарий состояния просмотра
  • Сессионные файлы cookie не зашифрованы, поэтому это не имеет значения.

Я разместил в своем блоге насколько далеко заходит атака, например, возможность подделать файлы cookie аутентификации.

Разве для сценария / приложения не так просто выполнить эту атаку, не заботясь о том, получит ли он код состояния http и многое другое о результате? То есть, выполняя это 4000 раз, вы перенаправляетесь на страницу с ошибкой, где на 4001 вы остаетесь на той же странице, потому что это не аннулирует заполнение?

Как упоминалось выше, вам нужно найти механизм, который ведет себя таким образом, то есть расшифрованный мусор остается на той же странице, а не генерирует исключение / и, таким образом, вы попадаете на ту же страницу с ошибкой.

Либо Fail, они находятся на странице, и состояние просмотра не содержит их данных. Независимо от того, что вы здесь делаете, невозможно удалить случай сбоя, потому что страница просто никогда не будет содержать их вставленные данные, если они не взломали ключ. Вот почему я не могу оправдать использование пользовательских ошибок, имеющих КАКОЙ-ЛИБО ВЛИЯНИЕ.

Или Pass, они находятся на странице, а состояние просмотра содержит их вставленные данные.

Прочтите, что я упомянул о состоянии просмотра выше. Также обратите внимание, что возможность более точного повторного шифрования появляется после того, как они получили возможность дешифровать. Тем не менее, как упоминалось выше, по умолчанию состояние просмотра не такое, и когда оно обычно сопровождается подписью / проверкой.

person eglasius    schedule 23.09.2010
comment
Я не думаю, что вы добавили что-либо в эту беседу, кроме как повторить то, что я сказал. о том, чтобы убедиться, что злоумышленник не может определить, не удалось ли выполнить запрос, потому что он не может расшифровать / заполнение было недопустимым, или потому что расшифрованные данные были мусором. Как это имеет отношение к тому, перенаправляются ли они на 200, 404 или 500? Никто не может ответить на этот вопрос, это принципиальный вопрос. Вот почему я вызываю махинации с необходимостью проделать эту дурацкую шутку с пользовательскими ошибками, возвращающими 200. Просто нужно вернуть одну и ту же страницу 500 для обеих ошибок. - person Chris Marisic; 23.09.2010
comment
Теперь это наконец имеет смысл. Насколько мне известно, ни один ресурс, который я читал, не упоминал, что причина, по которой вам нужно отключить определенные настраиваемые страницы ошибок, заключалась в том, чтобы не допустить, чтобы веб-ресурс .axd возвращал ошибку 404 для запроса, который проверяет, но ресурс не существует. - person Chris Marisic; 23.09.2010
comment
Я правильно понял все в своем резюме? Или я поменял местами машинный ключ и ключ проверки? - person Chris Marisic; 24.09.2010

Я собираюсь подробнее рассказать о мой ответ в теме, на которую вы ссылались.

Чтобы отразить атаку, приложение должно отреагировать тремя разными способами. Эти три различных способа могут быть любыми - кодами состояния, разным HTML-контентом, разным временем отклика, перенаправлениями или любым другим творческим способом, который вы можете придумать.

Повторюсь еще раз - злоумышленник должен уметь безошибочно идентифицировать три различных ответа, иначе атака не сработает.

Теперь переходим к предлагаемому решению. Это работает, потому что сокращает три результата до двух. Как оно это делает? На странице общих ошибок все коды состояния / html / redirect выглядят одинаково. Случайная задержка не позволяет отличить одно от другого только по времени.

Так что это не ложь, это работает так, как рекламируется.


РЕДАКТИРОВАТЬ: Вы смешиваете вещи с атакой грубой силы. Всегда будет ответ сервера пройден / не пройден, и вы правы, этого нельзя предотвратить. Но для того, чтобы злоумышленник использовал эту информацию в своих интересах, потребуются десятилетия и миллиарды запросов к вашему серверу.

Обсуждаемая атака позволяет злоумышленнику сократить эти миллиарды запросов до нескольких тысяч. Это возможно благодаря 3 различным состояниям ответа. Предлагаемый обходной путь сводит это обратно к атаке методом перебора, который вряд ли увенчается успехом.

person Sripathi Krishnan    schedule 23.09.2010
comment
Но это не так. Сама страница ошибок, что бы ни случилось, не уменьшает результаты, потому что вы находитесь на странице 1, ошибка возникает на странице 2. Независимо от того, что вы делаете со страницей 2, она ОТЛИЧАЕТСЯ от страницы 1, не имеет значения, насколько подробно вы ее понимаете, все равно тривиально очевидно, что вы находитесь на странице с ошибкой, даже если она возвращает код состояния 200. Даже если вы используете серверную передачу, чтобы избежать истинного прямого доступа, содержимое страницы 2 полностью отличается от страницы 1, как это в любом случае имеет значение, является ли содержимое 200, 404 или 500? - person Chris Marisic; 23.09.2010
comment
@Chris - Результат 1: Нет ошибки, вы остаетесь на странице 1. Результат 2: Произошла ошибка приложения, вы находитесь на странице 2. Результат 3: Произошла криптографическая ошибка, вы снова на стр. 2. С точки зрения злоумышленника, он видит либо страницу 1, либо страницу 2. Третьего выхода нет, поэтому ваше приложение безопасно. - person Sripathi Krishnan; 23.09.2010
comment
Результат 3 не является проблемой, если сценарий пытается взломать состояние представления, имеет смысл всегда предполагать, что если я не получу результат 1, независимо от того, что просто попробуйте еще раз. И останавливаться только после нескольких сотен тысяч или миллионов попыток сдаться или некоторого временного фактора. - person Chris Marisic; 23.09.2010
comment
@Chris: Но для того, чтобы повторить попытку, потребуются миллионы и миллионы попыток грубой силы. Возможность различать исход 2 и исход 3, по-видимому, позволяет злоумышленнику сократить невозможную атаку до нескольких (десятков?) Тысяч целенаправленных попыток. - person LukeH; 23.09.2010
comment
@Chris - То, что вы описываете, является атакой грубой силы, и потребуются годы / десятилетия и миллиарды запросов, чтобы действительно достичь результата 1. Атака, которую все обсуждают, не является грубой силой. Требуется несколько тысяч запросов для точного дешифрования состояния представления, а затем еще несколько тысяч запросов для шифрования любых данных. Мы говорим о 30 минутах против нескольких десятилетий. БОЛЬШАЯ разница. - person Sripathi Krishnan; 23.09.2010
comment
Затем то, что вы заявляете, еще раз подтверждает мои утверждения о том, что скрытие ошибки 500 с помощью кода состояния 200 не имеет значения, потому что это все еще не позволяет злоумышленнику конкретно узнать, что это криптографическая ошибка. Я по-прежнему говорю, что это не проблема, потому что они ЗНАЮТ, что это 99,99% вероятности криптографической ошибки. - person Chris Marisic; 23.09.2010
comment
Я никогда ничего не говорил о сокрытии ошибки 500 с помощью 200. На самом деле речь идет о сокращении 3 различных результатов до 2 отдельных результатов. Я не понимаю вашего беспокойства. - person Sripathi Krishnan; 23.09.2010
comment
Блог Скотта Гу вместе с исходным вопросом о stackoverflow, который породил мой вопрос, все говорят, что вам нужно отключить все настраиваемые варианты ошибок, чтобы не больше 401, 403, 404, 500 и т. Д., И заменить их все определенной общей страницей ошибок, а затем исправить это, чтобы вернуть код состояния 200 вместо кода ошибки. - person Chris Marisic; 23.09.2010
comment
В блоге Скотта Гу говорится always return the same error page. Это не говорит о том, что страница ошибки всегда должна возвращать код состояния 200; он может вернуть 500 за все, что вам небезразлично. Пока вы гарантируете, что страница с ошибкой демонстрирует последовательное поведение независимо от исключения, все в порядке. - person Sripathi Krishnan; 23.09.2010
comment
обновил свой ответ, прежде чем увидеть это. Полностью согласен с Шри в этом. Чтобы очистить его, они сказали, что всегда возвращают одну и ту же страницу с ошибкой и тот же код состояния, когда происходит ошибка. Код статуса не обязательно должен быть 200, так оно и было. - person eglasius; 23.09.2010

Обходной путь работает, потому что:

  • Вы не даете никаких указаний на то, "как далеко" вас занесло немного скорректированное. Если вы получите другое сообщение об ошибке, это информация, из которой вы можете извлечь пользу.
  • С задержкой вы скрываете, сколько времени занял фактический расчет. Таким образом, вы не получаете информации, которая показывает, если вы углубились в систему, из которой вы можете извлечь уроки.
person GvS    schedule 23.09.2010
comment
Теперь я могу согласиться с обоснованием времени, поскольку вы используете его, чтобы скрыть, получаете ли вы законную ошибку приложения, потому что приложение ожидало чего-то еще в viewstate и получило исключение приведения или исключение формата и т. Д. - person Chris Marisic; 23.09.2010

Нет, это не большая ложь. См. этот ответ в вопросе, на который вы указали хорошее объяснение.

person Wyatt Barnett    schedule 23.09.2010
comment
Это придает вес ответу GvS, однако это не оправдывает, почему наличие пользовательских 404, 500, возвращающих правильные коды состояния, что-то значит. - person Chris Marisic; 23.09.2010
comment
Скоро будет DV, если не будет добавлена ​​дополнительная информация, поскольку это просто дублирует ответ GvS, и без утверждений GvS делает ответ, который вы ссылаетесь, не подразумевает того, что GvS сказал гораздо более четко. - person Chris Marisic; 23.09.2010