Vai al contenuto

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-Realm per il routing multi-tenant, ma non esiste validazione di autorizzazione.

    // SGVTenantResolver.java — nessun controllo di autorizzazione
    public String resolveTenantId() {
        return routingContext.request().getHeader(X_REALM);
    }
    
  • MobileFineAdapterServer: Endpoint /** aperto a tutti (permitAll). Solo /getCategorie/** e /caricaPreavviso/** richiedono autenticazione.

    // SecurityConfig.java
    .antMatchers("/getCategorie/**").authenticated()
    .antMatchers("/caricaPreavviso/**").authenticated()
    .antMatchers("/**").permitAll()  // tutto il resto aperto
    
  • GeCo.Alfa: Nessun @RolesAllowed o 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.

    // CriptPassword.java — SHA-512 singolo passaggio
    MessageDigest.getInstance("SHA-512")
        .digest((password + repartoInseritore).getBytes("UTF-8"))
    // Nessun PBKDF2, bcrypt, o Argon2
    
  • AES in modalita ECB (Cript.java): Cifratura deterministica senza IV.

    // Cript.java — ECB mode (default quando non specificato)
    Cipher.getInstance("AES")  // equivale a AES/ECB/PKCS5Padding
    // Chiave derivata: SHA-256 troncata a 128 bit, senza salt
    key = Arrays.copyOf(Hash.sha256(pwd.getBytes(CHARSET)), 16);
    
  • Trust-all SSL (PndConnRestService.java): Disabilita completamente la validazione dei certificati SSL per le comunicazioni con PND.

    // PndConnRestService.java — CRITICO
    TrustManager[] trustAllCerts = new TrustManager[]{
        new X509TrustManager() {
            public void checkServerTrusted(...) {} // vuoto!
        }
    };
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    // Modifica il contesto SSL GLOBALE dell'applicazione
    
  • MD5 per hashing file (InsDocGenericoMongoControllerImpl.java): MD5 e crittograficamente compromesso.

    // InsDocGenericoMongoControllerImpl.java
    vvOttico.setFilehash(DigestUtils.md5Hex(arrayByteFile));
    

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:

    // InsDocGenericoMongoControllerImpl.java — concatenazione nativa
    String sql = "Select v.id from vv_notifica v "
        + "where fk_vv_figura in (select id from vv_figura where fk_vv_verbale in "
        + "(select verb.id from vv_verbale verb where verb.id ='" + idVerbale + "'))";
    

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'header X-Realm senza 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 su System.out.println() senza persistenza su database.

    // AuditMDB.java — solo output su console
    System.out.println(model.getDomain());
    System.out.println(model.getType());
    System.out.println(model.getEntity());
    // Nessuna 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:

    <!-- spring-security.xml — credenziali in chiaro -->
    <bean class="GecoLDapAutentication">
        <property name="user" value="uid=gecoUser"/>
        <property name="admin" value="cn=admin pma78301"/>
        <property name="server" value="110.0.1.153:1389"/>
    </bean>
    
  • Credenziali in-memory hardcoded in SecurityConfig.java:

    // SecurityConfig.java — MobileFineAdapter
    auth.inMemoryAuthentication()
        .withUser("user").password("password").roles("USER");
    
  • CSRF disabilitato su MobileFineAdapterServer:

    http.csrf().disable()
    
  • Filter Spring Security commentato in web.xml (riga 83-86): Il filtro di sicurezza potrebbe non essere attivo.

  • Log4j debug mode attivo in produzione:

    <log4j:configuration debug="true">
    

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() in MSecurityImpl.java non 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.java ha un flag utenteKeycloakValidato che bypassa completamente la validazione Spring Security.

    // MSecurityImpl.java — bypass Keycloak
    if (this.utenteKeycloakValidato) {
        return true;  // salta tutta la validazione Spring Security
    }
    

A08: Software and Data Integrity Failures

Rischio: MEDIO

Evidenze nel codebase:

  • MD5 per integrita file: Usato in InsDocGenericoMongoControllerImpl.java per 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.java non 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.java logga il body completo delle risposte PND (che contiene dati personali delle notifiche).

    // PndConnRestService.java — log con PII
    Logger.getLogger(...).log(Level.INFO, responseBody);
    // responseBody potrebbe contenere dati personali
    
  • 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