++ 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:
25
HANDOFF.md
25
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
|
**⚠️ 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)
|
||||||
|
|
||||||
|
|||||||
@@ -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 |
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user