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:
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;
| 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)
[ ] 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
[ ] 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