diff --git a/HANDOFF.md b/HANDOFF.md index 8e18628..26b77f1 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -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 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). **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. - Solo per provare in locale prima che l'immagine sia su Docker Hub: `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 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) diff --git a/README.md b/README.md index 47bdf96..3ff1eba 100644 --- a/README.md +++ b/README.md @@ -885,6 +885,13 @@ una revoca ha effetto immediato senza bisogno di ricaricare la pagina. - **Sessioni**: in Redis, cookie httpOnly e `Secure` in produzione - **Esecuzione PHP**: solo `index.php` è un entrypoint valido; ogni altro `.php` 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 - **Informativa** (menu *Privacy*, solo amministratore): i valori che possono @@ -997,7 +1004,7 @@ sempre. | Componente | Tecnologia | |-------------------|--------------------------------------------| | Framework | Laravel 11 | -| PHP | 8.3 (FPM) | +| PHP | 8.3 (FPM), versione fissata nel Dockerfile | | Interfaccia | Livewire 3.5 + TailwindCSS 4 + Alpine.js | | Database | MariaDB 11 | | Cache/Sessioni/Code| Redis 7 | diff --git a/docker/php/php.ini b/docker/php/php.ini index 2c80de8..67f44e9 100644 --- a/docker/php/php.ini +++ b/docker/php/php.ini @@ -8,6 +8,16 @@ memory_limit = 256M max_execution_time = 120 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.enable = 1 opcache.memory_consumption = 128 diff --git a/tests/Unit/VersionePhpTest.php b/tests/Unit/VersionePhpTest.php index 40a157b..91a4c30 100644 --- a/tests/Unit/VersionePhpTest.php +++ b/tests/Unit/VersionePhpTest.php @@ -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 { preg_match_all('/^FROM php:(\S+)/m', $this->dockerfile(), $basi);