
# Proof-of-concept и техническое описание для CVE-2026-73309, обход аутентификации OAuth2 в XenForo до версии 2.3.13 Демонстрирует обход проверки пустого client-secret и PKCE с помощью Python-скрипта.
XenForo до версии 2.3.13 может пропускать проверку client-secret и PKCE в OAuth2, когда до конечной точки токена доходит пустая строка.
Конечная точка проверяет, существуют ли ключи client_secret и code_verifier, а затем выполняет сравнения только тогда, когда их строковые значения в PHP являются истинными (truthy). Таким образом, пустое значение удовлетворяет проверке наличия, но обходит сравнение.
Для публичного OAuth-клиента атакующему всё ещё нужен действительный код авторизации. Ошибка устраняет гарантию PKCE о том, что одного кода недостаточно: код можно обменять без верификатора, получая токены с областями доступа (scopes), одобренными пользователем. Тот же шаблон с ложными (falsey) значениями затрагивал проверки для конфиденциальных клиентов.
Я воспроизвёл проблему на XenForo 2.3.12 (build 2031270) в авторизованной локальной установке. XenForo 2.3.13 содержит исправление.
Скрипт выполняет один обмен токена с пустым code_verifier, хеширует любой возвращённый токен доступа и проверяет, проходит ли он аутентификацию. Он никогда не выводит токен или данные учётной записи.
python poc.py https://xenforo.example CLIENT_ID AUTHORIZATION_CODE https://client.example/callback
Уязвимая установка возвращает HTTP 200 от конечной точки токена и аутентифицированный ответ от /api/me. Исправленная установка отклоняет обмен.
Используйте только код авторизации, созданный для одноразовой учётной записи в системе, которую вам разрешено тестировать.
Обнаружено Марко Пачарони (BomboBombone).