🟢CVE-2026-59949

Přehled

Toto oznámení se týká známé bezpečnostní chyby zjištěné v závislosti třetí strany používané v rámci DPGW.

Podrobnosti o zranitelnosti

  • CVE ID: CVE-2026-59949 (oznámení GitHubu GHSA-xx22-p4ch-683r; nedostatečná validace argumentů typu bajtového pole na hranici JNI)
  • Název závislosti: at.yawk.lz4:lz4-java (větve 1.12 / 1.13 / 1.14)
  • Ovlivněná verze závislosti: at.yawk.lz4:lz4-java <= 1.11.0 — opraveno ve verzi 1.11.1 (vydáno 6. 7. 2026)
  • Skóre závažnosti: 6.5 Medium (CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:H)

Verze DPGW ovlivňující verze závislostí

Všechny udržované větve obsahují zranitelnou verzi knihovny:

  • 1.12 — všechna vydání (<= 1.12.53-REL), obsahují at.yawk.lz4:lz4-java 1.11.0
  • 1.13 — všechna vydání (<= 1.13.30-REL), obsahují at.yawk.lz4:lz4-java 1.11.0
  • 1.14 — všechna vydání (<= 1.14.08-REL), obsahují at.yawk.lz4:lz4-java 1.11.0

Posouzení rizik a použitelnosti

Použití
DPGW deklaruje lz4-java jako přímou závislost a používá jej výhradně pro hashování pomocí XXHash64 — API pro kompresi a dekompresi LZ4 (LZ4Factory, net.jpountz.lz4.*) není v kódu nikde zmíněno a dependency:tree potvrzuje, že tento artefakt není tranzitivně načítán žádnou jinou komponentou.

XXHash64 se používá na následujících místech volání:

  • org.medoro.dpgw.base.pub.hash.XXHash64InputStream / XXHash64OutputStream — toky kontrolních součtů (podtřídy java.util.zip.CheckedInputStream/CheckedOutputStream) používané úložným modulem (HashAlgorithm.XXH64) k výpočtu hashů obsahu ukládaných objektů při jejich čtení či zápisu.
  • org.medoro.dpgw.digi.HashUtils.xxh64(Path) — vypočítá hash souboru z disku s pevným vyrovnávacím pamětním blokem o velikosti 64 KiB.
  • org.medoro.dpgw.core.db.DB.calculateLiquibaseHash() — vypočítá hash svázaných zdrojů protokolu změn Liquibase při spuštění s pevným vyrovnávacím pamětním blokem o velikosti 8 KiB.
  • org.medoro.lib.utils.LogHashUtils, NaturalMapHasher, ShareLinksAPIImpl — získají hasher pomocí metody XXHashFactory.fastestJavaInstance().

První tři získávají hasher pomocí metody XXHashFactory.fastestInstance(), která v případě dostupnosti volí implementaci JNI/nativní, takže v dané sestavě je přítomna zranitelná část kódu. Zbývající tři používají metodu fastestJavaInstance() (čistě javová implementace), která hranici JNI vůbec nepřekračuje.

Analýza
CVE-2026-59949 je chyba spočívající v nedostatečné validaci chybějících argumentů v implementacích funkce XXHash v knihovně lz4-java založených na rozhraní JNI. Nativní vstupní body hash(…) / update(…) neprovádějí validaci odkazu na pole bajtů ani rozsahu off/len před jejich předáním nativnímu kódu, což umožňuje vznik dvou typů selhání:

  • Pole s hodnotou null: volání hash(null, 0, 0, seed) nebo update(null, 0, 0) vede k volání metody GetPrimitiveArrayCritical s odkazem na hodnotu null, což způsobí fatální selhání JVM.
  • Překročení rozsahu: volání typu update(new byte[16], 0, Integer.MAX_VALUE) umožňuje nativnímu kódu číst data daleko za koncem pole v Javě, což opět způsobí selhání JVM.

Důsledkem je útok typu „denial of service“ způsobený náhlým ukončením JVM (A:H), s omezeným dopadem na důvěrnost (C:L) v důsledku čtení mimo povolený rozsah. Klíčové je, že ke zneužití je nutné, aby útočník ovlivnil argumenty týkající se objektu pole, offsetu nebo délky předávané nativnímu API. V původním bezpečnostním oznámení se výslovně uvádí, že běžné způsoby použití, při nichž útočník ovládá pouze obsah pole, nejsou touto chybou ovlivněny.

Použití DPGW se zcela řadí do tohoto neovlivněného vzorce:

  • Každé místo volání nativního kódu předává lokálně alokovaný buffer pevné velikosti s rozsahem (buf, 0, read), kde read je návratová hodnota metody InputStream.read(buf) — podle podmínky je nezáporná a nikdy není větší než buf.length. Odkaz na pole není nikdy null a nikdy není dodán z vnějšího zdroje.
  • Oba kontrolní součtové toky delegují prostřednictvím java.util.zip.CheckedInputStream/CheckedOutputStream. V metodě CheckedInputStream.read(b, off, len) je rozsah ověřen čtením podkladového streamu před voláním metody Checksum.update; v metodě CheckedOutputStream.write(b, off, len) je nejprve volána zabalená metoda OutputStream.write, která odmítne neplatný rozsah ještě předtím, než dojde k aktualizaci kontrolního součtu. V obou případech pocházejí offset a délka z interních kopírovacích smyček DPGW, nikoli ze vzdáleného vstupu.
  • Data poskytnutá útočníkem (objekty DICOM, nahrané dokumenty) se k hasheru dostávají vždy pouze jako obsah pole, nikdy jako odkaz na pole, offset nebo délka.

Neexistuje tedy žádný způsob, jak by vzdálený nebo lokální účastník mohl ovlivnit posun, délku nebo odkaz na pole, které směřují k nativním vstupním bodům XXHash.

Stav
Neovlivněno

Dopad na DPGW

Žádný dopad. Zranitelnost v ověřování argumentů JNI lze vyvolat pouze tím, že volající předá pole s hodnotou null nebo pár off/len mimo povolený rozsah. Všechna místa volání DPGW předávají interně alokované vyrovnávací paměti s rozsahy odvozenými z návratových hodnot metody InputStream.read, takže k selhání systému nemůže dojít — a to ani ve větvi 1.11, kde opuštěný artefakt org.lz4:lz4-java 1.8.0 nemá žádnou opravu v upstreamu.

Náprava a zmírnění dopadů

Plánovaná oprava
Ačkoli DPGW není touto chybou dotčeno, zranitelná verze závislosti bude z buildů odstraněna z preventivních důvodů:
– 1.14 / 1.13 / 1.12 — v příštím rutinním vydání každé větve dojde k aktualizaci at.yawk.lz4:lz4-java z verze 1.11.0 na verzi 1.11.1.

Akce uživatele
Není nutná žádná akce ze strany uživatele.