Знакомая последовательность: человек понимает, что в его почту кто-то залез, меняет пароль, включает двухфакторную аутентификацию, выдыхает. Через неделю выясняется, что письма всё это время читали, а часть из них уходила на сторону.

Причина не в том, что пароль опять подобрали. Причина в том, что пароль — это способ получить доступ, а не способ его удерживать. Тот, кто уже был внутри, к моменту вашей смены пароля обычно держится за что-то другое: за живую сессию, за выданный приложению токен, за правило пересылки, за отдельный пароль для почтового клиента. Смена пароля по всем этим вещам не бьёт вообще или бьёт с большой задержкой.

Разберу, что именно остаётся, как это найти в основных сервисах и в каком порядке всё делать.

Почему пароль не выгоняет

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

Отсюда простое следствие, которое почему-то не очевидно почти никому: смена пароля отзывает не пропуска, а только возможность выписать новый. Уже выписанные продолжают работать ровно столько, сколько им отмерено.

Сколько именно — зависит от сервиса. Сессионная кука в браузере может жить неделями. Токен обновления в почтовом клиенте — месяцами, и он тихо продлевает сам себя при каждом обращении. Пароль приложения, выданный для старого почтового клиента, не истекает вовсе.

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

Что конкретно остаётся

Активные сессии. Браузер, в котором злоумышленник уже вошёл. Если он утащил не пароль, а куку — а это ровно то, что делают программы для кражи данных из браузера, — пароль он может и не знать вообще. Ему это не мешает.

Токены приложений. Все эти «войти через…» и «разрешить приложению доступ к почте». Приложение получает право читать вашу почту от вашего имени и продолжает им пользоваться после смены пароля. Атакующий, попав в аккаунт, часто первым делом выдаёт такое разрешение своему приложению — это самый удобный способ остаться.

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

Правила в почте. Автоматическая пересылка всех входящих на сторонний адрес либо правило, которое прячет письма от определённого отправителя в архив. Второе — классика при мошенничестве с платежами: жертва не видит ответов, пока идёт переписка про смену реквизитов.

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

Делегирование. В почтовых сервисах есть штатная возможность дать другому человеку читать вашу почту. Выданный доступ смены пароля не замечает.

Из этого списка люди обычно проверяют одно — правила пересылки. Остальное живёт годами.

Где смотреть: личные аккаунты

Google. Три страницы, по которым надо пройтись подряд:

  • myaccount.google.com/device-activity — устройства с активными сессиями.

  • myaccount.google.com/permissions — сторонние приложения и то, к чему у них доступ.

  • myaccount.google.com/apppasswords — пароли приложений, если они когда-либо создавались.

В самом Gmail нужны три вкладки настроек. «Пересылка и POP/IMAP» — автоматическая пересылка. «Аккаунты и импорт» — делегирование доступа и адреса, с которых разрешено писать от вашего имени. «Фильтры» — правила, которые прячут входящие.

Яндекс. id.yandex.ru, раздел безопасности: устройства и приложения, пароли приложений, история входов. История входов, кстати, полезнее всего — по ней видно чужие адреса и время.

Microsoft. account.microsoft.com/security, раздел активности входов. Там же отзыв доступа приложений и выход со всех устройств.

Общее правило: пройтись надо по всем перечисленным разделам, а не только по тому, где что-то нашлось. Один найденный чужой доступ не означает, что он единственный.

Где смотреть: корпоративная почта

Здесь всё то же самое, но администратору доступны нормальные инструменты.

Отзыв всех сессий пользователя в Entra ID:

Connect-MgGraph -Scopes 'User.RevokeSessions.All','User.ReadWrite.All'
Revoke-MgUserSignInSession -UserId 'user@corp-holding.example'

Важная деталь про эту команду: она отзывает токены обновления, то есть новые пропуска выписать больше не получится. А уже выданный токен доступа продолжает работать до истечения срока — по умолчанию около часа. То есть в течение этого часа человек, сидящий внутри, ещё внутри. Планируйте: сначала отзыв, потом остальное, а не наоборот.

