CSIRTS // UNIFIED SECURITY ADVISORY FEEDSYS ● ONLINE · POWERED BY INTELFUSIONS.COM

GHSA-8hjv-92q9-g4xj: Micronaut has unbounded `formattersCache` in `TimeConverterRegistrar` that Allows Memory Exhaustion via `Accept-Language` Header

highCVSS 7.5CVE-2026-44241
Summary TimeConverterRegistrar caches DateTimeFormatter instances in an unbounded ConcurrentHashMap<String, DateTimeFormatter> whose key is derived from the @Format annotation pattern concatenated with the locale from the HTTP Accept-Language header. Because Locale.forLanguageTag() accepts arbitrary BCP 47 private-use extensions (en-x-a001, en-x-a002, …), an unauthenticated attacker can generate an unlimited number of unique cache keys by sending requests with novel locale tags, growing the cache until heap memory is exhausted and the JVM crashes. This is structurally identical to the recently patched GHSA-2hcp-gjrf-7fhc (DefaultHtmlErrorResponseBodyProvider), but TimeConverterRegistrar.formattersCache was not covered by that fix. Details The vulnerable cache is declared in context/src/main/java/io/micronaut/runtime/converters/time/TimeConverterRegistrar.java at line 123: // TimeConverterRegistrar.java:123 private final Map<String, DateTimeFormatter> formattersCache = new ConcurrentHashMap<>(); The getFormatter method at line 434 inserts into this map with no eviction or size limit: // TimeConverterRegistrar.java:434-443 private DateTimeFormatter getFormatter(String pattern, ConversionContext context) { var key = pattern + context.getLocale(); // locale from Accept-Language header var cachedFormatter = formattersCache.get(key); if (cachedFormatter != null) { return cachedFormatter; } var formatter = DateTimeFormatter.ofPattern(pattern, context.getLocale()); formattersCache.put(key, formatter); // NO SIZE CHECK — unbounded growth return formatter; } The attacker-controlled locale flows into the cache key through this call chain: 1. HTTP header parsed — HttpHeaders.findAcceptLanguage() at http/src/main/java/io/micronaut/http/HttpHeaders.java:766-771 calls Locale.forLanguageTag(part) directly on the raw Accept-Language value: // HttpHeaders.java:766-771 default Optional<Locale> findAcceptLanguage() { return findFirst(HttpHeaders.ACCEPT_LANGUAGE) .map(text -> {

Details

Source
GitHub Security Advisories (INTL · database · site)
Severity
high — CVSS 7.5
Published
2026-05-06
Last updated
2026-07-10
Exploitation
Not in CISA KEV at last sync

Original advisory: https://github.com/advisories/GHSA-8hjv-92q9-g4xj

Exploitation outlook

EPSS (FIRST.org) estimates each CVE’s probability of exploitation in the next 30 days — here is the CSIRTS.com read on those numbers.

Referenced CVEs

CVECSIRTS overviewExternal
CVE-2026-44241coverage & exploitation statusNVD · CVE.org

More from GitHub Security Advisories