Threat Model¶
Panoramica¶
Questo documento descrive il threat model di SGV GE.CO, mappato su OWASP Top 10 2021, con evidenze specifiche dal codebase. L'analisi copre tutti gli 8 moduli applicativi e le relative superfici di attacco.
Superfici di Attacco¶
Inventario Entry Points¶
| Modulo | Tipo | Entry Points | Autenticazione | Note |
|---|---|---|---|---|
| GeCo.Alfa | Vaadin UI | /geco/* |
Spring Security 3.2 + BASIC | UI operatore principale |
| GecoService | JAX-RS REST | /GecoService/rest/* |
Spring Security 3.2 | Servizi backend per UI |
| ElaborazioneService | REST + SOAP | /ElaborazioneService/* |
WildFly ApplicationRealm | 211+ endpoint SOAP/CXF |
| ConnessioneService | JAX-RS REST | /ConnessioneService/* |
WildFly ApplicationRealm | Gateway PA (ANPR, PND, INAD, PagoPA) |
| OtticoService | JMS MDB | Topic JMS | Container-managed | Processing documenti scansionati |
| MobileFineAdapterServer | Spring MVC | /mobile/api/* |
HTTP BASIC (in-memory) | API tablet agenti |
| VpnMctcService | JAX-WS | SOAP/FTP | WildFly ApplicationRealm | Comunicazione MCTC via VPN |
| REST (Quarkus) | JAX-RS | /api/* |
Nessuna (solo X-Realm) |
API next-gen multi-tenant |
Diagramma Superfici di Attacco¶
graph TB
subgraph "Internet"
BROWSER["Browser Operatore"]
TABLET["Tablet Agente"]
PA["Servizi PA<br/>ANPR, PND, INAD, PagoPA"]
end
subgraph "DMZ / Reverse Proxy"
RP["Reverse Proxy / Load Balancer"]
end
subgraph "Application Layer"
GECO["GeCo.Alfa<br/>Vaadin 7 + Spring Security 3.2"]
GS["GecoService<br/>JAX-RS"]
MOBILE["MobileFineAdapter<br/>Spring Boot BASIC Auth"]
REST["REST Quarkus<br/>X-Realm Multi-Tenant"]
end
subgraph "Backend Services"
ELAB["ElaborazioneService<br/>Quartz + SOAP"]
CONN["ConnessioneService<br/>Gateway PA"]
OTT["OtticoService<br/>JMS MDB"]
VPN["VpnMctcService<br/>FTP/VPN"]
end
subgraph "Data Layer"
PG["PostgreSQL<br/>Multi-tenant"]
MONGO["MongoDB<br/>Documenti scansionati"]
end
BROWSER -->|HTTPS| RP
TABLET -->|HTTPS + BASIC| RP
RP --> GECO
RP --> GS
RP --> MOBILE
RP --> REST
GECO --> PG
GS --> PG
REST --> PG
ELAB --> PG
CONN -->|mTLS| PA
OTT --> MONGO
VPN -->|FTP over VPN| PA
style GECO fill:#ff9800,color:#000
style MOBILE fill:#ff9800,color:#000
style REST fill:#f44336,color:#fff
style CONN fill:#f44336,color:#fff
OWASP Top 10 2021 - Mapping¶
A01: Broken Access Control¶
Rischio: ALTO
Evidenze nel codebase:
-
REST (Quarkus): Nessuna autenticazione utente. L'unica protezione e l'header
X-Realmper il routing multi-tenant, ma non esiste validazione di autorizzazione. -
MobileFineAdapterServer: Endpoint
/**aperto a tutti (permitAll). Solo/getCategorie/**e/caricaPreavviso/**richiedono autenticazione. -
GeCo.Alfa: Nessun
@RolesAllowedo controllo granulare su endpoint. Autorizzazione basata su menu (verificaAbilitazioneEsecuzioneScelta), non su ruoli REST.
Mitigazioni esistenti:
- Vaadin 7 non espone endpoint REST diretti (comunicazione server-push)
- Menu-level authorization in
MSecurityImpl.verificaAbilitazioneEsecuzioneScelta()
A02: Cryptographic Failures¶
Rischio: CRITICO
Evidenze nel codebase:
-
Password hashing debole (
CriptPassword.java): SHA-512 senza iterazioni, salt uguale per tutti gli utenti dello stesso reparto. -
AES in modalita ECB (
Cript.java): Cifratura deterministica senza IV. -
Trust-all SSL (
PndConnRestService.java): Disabilita completamente la validazione dei certificati SSL per le comunicazioni con PND. -
MD5 per hashing file (
InsDocGenericoMongoControllerImpl.java): MD5 e crittograficamente compromesso.
Mitigazioni esistenti:
- mTLS (mutual TLS) configurato per integrazioni PA (certificati client X.509)
- JWT RS256 per PDND (
ClientAssertion.java)
A03: Injection¶
Rischio: ALTO
Evidenze nel codebase:
-
SQL concatenation in ScadenziarioDao.java — vulnerabilita multiple:
// ScadenziarioDao.java — concatenazione diretta sql = sql + " and giu.fk_vv_avvocato='" + vvAvvocato + "' "; sql = sql + " and giu.fk_vv_gdp='" + vvGdp.getId() + "' "; // Escaping incompleto per stringhe sql = sql + " and (ric.cogn_den_rico || ric.nome_rico) like '%" + ricorrente.replace("'", "''") + "%' "; // Solo single-quote escaped, altri metacaratteri SQL ignorati -
Native SQL in InsDocGenericoMongoControllerImpl.java:
Mitigazioni esistenti:
- JPA parameterized queries usate nella maggior parte del codebase (pattern
:PARAM) - EclipseLink/Hibernate gestiscono l'escaping per JPQL standard
A04: Insecure Design¶
Rischio: MEDIO
Evidenze nel codebase:
-
Multi-tenant via header HTTP (
SGVTenantResolver.java): Il tenant e determinato dall'headerX-Realmsenza validazione. Un client potrebbe accedere ai dati di un altro comune semplicemente cambiando l'header. -
Audit MDB incompleto (
AuditMDB.java): L'audit trail asincrono scrive solo suSystem.out.println()senza persistenza su database.
Mitigazioni esistenti:
- Database-level multi-tenancy (database separati per tenant)
- MLogger2 per logging applicativo strutturato
A05: Security Misconfiguration¶
Rischio: ALTO
Evidenze nel codebase:
-
Spring Security 3.2.8 (EOL dal 2016): Versione con vulnerabilita note, non piu supportata.
-
Credenziali LDAP hardcoded in
spring-security.xml: -
Credenziali in-memory hardcoded in
SecurityConfig.java: -
CSRF disabilitato su MobileFineAdapterServer:
-
Filter Spring Security commentato in
web.xml(riga 83-86): Il filtro di sicurezza potrebbe non essere attivo. -
Log4j debug mode attivo in produzione:
A06: Vulnerable and Outdated Components¶
Rischio: ALTO
| Libreria | Versione in uso | Ultima stabile | CVE noti | Modulo |
|---|---|---|---|---|
| Spring Security | 3.2.8.RELEASE | 6.x | Multiple (EOL 2016) | GeCo.Alfa |
| Vaadin | 7.7.27 | 24.x | XSS, CSRF (EOL 2023) | GeCo.Alfa |
| Spring Boot | 1.5.8 | 3.x | Multiple (EOL 2019) | MobileFineAdapter |
| Jackson Databind | 2.9.6 | 2.17.x | CVE-2019-12384 e altri | MLib |
| iText | 2.1.7 | 8.x | Path traversal, XXE | MLib |
| Log4j 1.2 | 1.2.x | 2.x (Log4j2) | CVE-2021-44228 class | GeCo.Alfa |
| EclipseLink | 2.5.1 | 4.x | Multiple | MLib |
| JJWT | 0.9.1 | 0.12.x | CVE-2023-37464 | MLib |
| BouncyCastle | 1.78.1 | Corrente | - | MLib |
A07: Identification and Authentication Failures¶
Rischio: ALTO
Evidenze nel codebase:
-
Nessuna protezione brute-force:
testLogin()inMSecurityImpl.javanon implementa rate limiting o account lockout. -
Password hashing senza iterazioni: SHA-512 singolo passaggio (
CriptPassword.java), vulnerabile a rainbow table attack. -
Nessuna protezione session fixation: Non configurata in Spring Security 3.2 XML config.
-
BASIC auth su HTTP: MobileFineAdapterServer usa HTTP BASIC — credenziali in Base64 (non cifrate) se HTTPS non forzato.
-
Keycloak parzialmente integrato:
MSecurityImpl.javaha un flagutenteKeycloakValidatoche bypassa completamente la validazione Spring Security.
A08: Software and Data Integrity Failures¶
Rischio: MEDIO
Evidenze nel codebase:
-
MD5 per integrita file: Usato in
InsDocGenericoMongoControllerImpl.javaper deduplicazione documenti scansionati. MD5 e vulnerabile a collision attack. -
Nessuna firma dei WAR: I file WAR deployati su WildFly non sono firmati digitalmente.
-
JWT senza validazione TTL:
ClientAssertion.javanon valida i bounds del TTL (potrebbe creare token con durata arbitraria).
A09: Security Logging and Monitoring Failures¶
Rischio: MEDIO
Evidenze nel codebase:
-
AuditMDB non persiste: L'audit trail asincrono scrive solo su
System.out, non su database o file strutturato. -
PII potenzialmente loggato:
PndConnRestService.javalogga il body completo delle risposte PND (che contiene dati personali delle notifiche). -
Stack trace in eccezioni: Exception body incluso nelle WebApplicationException con potenziale PII.
-
Log4j debug=true in produzione: Informazioni di debug eccessive.
A10: Server-Side Request Forgery (SSRF)¶
Rischio: BASSO
Evidenze nel codebase:
-
ConnessioneService: Gateway verso servizi PA esterni. Gli URL di destinazione sono configurati lato server, non derivati da input utente.
-
Nessuna validazione URL esplicita: Se in futuro venissero aggiunti URL dinamici, non esiste un framework di validazione.
Mitigazioni esistenti:
- URL PA hardcoded nella configurazione server
- Comunicazioni PA su mTLS con certificati client
Mitigazioni Esistenti¶
| Mitigazione | Copertura | Efficacia |
|---|---|---|
| JPA parameterized queries | ~80% delle query | Alta (dove usato) |
| mTLS per integrazioni PA | ConnessioneService | Alta |
| Vaadin CSRF built-in | GeCo.Alfa UI | Media |
| Audit trail (MLogger2) | Tutti i moduli | Media (file-based) |
| Database-level multi-tenancy | REST Quarkus | Alta |
| ApplicationRealm WildFly | Moduli WildFly | Media |
| VPN per MCTC | VpnMctcService | Alta |
Raccomandazioni Prioritizzate¶
Immediato (0-30 giorni)¶
| Priorita | Azione | OWASP | File Impattato |
|---|---|---|---|
| P0 | Rimuovere trust-all SSL da PndConnRestService | A02 | PndConnRestService.java |
| P0 | Convertire SQL concatenation in parameterized queries | A03 | ScadenziarioDao.java, InsDocGenericoMongoControllerImpl.java |
| P1 | Esternalizzare credenziali hardcoded | A05 | spring-security.xml, SecurityConfig.java |
| P1 | Disabilitare log4j debug mode in produzione | A05 | log4j.xml |
Medio Termine (1-3 mesi)¶
| Priorita | Azione | OWASP | Note |
|---|---|---|---|
| P2 | Migrare password hashing a bcrypt/Argon2 | A02, A07 | Richiede migrazione utenti |
| P2 | Aggiungere autenticazione al modulo REST Quarkus | A01 | OIDC/JWT consigliato |
| P2 | Sostituire AES-ECB con AES-GCM | A02 | Richiede migrazione dati cifrati |
| P2 | Implementare rate limiting su login | A07 | Tutte le interfacce di login |
| P2 | Completare AuditMDB con persistenza su database | A09 | AuditMDB.java |
Lungo Termine (3-12 mesi)¶
| Priorita | Azione | OWASP | Note |
|---|---|---|---|
| P3 | Upgrade Spring Security 3.2 → 6.x | A05, A06 | Impatto architetturale maggiore |
| P3 | Upgrade Vaadin 7 → 24.x | A06 | Riscrittura UI necessaria |
| P3 | Migrazione a Java 11+ per tutti i moduli | A06 | Attualmente solo REST su Java 11 |
| P3 | Upgrade Jackson Databind e altre librerie EOL | A06 | Verificare compatibilita |
| P3 | Implementare RBAC granulare su tutti gli endpoint | A01 | Spring Security 6 + Keycloak |
| P3 | Validazione X-Realm con whitelist tenant |
A04 | SGVTenantResolver.java |