Правила пересылки по всем ящикам — то, что стоит проверять регулярно, а не только при разборе:

Get-Mailbox -ResultSize Unlimited | ForEach-Object {
    Get-InboxRule -Mailbox $_.UserPrincipalName -ErrorAction SilentlyContinue |
      Where-Object { $_.ForwardTo -or $_.ForwardAsAttachmentTo -or $_.RedirectTo } |
      Select-Object @{n='Mailbox';e={$_.MailboxOwnerId}}, Name, ForwardTo, RedirectTo, Enabled
}

Отдельно — пересылка, настроенная не правилом, а свойством самого ящика: её правило выше не покажет.

Get-Mailbox -ResultSize Unlimited |
  Where-Object { $_.ForwardingSmtpAddress -or $_.ForwardingAddress } |
  Select-Object UserPrincipalName, ForwardingSmtpAddress, DeliverToMailboxAndForward

И согласия, выданные приложениям от имени пользователя, — то самое «разрешить приложению читать почту»:

Get-MgUserOauth2PermissionGrant -UserId 'user@corp-holding.example' |
  Select-Object ClientId, Scope, ConsentType

В Scope смотрите на права вида Mail.Read, Mail.Send, offline_access. Последнее означает, что приложение получило право работать без участия пользователя — то есть постоянно.

Порядок действий, и почему он такой

Если аккаунт уже скомпрометирован, порядок важнее содержания. Делать надо так:

Сначала — отзыв сессий и токенов. Не пароль. Если начать с пароля, атакующий увидит, что его выкидывают, и успеет закрепиться заново: сменить резервную почту, выдать своему приложению новое разрешение. Отзыв сессий бьёт по всем его каналам одновременно.

Сразу за этим — пароль. Обязательно новый, а не вариация старого: если пароль утёк, то утёк и его шаблон.

Дальше — двухфакторная аутентификация, если её не было. И проверка того, какие способы подтверждения уже привязаны: чужой телефон или чужое приложение-аутентификатор в списке — обычное дело после захвата.

Потом — данные для восстановления. Резервная почта, номер, коды. Это шаг, который пропускают чаще всего, а он решает, вернётся человек через неделю или нет.

И только теперь — поиск следов. Правила, пересылки, приложения, делегирование, подключённые устройства.

В конце — то, что лежало внутри. Почта — это не только переписка, это ещё и точка восстановления доступа ко всему остальному. Пока у чужого человека был доступ, он мог запросить сброс пароля в других сервисах. Поэтому список «куда я входил через эту почту» разбирать придётся, и начинать надо с банков, госуслуг и рабочих систем.

Что из этого можно сделать заранее

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

Список приложений с доступом к почте стоит просматривать примерно с той же частотой. Там обычно обнаруживается что-то, чем не пользовались три года, а доступ к переписке у него всё ещё есть.

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

И самое неприятное для тех, кто отвечает за инструкции: в большинстве корпоративных памяток на случай компрометации написано ровно одно — «смените пароль». Если у вас так же, это стоит переписать сегодня. Пароль в этом списке не первый и далеко не единственный пункт.

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


  1. teecat
    26.08.2026 12:39

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


  1. habrolog
    26.08.2026 12:39

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

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

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


    1. jbenderov Автор
      26.08.2026 12:39

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


      1. habrolog
        26.08.2026 12:39

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


      1. andreymal
        26.08.2026 12:39

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

        Сброс чего?

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


        1. jbenderov Автор
          26.08.2026 12:39

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

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

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

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

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


          1. andreymal
            26.08.2026 12:39

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

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


            1. jbenderov Автор
              26.08.2026 12:39

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

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

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


              1. andreymal
                26.08.2026 12:39

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


                1. jbenderov Автор
                  26.08.2026 12:39

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

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

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

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

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


                  1. andreymal
                    26.08.2026 12:39

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


                    1. jbenderov Автор
                      26.08.2026 12:39

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