Обновить

Вы сменили пароль, а он всё ещё внутри: что остаётся у атакующего после «я всё поменял»

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели7.2K
Всего голосов 7: ↑7 и ↓0+10
Комментарии12

Комментарии 12

Статья не только про взлом. Не все админы знают по это. В последней компании у меня после увольнения остался доступ в мессенджер как минимум до перезагрузки компьютера.

У большинства сервисов есть отдельная кнопка «выйти со всех устройств», и вот она как раз делает то, чего от смены пароля ждут.

Странно. Лет 15 назад при смене пароля автоматом протухали активные сессии на всех сервисах, где я пробовал менять пароль — всякие почты, соцсети, просто сайты и прочая фигня. Поменял пароль с одной машины — на второй машине логинься заново. Исключений даже не вспомню, за исключением совсем трэша (где и пароль на почту присылали).

Интересно, что с тех пор изменилось и зачем?

Раньше сессии хранили на сервере — меняешь пароль, сервер их чистит. Сейчас сессии — это токены на устройствах, сервер их не хранит и про них не знает (он хранит секретный ключ, которым эти токены подписывает). Смена пароля даёт новый ключ, а старые токены продолжают работать, пока не протухнут. Так сделали, потому что иначе серверы не вывезли бы нагрузку. Поэтому сейчас нужна кнопка «выйти везде» — это ручной принудительный сброс.

Спасибо,так понятнее.

Поэтому сейчас нужна кнопка «выйти везде» — это ручной принудительный сброс.

Сброс чего?

Из этого следует, что серверу всё равно надо куда-то сходить, чтобы узнать о факте сброса, что в итоге создаст примерно ту же самую нагрузку, что и старые сессии

Кнопка «выйти везде» — это сброс доверия к конкретному токену.

Технически это выглядит так:

  • Сервер заводит чёрный список (или увеличивает счётчик версии токенов) для этого пользователя.

  • При каждом следующем запросе сервер теперь обязан проверить: а не в этом ли чёрном списке токен.

Опять же, все зависит от реализации конкретного сервиса, но из того с чем я сталкивался - там было так

Сервер заводит чёрный список

Ну и чем это отличается от заведения списка старых обычных сессий?

Разница в том, что:

  • При обычной работе (когда кнопку не нажимают) нагрузка минимальна — сервер просто проверяет подпись, без обращения к БД.

  • При сбросе нагрузка вырастает, но это редкое событие (в этом случае, да, нагрузка как и в старых реализациях).

Ну так а откуда сервер узнает, что для данного конкретного токена нажата кнопка сброса, если кроме проверки подписи он больше ничего не делает?

Зависит от конкретной реализации на сервере. Но как вариант:

  • Сервер хранит у себя счётчик версий (например, token_version) для каждого пользователя в базе данных.

  • При выдаче токена он записывает туда текущую версию (v1).

  • При нажатии «выйти везде» он просто увеличивает счётчик до v2.

  • При каждом запросе сервер делает одну очень лёгкую операцию: читает из БД (или кэша) текущую версию для этого пользователя и сравнивает с версией, зашитой в токен.

Ну и чем это легче, чем чтение из БД (или кэша) обычной старой сессии?

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации