CVE-2026-84939

Data: 2026-09-17

Severity: Critical

CVSS Score: 9.1 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N)

Nota

La severity e il CVSS Score si riferiscono alla vulnerabilità della libreria. Come descritto nella sezione GovWay, la vulnerabilità non si manifesta nel prodotto, poiché il locale utilizzato per la risoluzione dei template non è mai ricavato dai dati in transito e i template loader impiegati non consentono l’accesso al di fuori delle risorse distribuite dal prodotto.

Riferimenti:

Libreria: org.freemarker:freemarker (versioni affette: 2.2.0 - 2.3.34)

Descrizione

CWE-23: Relative Path Traversal

Path traversal vulnerability in Apache FreeMarker template loading mechanism, if the attacker can specify an arbitrary malformed locale identifier to FreeMarker, and the localized lookup configuration setting is enabled (it’s by default enabled).

This issue affects Apache FreeMarker from 2.2.0 through 2.3.34.

Users are recommended to upgrade to version 2.3.35. Disabling localized lookup in previous versions also mitigates this.

Note that even in versions affected by this vulnerability, the files that can be loaded remain restricted by the TemplateLoader that FreeMarker is configured to use. In particular, FileTemplateLoader prevents attempts to traverse outside the baseDir specified in its constructor. Other TemplateLoader implementations may allow access outside their designated base directory, but they are still constrained by the underlying storage mechanism - for example, a loader wrapping a Java class loader can only access resources that the class loader can load, while one wrapping a web application context can only access resources available through that context.

GovWay

La libreria è inclusa nella distribuzione di GovWay ed è utilizzata sia dai template interni del prodotto, sia dai template FreeMarker che l’amministratore può definire in configurazione (trasformazioni di richiesta e risposta, template dinamici, generazione di claims e di messaggi di errore).

Lo sfruttamento richiede che a FreeMarker venga fornito un identificativo di locale arbitrario e malformato: tale identificativo viene concatenato al nome del template senza essere normalizzato, producendo un nome candidato che il template loader può risolvere al di fuori della directory di base. L’analisi del prodotto, unitamente ad una verifica sperimentale condotta sulla versione 2.3.34 della libreria, ha evidenziato quanto segue.

  1. Il locale non è mai ricavato dai dati in transito. L’unica configurazione della libreria è costruita in org.openspcoop2.utils.resources.TemplateUtils.newTemplateEngine(..), dove non viene invocato il metodo Configuration.setLocale(..); i template vengono inoltre sempre risolti tramite l’overload Configuration.getTemplate(String), che utilizza il locale di default della configurazione, e mai tramite gli overload che accettano un locale. Il locale effettivamente impiegato è quindi quello di default della JVM, non influenzabile dal contenuto delle richieste gestite dal gateway.

  2. I template definiti in configurazione non transitano dal meccanismo di template loading. Essi vengono compilati direttamente dal loro contenuto binario, tramite TemplateUtils.buildTemplate(..) che istanzia new freemarker.template.Template(name, reader, configuration): in questo percorso non viene effettuata alcuna ricerca del template e, di conseguenza, nessun localized lookup. Gli eventuali template inclusi da un template principale sono risolti dalla classe org.openspcoop2.utils.resources.FreemarkerTemplateLoader, un template loader che opera su una mappa in memoria e restituisce esclusivamente i nomi esplicitamente registrati in configurazione, senza alcun accesso al filesystem.

  3. Dove il lookup avviene, il loader ne delimita l’esito. I soli template risolti tramite template loading sono quelli interni del prodotto, identificati da nomi costanti definiti nel codice (ad esempio pmode-template.ftl) e caricati tramite Configuration.setClassForTemplateLoading(..), ossia attraverso un ClassTemplateLoader. Come indicato dalla stessa descrizione della vulnerabilità, un loader basato sul class loader può accedere unicamente alle risorse che il class loader è in grado di caricare. La verifica sperimentale ha confermato che il nome candidato prodotto da un locale malformato viene ricercato letteralmente fra le entry degli archivi distribuiti e non risolve ad alcuna risorsa esterna al package di base; si aggiunge che java.util.Locale riporta in minuscolo l’identificativo, alterando ulteriormente il nome ricercato.

Resta il caso di un template che imposti autonomamente un locale arbitrario tramite la direttiva <#setting locale="..">, che la verifica sperimentale ha confermato essere in grado di raggiungere il template loader con un nome non normalizzato. Tale caso presuppone tuttavia l’alterazione di un template di configurazione e non costituisce un innalzamento dei privilegi: la definizione dei template FreeMarker è riservata agli amministratori del prodotto ed è, per progettazione, una funzionalità dotata di capacità equivalenti all’esecuzione di codice, in quanto rende disponibili al template l’accesso ai metodi statici e l’istanziazione di classi arbitrarie, come documentato nelle console di gestione. L’esito resta inoltre delimitato dai template loader descritti al punto 3.

Per questi motivi la vulnerabilità non si manifesta nel prodotto.

La libreria viene comunque aggiornata alla prima versione in rilascio.

Versione affette:

  • 3.3.x: <= 3.3.20

  • 3.4.x: <= 3.4.3

Risoluzione:

  • 3.3.x: 3.3.21

  • 3.4.x: 3.4.4