
Комментарии 12
Статья не только про взлом. Не все админы знают по это. В последней компании у меня после увольнения остался доступ в мессенджер как минимум до перезагрузки компьютера.
У большинства сервисов есть отдельная кнопка «выйти со всех устройств», и вот она как раз делает то, чего от смены пароля ждут.
Странно. Лет 15 назад при смене пароля автоматом протухали активные сессии на всех сервисах, где я пробовал менять пароль — всякие почты, соцсети, просто сайты и прочая фигня. Поменял пароль с одной машины — на второй машине логинься заново. Исключений даже не вспомню, за исключением совсем трэша (где и пароль на почту присылали).
Интересно, что с тех пор изменилось и зачем?
Раньше сессии хранили на сервере — меняешь пароль, сервер их чистит. Сейчас сессии — это токены на устройствах, сервер их не хранит и про них не знает (он хранит секретный ключ, которым эти токены подписывает). Смена пароля даёт новый ключ, а старые токены продолжают работать, пока не протухнут. Так сделали, потому что иначе серверы не вывезли бы нагрузку. Поэтому сейчас нужна кнопка «выйти везде» — это ручной принудительный сброс.
Спасибо,так понятнее.
Поэтому сейчас нужна кнопка «выйти везде» — это ручной принудительный сброс.
Сброс чего?
Из этого следует, что серверу всё равно надо куда-то сходить, чтобы узнать о факте сброса, что в итоге создаст примерно ту же самую нагрузку, что и старые сессии
Кнопка «выйти везде» — это сброс доверия к конкретному токену.
Технически это выглядит так:
Сервер заводит чёрный список (или увеличивает счётчик версии токенов) для этого пользователя.
При каждом следующем запросе сервер теперь обязан проверить: а не в этом ли чёрном списке токен.
Опять же, все зависит от реализации конкретного сервиса, но из того с чем я сталкивался - там было так
Сервер заводит чёрный список
Ну и чем это отличается от заведения списка старых обычных сессий?
Разница в том, что:
При обычной работе (когда кнопку не нажимают) нагрузка минимальна — сервер просто проверяет подпись, без обращения к БД.
При сбросе нагрузка вырастает, но это редкое событие (в этом случае, да, нагрузка как и в старых реализациях).
Ну так а откуда сервер узнает, что для данного конкретного токена нажата кнопка сброса, если кроме проверки подписи он больше ничего не делает?
Зависит от конкретной реализации на сервере. Но как вариант:
Сервер хранит у себя счётчик версий (например, token_version) для каждого пользователя в базе данных.
При выдаче токена он записывает туда текущую версию (v1).
При нажатии «выйти везде» он просто увеличивает счётчик до v2.
При каждом запросе сервер делает одну очень лёгкую операцию: читает из БД (или кэша) текущую версию для этого пользователя и сравнивает с версией, зашитой в токен.
Вы сменили пароль, а он всё ещё внутри: что остаётся у атакующего после «я всё поменял»