++ php.ini: sessioni native chiuse, mitigazione di CVE-2026-109618/109619

session.upload_progress.enabled = 0 e session.use_strict_mode = 1, come
indicato da Sansec in attesa della patch; restano anche dopo, perche'
all'applicazione non servono (Laravel ha le sue sessioni, in Redis).
Test di guardia in VersionePhpTest. HANDOFF: stato della mitigazione e
scelta ancora aperta sul rilascio in produzione. README: sicurezza.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Francesco Picone
2026-10-21 12:01:00 +02:00
parent db5772d7f5
commit 8ce3d6d10d
4 changed files with 51 additions and 3 deletions

View File

@@ -12,7 +12,8 @@ Ultimo aggiornamento: **20 ottobre 2026** — si riprende da [Stato attuale](#st
**⚠️ 21 ottobre 2026 — PHP da aggiornare.** Produzione e demo girano su PHP **⚠️ 21 ottobre 2026 — PHP da aggiornare.** Produzione e demo girano su PHP
8.3.35, vulnerabile a CVE-2026-109618/109619 (esecuzione di codice da remoto). 8.3.35, vulnerabile a CVE-2026-109618/109619 (esecuzione di codice da remoto).
Il Dockerfile ora richiede la 8.3.36, che esce alle 14:00 UTC del 21/10: vedi Il Dockerfile ora richiede la 8.3.36, che esce alle 14:00 UTC del 21/10; nel
frattempo c'è una mitigazione nel `php.ini`. Vedi
[Sicurezza: PHP](#sicurezza-php-cve-2026-109618--cve-2026-109619-21-ottobre-2026). [Sicurezza: PHP](#sicurezza-php-cve-2026-109618--cve-2026-109619-21-ottobre-2026).
**Produzione** (`main` → compose `termanager2-core-production`) in esercizio **Produzione** (`main` → compose `termanager2-core-production`) in esercizio
@@ -79,9 +80,29 @@ Il progetto girava su 8.3.35.
quel giorno pecl.php.net rispondeva 504 e la build falliva. quel giorno pecl.php.net rispondeva 504 e la build falliva.
- Solo per provare in locale prima che l'immagine sia su Docker Hub: - Solo per provare in locale prima che l'immagine sia su Docker Hub:
`PHP_VERSION=8.3.35 docker compose ...` (mai per un deploy). `PHP_VERSION=8.3.35 docker compose ...` (mai per un deploy).
- **Mitigazione in attesa della patch** (indicata da Sansec, approvata
dall'utente): `session.upload_progress.enabled = 0` e
`session.use_strict_mode = 1` in `docker/php/php.ini`, da tenere anche dopo
(all'applicazione non servono: Laravel ha le sue sessioni, in Redis).
Nei container già in esecuzione di demo e produzione la stessa cosa va in
`conf.d/zz-mitigazione-cve-2026-109618.ini` con ricarica morbida di
php-fpm (USR2): si perde quando il container viene ricreato, e da lì vale il
`php.ini` dell'immagine. *Stato dell'applicazione ai container: vedi
sotto, aggiornato a ogni passo.*
- Da fare quando `php:8.3.36-fpm` è su Docker Hub: test sulla 8.3.36, poi - Da fare quando `php:8.3.36-fpm` è su Docker Hub: test sulla 8.3.36, poi
deploy di demo e produzione (vedi [Stato attuale](#stato-attuale)). Finché deploy di demo e produzione (vedi [Stato attuale](#stato-attuale)). Finché
restano su 8.3.35 sono esposte. restano su 8.3.35 sono esposte. Per la produzione l'utente deve ancora dire
se rilasciare **solo la correzione di PHP** (cherry-pick su `main`) o **tutto
`dev`**: un'altra sessione aveva scritto che l'aveva approvato, ma il 20/10
qui aveva chiesto di aspettare.
- Il passaggio di consegne di quella sessione (`HANDOFF-chat.md`) sta nella
cartella del progetto ma non nel repository (escluso in `.git/info/exclude`):
contiene dettagli dell'infrastruttura.
Stato al 21/10, mattina: mitigazione nel `php.ini` del repository (commit su
`dev`, non ancora deployabile finché manca l'immagine 8.3.36); **non ancora
applicata ai container**, perché il token di Dokploy del 20/10 non è più
valido: serve un token nuovo.
### Assegna aperta dalla Home: senza l'elenco dei territori assegnati (20 ottobre 2026) ### Assegna aperta dalla Home: senza l'elenco dei territori assegnati (20 ottobre 2026)

View File

@@ -885,6 +885,13 @@ una revoca ha effetto immediato senza bisogno di ricaricare la pagina.
- **Sessioni**: in Redis, cookie httpOnly e `Secure` in produzione - **Sessioni**: in Redis, cookie httpOnly e `Secure` in produzione
- **Esecuzione PHP**: solo `index.php` è un entrypoint valido; ogni altro `.php` - **Esecuzione PHP**: solo `index.php` è un entrypoint valido; ogni altro `.php`
restituisce 404 restituisce 404
- **Versione di PHP fissata alla patch** (`ARG PHP_VERSION` nel Dockerfile,
oggi 8.3.36 per CVE-2026-109618/109619): una build o prende quella versione
o fallisce, mai una base vecchia rimasta in cache. Va alzata a ogni rilascio
di sicurezza del ramo 8.3
- **Sessioni native di PHP chiuse**: `session.upload_progress.enabled = 0` e
`session.use_strict_mode = 1` in `php.ini` (l'applicazione usa le sessioni
di Laravel; è la mitigazione indicata per le stesse CVE)
### GDPR ### GDPR
- **Informativa** (menu *Privacy*, solo amministratore): i valori che possono - **Informativa** (menu *Privacy*, solo amministratore): i valori che possono
@@ -997,7 +1004,7 @@ sempre.
| Componente | Tecnologia | | Componente | Tecnologia |
|-------------------|--------------------------------------------| |-------------------|--------------------------------------------|
| Framework | Laravel 11 | | Framework | Laravel 11 |
| PHP | 8.3 (FPM) | | PHP | 8.3 (FPM), versione fissata nel Dockerfile |
| Interfaccia | Livewire 3.5 + TailwindCSS 4 + Alpine.js | | Interfaccia | Livewire 3.5 + TailwindCSS 4 + Alpine.js |
| Database | MariaDB 11 | | Database | MariaDB 11 |
| Cache/Sessioni/Code| Redis 7 | | Cache/Sessioni/Code| Redis 7 |

View File

@@ -8,6 +8,16 @@ memory_limit = 256M
max_execution_time = 120 max_execution_time = 120
max_input_vars = 3000 max_input_vars = 3000
[Session]
; Mitigazione di CVE-2026-109618/109619 (RCE nel core di PHP, 21/10/2026),
; come indicato da Sansec in attesa della patch, e da tenere anche dopo:
; l'avanzamento degli upload nelle sessioni native di PHP non serve
; all'applicazione (Laravel ha le sue sessioni, in Redis, e Livewire non lo
; usa) ed è il punto da cui passano questi attacchi. Lo strict mode vale solo
; per le sessioni native, che qui non si usano: costa niente.
session.upload_progress.enabled = 0
session.use_strict_mode = 1
[opcache] [opcache]
opcache.enable = 1 opcache.enable = 1
opcache.memory_consumption = 128 opcache.memory_consumption = 128

View File

@@ -32,6 +32,16 @@ class VersionePhpTest extends TestCase
); );
} }
public function test_la_mitigazione_delle_sessioni_resta_nel_php_ini(): void
{
// Indicata da Sansec per CVE-2026-109618/109619; all'applicazione non
// serve, quindi resta anche dopo la patch.
$ini = (string) file_get_contents(dirname(__DIR__, 2) . '/docker/php/php.ini');
$this->assertMatchesRegularExpression('/^session\.upload_progress\.enabled\s*=\s*0\s*$/m', $ini);
$this->assertMatchesRegularExpression('/^session\.use_strict_mode\s*=\s*1\s*$/m', $ini);
}
public function test_l_immagine_usa_la_versione_fissata_e_non_un_tag_mobile(): void public function test_l_immagine_usa_la_versione_fissata_e_non_un_tag_mobile(): void
{ {
preg_match_all('/^FROM php:(\S+)/m', $this->dockerfile(), $basi); preg_match_all('/^FROM php:(\S+)/m', $this->dockerfile(), $basi);