
CVE-2012-2122 - Обход аутентификации MySQL
Доказательство концепции (PoC) для CVE-2012-2122 — критической уязвимости обхода аутентификации, затрагивающей уязвимые серверы MySQL и MariaDB.
Отказ от ответственности
Этот проект предназначен исключительно для образовательных целей, исследований безопасности и авторизованного тестирования на проникновение. Не используйте данное программное обеспечение против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.
CVE-2012-2122 — уязвимость обхода аутентификации, обнаруженная в логике проверки паролей MySQL.
Из-за ошибки приведения типов/сравнения целых чисел аутентификация может ошибочно завершиться успешно, когда сравнение неверного пароля при определённых условиях оказывается равным.
Вместо требования знания корректного пароля атакующий может многократно пытаться пройти аутентификацию, используя произвольные пароли, пока не сработает ошибка сравнения.
Вероятность успеха составляет примерно:
Из-за этой относительно высокой вероятности автоматизированные инструменты обычно обходят аутентификацию в течение нескольких сотен попыток входа.
| Метрика | Значение |
|---|---|
| CVE | CVE-2012-2122 |
| CVSS v2 | 7.5 (Высокий) |
| Вектор атаки | Сеть |
| Аутентификация | Не требуется |
| Взаимодействие с пользователем | Не требуется |
| Влияние | Обход аутентификации |
Уязвимость затрагивает сборки MySQL, скомпилированные с уязвимыми оптимизациями компилятора, включая такие версии, как:
Проблема в основном затрагивала дистрибутивы Linux, чьё поведение компилятора выявляло ошибку.
Не каждая установка этих версий является уязвимой.
Во время проверки пароля MySQL внутренне сравнивает два хеш-значения с помощью функции memcmp().
В обычных условиях:
memcmp(hash1, hash2)
возвращает:
0, когда значения равныУязвимость возникла из-за того, что возвращаемое значение сохранялось в знаковом целочисленном типе и позже преобразовывалось таким образом, что некоторые ненулевые значения могли быть интерпретированы как успешная аутентификация.
Упрощённая логика:
if (memcmp(hash1, hash2) == 0)
{
// Вход выполнен успешно
}
При уязвимом поведении компилятора определённые возвращаемые значения memcmp() могли ошибочно удовлетворять условию сравнения.
В результате неверные пароли иногда проходили аутентификацию успешно.
Атакующему требуется только:
Знание пароля не требуется.
Атакующий непрерывно отправляет попытки входа со случайными паролями.
В конечном итоге одна аутентификация завершается успешно из-за ошибки сравнения.
Типичный ход атаки:
Попытка #1
↓
Аутентификация не удалась
Попытка #57
↓
Аутентификация не удалась
Попытка #141
↓
Аутентификация не удалась
Попытка #237
↓
Аутентификация успешна
В среднем успех происходит примерно раз в 256 попыток.
Успешная эксплуатация позволяет атакующему:
Если целью являются учётные данные администратора, может быть получен полный контроль над сервером базы данных.
Индикаторы включают:
Проверяйте журналы аутентификации MySQL на предмет чрезмерной активности неудачных входов.
Рекомендуемое смягчение — обновление до исправленной версии.
Дополнительные защитные меры включают:
---
## Пример использования
```bash
python3 exploit.py -ip <цель>
Пример:
python3 exploit.py -ip 192.168.1.100
Этот репозиторий демонстрирует, как тонкая ошибка реализации в логике аутентификации может полностью подорвать проверку пароля.
Хотя уязвимости более десяти лет, она остаётся важным учебным примером в: