
phpMyAdmin 5.2.3 — высокий — удалённый — обход 2FA — церемонию WebAuthn можно пропустить
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-webauthn
Разбор: https://abraxaslabs.tech/research/phpmyadmin-webauthn
Класс: обход 2FA Доступ: удалённый
phpMyAdmin 5.2.3 (тег RELEASE_5_2_3). Стандартный tarball. web-auth/webauthn-lib указан в suggest / require-dev. composer install --no-dev его не устанавливает. Поэтому createServer использует CustomServer. Этот класс разбирает response.signature (поле должно существовать и декодироваться) и никогда не проверяет её через COSE. Он никогда не использует сохранённый credentialPublicKey. Собственный CustomServerTest продукта принимает assertion без публичного ключа.
Структурные проверки реальны: credential id в allowCredentials, clientData.type == webauthn.get, challenge совпадает с сессией, хост origin, rpIdHash, user-present. Подпись разбирается и игнорируется. После пароля MySQL мусорная подпись WebAuthn, которая всё ещё соответствует этим полям, даёт полноценную сессию phpMyAdmin. А это база данных. Если вы действительно установили web-auth/webauthn-lib, вы работаете на WebauthnLibServer, и эта уязвимость к вам не относится.
| ID | CVE пока нет |
| Класс | обход 2FA / отсутствие проверки подписи |
| Доступ | Удалённый (вход по cookie, затем WebAuthn пропускается) |
| CWE | CWE-347, CWE-287 |
| CVSS | Высокий: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Продукт | phpMyAdmin |
| Затронуто | 5.2.3 тег RELEASE_5_2_3. Стандартный tarball / composer install --no-dev |
| Аутентификация | Вход по cookie (пароль MySQL), затем WebAuthn пропускается |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1:18080 |
Ему по-прежнему нужен пароль MySQL (вход по cookie). После этого пароля он отправляет POST webauthn_request_response с совпадающими challenge, хостом origin, rpIdHash, user-present, id зарегистрированного credential и мусорной подписью. Он попадает в обычный интерфейс. 2FA больше нет. Это база данных (SQL, пользователи, экспорт), а не PHP-шелл на хосте.
Если вы действительно установили web-auth/webauthn-lib, вы работаете на WebauthnLibServer, и эта уязвимость к вам не относится.
| Привилегия | Метод / путь | Доказано в лаборатории или выведено |
|---|---|---|
| Полный обход WebAuthn 2FA без аутентификатора (целостность второго фактора) | POST webauthn_request_response после пароля, мусорная подпись | Доказано в лаборатории. still_2fa=False landed=True |
| Полный PMA от имени этого пользователя MySQL (целостность + разведка SQL-сервера) | та же сессия | Доказано в лаборатории. Присутствуют маркеры главного интерфейса |
| Обход пароля MySQL | неаутентифицированный POST | Доказано в лаборатории, закрыто. Остаётся на странице входа |
Тот же обход при установленном web-auth/webauthn-lib | WebauthnLibServer | Закрыто. Это не данная недоработка |
| RCE на уровне ОС / reverse shell | эта недоработка | Закрыто |
Закрыто в рамках этой недоработки: неаутентифицированный PMA, PHP-шелл на хосте и трактовка tarball, в котором фактически установлен web-auth/webauthn-lib, как данной уязвимости.
Я прочитал createServer, затем parseAndValidateAssertionResponse, затем модульный тест, который не передаёт публичный ключ. Структурные проверки реальны. Подпись разбирается и игнорируется.
Неудачные попытки: POST WebAuthn JSON без предварительной сессии с паролем; подпись, не прошедшая структурные проверки; Webauthn\Server всё ещё присутствует (неверный класс сервера); challenge не из этой сессии; несовпадение хоста origin; флаг user-present снят; credential id отсутствует в allowCredentials.
Dockerfile лаборатории копирует 5.2.3, выполняет composer install --no-dev, затем удаляет vendor/web-auth, чтобы использовался именно CustomServer. Последний php -r завершается с кодом 1, если Webauthn\Server существует. init.sql регистрирует WebAuthn 2FA для appuser без аппаратного ключа. PoC отправляет POST с подписью not-a-real-signature-PMA-WEBAUTHN-BYPASS.
Клонируйте закреплённую версию рядом с Dockerfile, затем выполните:
cd lab
git clone --depth 1 --branch RELEASE_5_2_3 https://github.com/phpmyadmin/phpmyadmin.git src
./run.sh
или из корня пакета после этого клонирования:
python3 phpmyadmin-webauthn-Abraxas-Labs.py
Только loopback: http://127.0.0.1:18080. Проект Compose pma-webauthn-lab. Закреплённая версия RELEASE_5_2_3. Не поставлять src/. Свидетельство PMA-WEBAUTHN-BYPASS.
SUCCESS PMA-WEBAUTHN-BYPASS WebAuthn 2FA accepted with garbage signature
Проверяйте authenticatorData || SHA-256(clientDataJSON) с сохранённым публичным ключом COSE; привязывайте userHandle; применяйте signCount. Сделайте web-auth/webauthn-lib реальной зависимостью и удалите CustomServer или завершайте работу с ошибкой при отсутствии библиотеки. До тех пор отключите 2FA WebAuthn или не предоставляйте доступ к этому phpMyAdmin.
Plugins\TwoFactor\WebAuthn::createServerCustomServer::parseAndValidateAssertionResponseGNU Affero GPL v3.0. См. LICENSE. Только для лаборатории с loopback. Без гарантий.