О вреде синглтонов (на этот раз, про безопасность)
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 09.05.12 19:16
Оценка: +1 :)
Только что, раскрутил просто изумительный баг в одном ASP.NET-приложении. Он крайне интересен с т.з. безопасности тем, какие возможности открывает атакующему, а противникам синглтона возможно будет интересен, как еще один аргумент против их использования где ни попадя. Хотел закинуть как этюд в ИБ, но чувствую, что с подобной спецификой вряд ли кто-либо сталкивался.

Данное приложение взаимодейстует с моделью через единый класс ModelManager, обеспечивающий доступ ко всем сущностям (по сути activerecord'ам) модели. Часть записей, из соображений быстродействия, дублируется в состоянии сеанса, чтобы лишний раз не ходить в базу, а взять данные прямо из памяти (модель обработки сесиий InProc, приложение явно не высоконагруженное, зачем это так реализовали — лично для меня загадка). Несколькими из таких записей, являются данные профиля текущего пользователя, в частности, его почтовый адрес (на который, помимо прочего, происходит сброс пользовательского пароля). ModelManager реализован в виде синглтона, соответственно обращение к отдельным таблицам происходит через их разыменование посредством дерганья его статического поля Instance.

Проблема в том, что и в состояние сеанса эти записи сохраняются именно так: как то, что возвращается при обращении к некоему статическому полю. В этом случае (по крайней мере, при модели обработки сессий InProc) ASP.NET шарит значения всех полей статичных классов между всеми имеющимися на данный момент сессиями. Иными словами, если пользователь меняет себе почтовый адрес и не дает после этого своей сессии умереть (периодически отправляя какие-либо запросы, например повторные, на смену почтового адреса), то при сбросе пароля другим пользователем, его новое значение уйдет по адресу первого пользователя, а не того, кто реально сбрасывал пароль.

По-моему, это просто здорово

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.