Skip to content

ESB-1154 Lucene fix attack surface#343

Open
MEM2677 wants to merge 1 commit into
release/7.5from
ESB-fix-lucene-query-injection
Open

ESB-1154 Lucene fix attack surface#343
MEM2677 wants to merge 1 commit into
release/7.5from
ESB-fix-lucene-query-injection

Conversation

@MEM2677

@MEM2677 MEM2677 commented Jun 26, 2026

Copy link
Copy Markdown
Member

CVE-2019-17558 VelocityResponseWriter
CVE-2017-12629 XXE

Lucene Query Injection → bypass dei controlli di accesso**

Il filtro di visibilità dei gruppi (+(entity_group:free)) viene applicato programmaticamente come clausola MUST all'interno della BooleanQuery. L'iniezione di parentesi nel nome di un campo altera il bilanciamento della stringa serializzata della query, consentendo al parser di Solr di ricostruire un albero di clausole differente, nel quale la restrizione sul gruppo non viene più applicata come previsto.

Confermato: Injection del parametro di ordinamento (Sort Parameter Injection)

Le chiavi dei campi utilizzate in SolrQuery.addSort(fieldKey, order) (derivate dai campi di ordinamento dei filtri) erano soggette alla medesima assenza di sanitizzazione, rendendo possibile l'iniezione nel parametro HTTP sort inviato a Solr.

Non ottenibile: Remote Code Execution (RCE) a livello di sistema operativo tramite Solr Local Params

I noti vettori di RCE di Solr (CVE-2019-17558 - VelocityResponseWriter e CVE-2017-12629 - XXE) richiedono che i local params ({!...}) siano presenti all'inizio della stringa del parametro q. Tuttavia, BooleanQuery.toString() genera sempre una stringa che inizia con +, - oppure (, rendendo impossibile posizionare i local params all'indice 0 attraverso questo percorso. Inoltre, il controller non inoltra parametri HTTP arbitrari a SolrJ (ad esempio wt, v.template, ecc.).

Correzione

File: solr-plugin/src/main/java/org/entando/entando/plugins/jpsolr/aps/system/solr/SearcherDAO.java

È stata introdotta una rigorosa allowlist, applicata nel metodo getFilterKey(), che rappresenta il punto unico di controllo attraverso cui transitano tutti i nomi dei campi prima di essere utilizzati per la creazione degli oggetti Term.

private static final Pattern VALID_FIELD_KEY = Pattern.compile("[a-zA-Z0-9_]+");

Sono stati aggiunti due controlli:

  1. Controllo sulla chiave del campo (Field-key guard) – applicato dopo la chiamata a replace(":", "_"). Viene rifiutata qualsiasi chiave contenente caratteri diversi da [a-zA-Z0-9_]. Il controllo copre i campi attribute, entityAttr e lang (utilizzato come chiave per la ricerca full-text).

  2. Controllo sul prefisso della lingua (Lang-prefix guard) – applicato al codice della lingua prima che venga anteposto ai nomi dei campi degli attributi utilizzati nei filtri. Questo elimina anche il percorso di injection ottenibile tramite un valore langCode appositamente costruito.

Entrambi i controlli generano una IllegalArgumentException in caso di violazione. Attualmente l'eccezione non viene gestita e si propaga fino al chiamante, producendo una risposta HTTP 500. Un possibile miglioramento futuro consiste nel gestire l'eccezione a livello di controller, restituendo invece un errore HTTP 400 (Bad Request).

@MEM2677 MEM2677 requested a review from ffalqui June 26, 2026 12:26
@MEM2677 MEM2677 force-pushed the ESB-fix-lucene-query-injection branch from cdb7344 to 28332d0 Compare June 26, 2026 13:00
@MEM2677 MEM2677 changed the title ESB-lucene fix attack surface ESB-1154 Lucene fix attack surface Jun 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant