====== Checklist Sicurezza ====== Verifica di sicurezza conforme a **KRITIS/NIS2** basata su vulnerabilità CWE e pattern di attacco. Questa checklist è **obbligatoria** per modifiche a: Rete, Autenticazione, Crittografia, Database, API esterne. ===== Quando Applicare ===== Applicare questa checklist quando la modifica riguarda: * Operazioni crittografiche * Autenticazione / Autorizzazione * Comunicazione di rete * Accesso al database * Chiamate API esterne * Upload di file * Input utente ===== Sicurezza Crittografica ===== ^ Verifica ^ CWE ^ Descrizione ^ | [ ] Unicità Nonce | CWE-323 | Il Nonce AES-GCM deve essere univoco per ogni cifratura | | [ ] Tracciamento Nonce | CWE-323 | Tracciare i nonce utilizzati, applicare MAX_NONCES_PER_KEY | | [ ] Rotazione chiavi | CWE-323 | Ruotare le chiavi dopo il limite di nonce | | [ ] RNG crittografico | CWE-330 | OpenSSL/OS CSPRNG per chiavi/nonce | | [ ] ID casuali | CWE-330 | Nessuna chiave/session-ID sequenziale | | [ ] Confronto a tempo costante | CWE-208 | Per secret, MAC, token, API-Key | | [ ] Protezione replay | CWE-294 | Tracciamento Nonce/Timestamp/Sequenza | | [ ] Cifratura canale | CWE-300 | mTLS per comunicazione esterna | ==== Esempio: Confronto a Tempo Costante ==== (* VIETATO - Attacco timing possibile *) function VerifyToken(const AToken, AExpected: string): Boolean; begin Result := AToken = AExpected; (* Si interrompe alla prima differenza! *) end; (* CORRETTO - Tempo costante *) function VerifyToken(const AToken, AExpected: string): Boolean; var I: Integer; Diff: Byte; begin if Length(AToken) <> Length(AExpected) then Exit(False); Diff := 0; for I := 1 to Length(AToken) do Diff := Diff or (Ord(AToken[I]) xor Ord(AExpected[I])); Result := Diff = 0; end; ===== Sicurezza Memoria ===== ^ Verifica ^ CWE ^ Descrizione ^ | [ ] Zeroization memoria | CWE-316 | Cancellare i secret dopo l'uso | | [ ] Nessun secret nei log | CWE-532 | Mai registrare chiavi, password, token | | [ ] Gestione stringa sicura | CWE-316 | SecureString (C#), secrecy (Rust) | | [ ] Materiale chiave cancellato | CWE-316 | try-finally garantisce cleanup su exception | ==== Esempio: Zeroization ==== procedure ProcessSecret(const ASecret: string); var LocalCopy: string; begin LocalCopy := ASecret; try (* Elaborazione *) DoSomethingWith(LocalCopy); finally (* Cancellare il secret - non solo rilasciare! *) FillChar(LocalCopy[1], Length(LocalCopy) * SizeOf(Char), 0); LocalCopy := ''; end; end; ===== Validazione Input ===== ^ Verifica ^ CWE ^ Descrizione ^ | [ ] Limiti dimensione | CWE-400 | Applicare MAX_PAYLOAD_SIZE (default: 64KB) | | [ ] Integer-Overflow | CWE-190 | SafeAdd(), checked_add(), aritmetica controllata | | [ ] Controlli null | CWE-476 | A tutti i confini API | | [ ] Nessun unwrap su input | CWE-248 | Gestione errori appropriata, nessun panic | | [ ] Query parametrizzate | CWE-89 | Mai concatenazione stringhe per SQL | | [ ] Validazione caratteri | - | Whitelist per identificatori dove appropriato | ==== Esempio: Prevenzione SQL Injection ==== (* VIETATO - SQL Injection possibile *) procedure GetUser(const AUsername: string); begin Query.SQL.Text := 'SELECT * FROM users WHERE name = ''' + AUsername + ''''; Query.Open; end; (* CORRETTO - Parametrizzato *) procedure GetUser(const AUsername: string); begin Query.SQL.Text := 'SELECT * FROM users WHERE name = :username'; Query.ParamByName('username').AsString := AUsername; Query.Open; end; ===== Gestione Errori (Sicurezza) ===== ^ Verifica ^ CWE ^ Descrizione ^ | [ ] Messaggi sanificati | CWE-209 | Nessun percorso/versione/stack-trace al client | | [ ] Logging completo | - | Registrare internamente l'errore completo prima della sanificazione | | [ ] Nessun panic nel servizio | CWE-248 | Recovery graceful, il servizio rimane attivo | | [ ] Stack-Trace preservato | - | Re-throw senza wrapping | ==== Esempio: Messaggi di Errore Sanificati ==== (* VIETATO - Troppe informazioni *) procedure HandleError(E: Exception); begin ShowMessage('Error in C:\Users\Admin\App\src\Database.pas:142: ' + E.Message); end; (* CORRETTO - Registrare internamente, sanificare esternamente *) procedure HandleError(E: Exception); begin (* Registrare internamente in modo completo *) Logger.Error('Database error at %s: %s', [E.ClassName, E.Message]); (* Esternamente solo messaggio sanificato *) raise EUserError.Create(rsDatabaseOperationFailed); end; ===== Disponibilità (Protezione DoS) ===== ^ Verifica ^ CWE ^ Descrizione ^ | [ ] Rate Limiting | CWE-400 | Token Bucket per client/endpoint | | [ ] Limiti dimensione richiesta | CWE-400 | Rifiutare payload sovradimensionati in anticipo | | [ ] Sicurezza lock | CWE-667 | Meccanismo di recovery dei lock | | [ ] Cleanup risorse | CWE-772 | try-finally, using, defer, RAII - sempre | | [ ] Gestione timeout | CWE-400 | Timeout per tutte le operazioni esterne | ===== Thread-Safety ===== ^ Verifica ^ CWE ^ Descrizione ^ | [ ] Lock-Poisoning gestito | CWE-667 | Recovery da lock avvelenati | | [ ] Nessuna race condition | CWE-362 | Strutture dati thread-safe | | [ ] Operazioni atomiche | CWE-362 | Per counter, flag, stato condiviso | | [ ] Prevenzione deadlock | CWE-833 | Ordine dei lock, timeout | ===== Audit e Compliance ===== ^ Verifica ^ Standard ^ Descrizione ^ | [ ] Tutte le modifiche registrate | ISO 27001 A.12.4 | Modifiche dati con utente, timestamp, vecchio/nuovo | | [ ] Eventi sicurezza registrati | NIS2 Art. 21 | Auth fallite, rate limiting, input sospetti | | [ ] Rotazione log | - | Formato incrementale | | [ ] Nessun dato sensibile nei log | CWE-532 | Verificare divulgazione accidentale | ===== Riferimento Rapido - Per Tipo di Attacco ===== ==== Attacchi Crittografici ==== [ ] Riutilizzo nonce prevenuto [ ] Attacchi timing mitigati (tempo costante) [ ] Attacchi replay bloccati [ ] Enumerazione chiavi prevenuta (ID casuali) ==== Attacchi Input ==== [ ] Buffer Overflow prevenuto (limiti dimensione) [ ] Integer Overflow prevenuto [ ] Input malformato gestito [ ] SQL Injection prevenuta ==== Attacchi Disponibilità ==== [ ] Esaurimento risorse prevenuto (Rate Limiting) [ ] Lock-Poisoning gestito [ ] Esaurimento memoria prevenuto ==== Information Disclosure ==== [ ] Messaggi errore sanificati [ ] Secret cancellati dopo l'uso (Zeroization) [ ] Nessun dato sensibile nei log ===== Riferimento OWASP Top 10 ===== ^ Posizione ^ Vulnerabilita ^ Prevenzione in WvdS ^ | 1 | Broken Access Control | Verificare autorizzazione su tutti gli endpoint | | 2 | Cryptographic Failures | Algoritmi moderni, Zeroization | | 3 | Injection | Query parametrizzate, validazione input | | 4 | Insecure Design | Threat Modeling, Defense in Depth | | 5 | Security Misconfiguration | Default sicuri, nessun debug in prod | | 6 | Vulnerable Components | Mantenere dipendenze aggiornate | | 7 | Auth Failures | MFA, Rate Limiting, gestione sessioni | | 8 | Data Integrity Failures | Firme, verifica integrità | | 9 | Logging Failures | Logging strutturato, alerting | | 10 | SSRF | Validazione URL, segmentazione rete | ===== Vedi anche ===== * [[.:qualitaetssicherung|Panoramica Garanzia Qualità]] * [[.:sicherheit|Linee Guida Sicurezza (generale)]] * [[.:audit-core|Checklist Core]] * [[.:debugging|Debugging]]