Лазейка безопасности при смене пароля с помощью .NET FormsAuthentication и постоянных файлов cookie?

Хорошо, вот сценарий:

  1. Боб входит в систему mysite.com, которая использует аутентификацию с помощью форм .NET, и ставит галочку «запомнить меня».
  2. Ева крадет ноутбук Боба.
  3. Боб получает новый ноутбук и меняет свой пароль.

На данный момент у Евы есть украденный ноутбук, на котором хранится постоянный файл cookie, который позволит ей войти на mysite.com как Боб — и, насколько я могу судить, это сработает даже после того, как Боб сменил свой пароль.

По умолчанию файл cookie для проверки подлинности с помощью форм не содержит пароль Боба (независимо от того, является ли он открытым текстом, хэширован или зашифрован каким-либо иным образом), поэтому пароль Боба вообще не участвует в процессе проверки подлинности файлов cookie, и это же имя пользователя, которое работало на прошлой неделе будет работать и сегодня.

Это достаточно простая лазейка, которую можно обойти — просто установив FormsAuthentication.SetAuthCookie("username:passwordHash") или что-то еще, а затем расшифровав и разделив файл cookie в обработчике аутентификации, — но я не могу поверить, что эта проблема существует «из-за коробка '... я что-то пропустил?

РЕДАКТИРОВАТЬ: Обратите внимание, что здесь я предполагаю, что цель кнопки «запомнить меня» состоит в том, чтобы избавить вас от необходимости вводить пароль каждый раз, когда вы посещаете веб-сайт.Это работает на Facebook, Twitter, Gmail и практически на любом другом веб-сайте, о котором я могу думать, и я был бы очень удивлен, если бы это не было целью параметра «постоянный файл cookie» в .NET FormsAuthentication.

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

РЕДАКТИРОВАТЬ 2: Похоже, что по крайней мере один крупный сайт .NET — CodePlex.com — уязвим для этого; см. http://codeplex.codeplex.com/discussions/350646

14
задан Dylan Beattie 30 March 2012 в 14:14
поделиться