Заобикалянето на криптографската уязвимост на ASP.NET ГОЛЯМА ЛЪЖА ли е?

Този въпрос е донякъде продължение на Колко сериозна е тази нова уязвимост на сигурността на ASP.NET и как мога да я заобиколя? Така че, ако изглежда, че въпросът ми е повреден, първо прочетете този въпрос и неговото прието решение и след това вземете това в контекста на моя въпрос.

Може ли някой да обясни защо връщането на същата страница за грешка и същия код на състояние за персонализирани грешки има значение? Намирам това за несъществено, особено ако това се препоръчва като част от работата по него.

Не е ли също толкова лесно за скрипта/приложението да изпълни тази атака и да не се интересува дали ще получи или не http статус код и повече за резултата? Т.е. правейки това 4000 пъти, вие ще бъдете пренасочени към страница за грешка, където на 4001 оставате на същата страница, защото не е обезсилила подложката?

Разбирам защо добавянето на забавянето към страницата за грешка е донякъде уместно, но не добавя ли това също още един слой, за да заблуди скрипта да мисли, че сайтът е невалидна цел?

Какво може да се направи, за да се предотврати това, ако скриптът вземе предвид, че тъй като сайтът е asp.net, той работи с AES криптиране, че игнорира времето на страниците с грешки и наблюдава пренасочването или липсата на пренасочване като вектор на отговор? Ако даден скрипт прави това, това ще означава ли, че НЯМА НАЧИН да го спрете?

Редактиране: Приемам намаляването на тайминг атаката, но частта от страницата с грешки е това, което наистина изглежда фалшиво. Този вектор на атака поставя техните данни в състояние на изглед. Има само 2 случая. Пас. Неуспех.

Или Fail, те са на страница и viewstate не съдържа техните данни. Без значение какво правите тук, няма начин да премахнете случая на грешка, защото страницата просто никога няма да съдържа техните вмъкнати данни, освен ако те успешно не са разбили ключа. Ето защо не мога да обоснова, че използването на персонализирани грешки има ИЗОБЩО НИКАКЪВ ЕФЕКТ.

Или Pass, те са на страница и viewstate съдържа техните вмъкнати данни.

Резюме на тази уязвимост


Ключът за шифроване от 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 го правят.


Може ли някой да обясни защо връщането на същата страница за грешка и същия код на състояние за персонализирани грешки има значение? Намирам това за несъществено, особено ако това се препоръчва като част от работата по него.

Шри вече отговори много ясно на това във въпроса, към който поставихте връзка.

Не става въпрос за скриване на възникнала грешка, а за гарантиране, че нападателят не може да различи грешките. По-конкретно става дума за гарантиране, че атакуващият не може да определи дали заявката е неуспешна, защото не може да декриптира /padding е невалиден, или защото декриптираните данни са боклук.

Можете да спорите: добре, но мога да се уверя, че това не е боклук за приложението. Разбира се, но ще трябва да намерите механизъм в приложението, който ви позволява да направите това, и начинът, по който работи атаката, вие Винаги се нуждаете от поне малко боклук във входящото съобщение. Помислете за тези:

  • ScriptResource и WebResource хвърлят, така че персонализираната грешка я скрива.
  • Състоянието на изглед по подразбиране е Нешифровано, така че по подразбиране не включва вектора на атака. Ако имате проблеми с включването на криптирането, тогава много вероятно сте го настроили да го подпише/валидира. Когато случаят е такъв, неуспехът при дешифриране и неуспехът при валидиране е един и същ, така че атакуващият отново не може да знае.
  • Билетът за удостоверяване също се подписва, така че е като сценария за състояние на преглед
  • Сесийните бисквитки не са криптирани, така че са без значение

Публикувах в моя блог как атаката стига толкова далеч, че може да фалшифицира бисквитки за удостоверяване.

Не е ли също толкова лесно за скрипта/приложението да изпълни тази атака и да не се интересува дали ще получи или не http статус код и повече за резултата? Т.е. правейки това 4000 пъти, вие ще бъдете пренасочени към страница за грешка, където на 4001 оставате на същата страница, защото не е обезсилила подложката?

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

Или Fail, те са на страница и viewstate не съдържа техните данни. Без значение какво правите тук, няма начин да премахнете случая на неуспех, защото страницата просто никога няма да съдържа техните вмъкнати данни, освен ако те успешно не са разбили ключа. Ето защо не мога да обоснова, че използването на персонализирани грешки има ИЗОБЩО НИКАКЪВ ЕФЕКТ.

Или Pass, те са на страница и viewstate съдържа техните вмъкнати данни.

Прочетете какво споменах за състоянието на изгледа по-горе. Също така имайте предвид, че способността за по-точно повторно криптиране се придобива, след като те придобият способността да декриптират. Въпреки това, както бе споменато по-горе, по подразбиране състоянието на изглед не е по този начин и когато е включено, обикновено се придружава от подпис/потвърждение.

person eglasius    schedule 23.09.2010
comment
Не мисля, че сте добавили нищо към тази тема, освен да повторите това, което казах. относно това да се уверите, че атакуващият не може да определи дали заявката е неуспешна, защото не може да декриптира /padding е невалиден, срещу защото декриптираните данни са боклук. Как това има отношение към това дали са пренасочени към 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/пренасочване да изглеждат идентични. Случайното забавяне прави невъзможно разграничаването между едното или другото само въз основа на времето.

Така че не е лъжа, работи както се рекламира.


РЕДАКТИРАНЕ: Смесвате нещата с грубата атака. Винаги ще има отговор за преминаване/неуспех от сървъра и сте прав, че не може да бъде предотвратено. Но за да може нападател да използва тази информация в своя полза, ще са необходими десетилетия и милиарди заявки към вашия сървър.

Атаката, която се обсъжда, позволява на атакуващия да намали тези милиарди заявки до няколко хиляди. Това е възможно поради 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
актуализирах отговора си, преди да видя това. Напълно съгласен с sri по този въпрос. За да го изчистят допълнително, те казаха, че винаги връща една и съща страница за грешка и същия код на състоянието, когато възникне грешка. Не е необходимо кодът на състоянието да е 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