Laravel: обход авторизации API в TokenGuard, обновите фреймворк

19 октября 2026 года команда Laravel выпустила исправление критической уязвимости CVE-2026-114509 в встроенной авторизации API через TokenGuard. При работе с MySQL или MariaDB специально составленное значение учётных данных обрабатывается неверно, и запрос может совпасть с чужим пользователем. В итоге атакующий без токена входит под существующим пользователем на любом маршруте, защищённом этим механизмом. Оценка — 9,2 по CVSS 4.0. Исправлено в версиях 13.29.0 и 12.68.0.
Уязвимость нашёл внешний исследователь через программу поиска ошибок, подтверждённых атак на момент раскрытия не сообщалось.
Что произошло
Laravel — один из самых популярных PHP-фреймворков для сайтов, API и личных кабинетов. В нём есть встроенный способ авторизации запросов по токену — TokenGuard. Уязвимость в том, как он ищет пользователя в базе: при определённом виде значения, которое присылает клиент, запрос к MySQL или MariaDB может вернуть не того пользователя.
| Параметр | Значение |
|---|---|
| Компонент | laravel/framework, TokenGuard (авторизация API по токену) |
| Оценка | 9,2 по CVSS 4.0 (критическая) |
| Когда опасно | База MySQL или MariaDB, стандартная авторизация API по токену |
| Что даёт | Вход без токена под существующим пользователем |
| Уязвимые версии | ниже 13.29.0 и ниже 12.68.0 |
| Исправлено | 13.29.0 и 12.68.0 |
| Раскрыто | 19 октября 2026 года |
Для атаки не нужны ни токен, ни права, ни действия пользователя. Условие — стандартный защищённый токеном маршрут API и база MySQL или MariaDB, самое частое сочетание в проектах на Laravel.
Важно понимать разницу: уязвимость не позволяет войти под любым пользователем по выбору, но даёт войти под неким существующим пользователем без его токена. Для API, где у пользователей есть доступ к своим данным, этого достаточно, чтобы увидеть чужую информацию или выполнить действия от чужого имени.
Кого касается
Всех, у кого на Laravel работает API или личный кабинет с авторизацией по токену и база MySQL либо MariaDB. Это типичная связка: мобильное приложение ходит в API, личный кабинет на фронтенде обращается к бэкенду, партнёрские интеграции работают по токенам.
PostgreSQL в описании не упомянут как уязвимый, но это не повод откладывать обновление: фреймворк обновляют целиком.
Отдельно отметим личные кабинеты. Если на Laravel сделан кабинет клиента (заказы, документы, баланс), и он обращается к бэкенду по токену, уязвимость напрямую затрагивает доступ к персональным данным. Это повод не только обновиться, но и проверить, что доступ к чужим данным невозможен и после обновления.

Что делать
- Узнайте версию Laravel: команда `php artisan --version` в каталоге проекта или строка в `composer.lock`.
- Обновите `laravel/framework` до 13.29.0 или 12.68.0 и новее через `composer update laravel/framework`.
- Прогоните тесты и проверьте вход и защищённые маршруты API.
- Выкатите обновление на боевой сервер. Обновлённый composer.lock без деплоя ничего не меняет.
- Просмотрите журналы API на необычные входы: обращения к защищённым маршрутам без корректного токена, доступ к чужим данным.
- При подозрении на использование уязвимости отзовите и перевыпустите токены доступа пользователей.
Наше мнение
Авторизация — самый чувствительный код в приложении. Ошибка в нём не ломает сайт заметно: он продолжает работать, а дыра видна только тому, кто её ищет. Поэтому уязвимости вроде этой особенно коварны: без обновления о ней можно не узнать, пока не случится инцидент.
Мы советуем командам, которые ведут проекты на Laravel, держать фреймворк в актуальной версии и подписаться на бюллетени безопасности Laravel. Для заказчика это повод спросить у подрядчика, какая версия фреймворка сейчас в проекте и как быстро ставятся критические обновления. Отдельно стоит проверить, что токены доступа можно быстро отозвать и перевыпустить: это нужно не только при этой уязвимости, но и при любой утечке.
Как снизить риск на будущее
Эта история — аргумент за несколько практик, которые полезны независимо от конкретной уязвимости.
- Разделяйте права: токен приложения не должен иметь доступ к данным всех пользователей сразу.
- Логируйте доступ к чувствительным данным, чтобы аномалию можно было заметить.
- Держите в проекте автоматическую проверку зависимостей, которая откроет запрос на обновление в день выхода исправления.
- Пишите тесты на авторизацию: они ловят часть таких ошибок до релиза.
- Разделяйте окружения: ключи и токены боевого сервера не должны совпадать с тестовыми.
Почему уязвимости в авторизации опаснее обычных
Обычная ошибка в коде либо ломает функцию, либо нет — её видно. Ошибка в авторизации ведёт себя иначе: приложение работает нормально для обычного пользователя, и проблема проявляется только когда её целенаправленно ищут. Поэтому такие уязвимости живут в проектах годами и всплывают при аудите или, хуже, при инциденте.
Для бизнеса вывод практический: безопасность входа нельзя проверить «на глаз». Нужны тесты, которые проверяют, что под одним пользователем нельзя получить данные другого, и регулярное обновление фреймворка, где подобные ошибки находят и закрывают разработчики.
Материалы для проверки
Если нужна реализация
Состав работ зависит от текущего проекта и подтверждённой причины. Можно обсудить диагностику или разработку подходящего решения.
Вопросы и ответы
Как узнать версию Laravel в проекте?
Выполните php artisan --version в каталоге проекта или найдите laravel/framework в файле composer.lock. Сравните с 13.29.0 и 12.68.0.
У меня база PostgreSQL. Я в безопасности?
В описании уязвимости как уязвимый упомянут MySQL и MariaDB. Но обновлять фреймворк всё равно нужно: исправления выходят целиком, а не по типу базы.
Есть ли обходной способ без обновления?
Нет. В бюллетене обходных мер не приводится. Нужно обновить laravel/framework до исправленной версии.
Нужно ли отзывать токены пользователей?
Если есть признаки использования уязвимости — да, отзовите и перевыпустите токены. В обычном случае достаточно обновления, но проверить журналы стоит.
Как быстро ставить такие обновления?
Удобно настроить автоматическую проверку зависимостей (Dependabot, Renovate), которая откроет запрос на обновление в день выхода исправления. Решение о выкатке остаётся за командой.
Чем TokenGuard отличается от Laravel Sanctum или Passport?
TokenGuard — встроенный в фреймворк способ авторизации по токену, который настраивают как API-гвард. Sanctum и Passport — отдельные пакеты со своей логикой. Уязвимость касается именно встроенного TokenGuard, но обновить фреймворк стоит в любом случае.