====== Sigurnosna kontrolna lista ====== **KRITIS/NIS2-sukladna** sigurnosna provjera temeljena na CWE-ranjivostima i obrascima napada. Ova kontrolna lista je **obvezna** kod promjena na: mreži, autentifikaciji, kriptografiji, bazi podataka, vanjskim API-jima. ===== Kada primjenjivati ===== Ovu kontrolnu listu primjenjivati kada promjena uključuje: * Kriptografske operacije * Autentifikaciju / Autorizaciju * Mrežnu komunikaciju * Pristup bazi podataka * Vanjske API-pozive * Upload datoteka * Korisničke unose ===== Kriptografska sigurnost ===== ^ Provjera ^ CWE ^ Opis ^ | [ ] Jedinstvenost nonce-a | CWE-323 | AES-GCM nonce mora biti jedinstven po enkripciji | | [ ] Praćenje nonce-a | CWE-323 | Pratiti korištene nonce-ove, primijeniti MAX_NONCES_PER_KEY | | [ ] Rotacija ključeva | CWE-323 | Rotirati ključ nakon nonce-limita | | [ ] Kriptografski RNG | CWE-330 | OpenSSL/OS CSPRNG za ključeve/nonce-ove | | [ ] Nasumični ID-ovi | CWE-330 | Bez sekvencijalnih ključeva/session-ID-ova | | [ ] Usporedba u konstantnom vremenu | CWE-208 | Za tajne, MAC-ove, tokene, API-ključeve | | [ ] Zaštita od replay-a | CWE-294 | Praćenje nonce/timestamp/sekvence | | [ ] Enkripcija kanala | CWE-300 | mTLS za vanjsku komunikaciju | ==== Primjer: Usporedba u konstantnom vremenu ==== (* ZABRANJENO - Moguć timing-napad *) function VerifyToken(const AToken, AExpected: string): Boolean; begin Result := AToken = AExpected; (* Prekida na prvoj razlici! *) end; (* ISPRAVNO - Konstantno vrijeme *) 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; ===== Sigurnost memorije ===== ^ Provjera ^ CWE ^ Opis ^ | [ ] Brisanje memorije (Zeroization) | CWE-316 | Obrisati tajne nakon korištenja | | [ ] Bez tajni u logovima | CWE-532 | Nikad logirati ključeve, lozinke, tokene | | [ ] Sigurno rukovanje stringovima | CWE-316 | SecureString (C#), secrecy (Rust) | | [ ] Materijal ključeva obrisan | CWE-316 | try-finally jamči cleanup kod iznimke | ==== Primjer: Brisanje memorije ==== procedure ProcessSecret(const ASecret: string); var LocalCopy: string; begin LocalCopy := ASecret; try (* Obrada *) DoSomethingWith(LocalCopy); finally (* Obriši tajnu - ne samo oslobodi! *) FillChar(LocalCopy[1], Length(LocalCopy) * SizeOf(Char), 0); LocalCopy := ''; end; end; ===== Validacija unosa ===== ^ Provjera ^ CWE ^ Opis ^ | [ ] Ograničenja veličine | CWE-400 | Primijeniti MAX_PAYLOAD_SIZE (standard: 64KB) | | [ ] Integer-Overflow | CWE-190 | SafeAdd(), checked_add(), provjerena aritmetika | | [ ] Provjere null | CWE-476 | Na svim API-granicama | | [ ] Bez Unwrap na ulazu | CWE-248 | Pravilno rukovanje greškama, bez panic | | [ ] Parametrizirani upiti | CWE-89 | Nikad konkatenacija stringova za SQL | | [ ] Validacija znakova | - | Whitelist za identifikatore gdje je prikladno | ==== Primjer: Prevencija SQL Injection ==== (* ZABRANJENO - Moguća SQL Injection *) procedure GetUser(const AUsername: string); begin Query.SQL.Text := 'SELECT * FROM users WHERE name = ''' + AUsername + ''''; Query.Open; end; (* ISPRAVNO - Parametrizirano *) procedure GetUser(const AUsername: string); begin Query.SQL.Text := 'SELECT * FROM users WHERE name = :username'; Query.ParamByName('username').AsString := AUsername; Query.Open; end; ===== Rukovanje greškama (sigurnost) ===== ^ Provjera ^ CWE ^ Opis ^ | [ ] Sanitizirane poruke | CWE-209 | Bez putanja/verzija/stack-traceova klijentu | | [ ] Potpuno logiranje | - | Interno logirati potpunu grešku prije sanitizacije | | [ ] Bez panic u servisu | CWE-248 | Graceful Recovery, servis ostaje aktivan | | [ ] Stack-trace sačuvan | - | Re-Throw bez wrappinga | ==== Primjer: Sanitizirane poruke o greškama ==== (* ZABRANJENO - Previše informacija *) procedure HandleError(E: Exception); begin ShowMessage('Error in C:\Users\Admin\App\src\Database.pas:142: ' + E.Message); end; (* ISPRAVNO - Interno logirati, eksterno sanitizirati *) procedure HandleError(E: Exception); begin (* Interno potpuno logirati *) Logger.Error('Database error at %s: %s', [E.ClassName, E.Message]); (* Eksterno samo sanitizirana poruka *) raise EUserError.Create(rsDatabaseOperationFailed); end; ===== Dostupnost (DoS-zaštita) ===== ^ Provjera ^ CWE ^ Opis ^ | [ ] Rate Limiting | CWE-400 | Token Bucket po klijentu/endpointu | | [ ] Ograničenja veličine zahtjeva | CWE-400 | Odbiti prevelike payloade rano | | [ ] Sigurnost zaključavanja | CWE-667 | Mehanizam oporavka zaključavanja | | [ ] Čišćenje resursa | CWE-772 | try-finally, using, defer, RAII - uvijek | | [ ] Rukovanje timeout-om | CWE-400 | Timeout-ovi za sve vanjske operacije | ===== Sigurnost niti ===== ^ Provjera ^ CWE ^ Opis ^ | [ ] Obrađeno trovanje zaključavanja | CWE-667 | Oporavak od otrovanih lockova | | [ ] Bez race uvjeta | CWE-362 | Thread-safe strukture podataka | | [ ] Atomske operacije | CWE-362 | Za brojače, zastavice, dijeljeno stanje | | [ ] Prevencija deadlocka | CWE-833 | Redoslijed zaključavanja, timeout-ovi | ===== Audit i sukladnost ===== ^ Provjera ^ Standard ^ Opis ^ | [ ] Sve promjene logirane | ISO 27001 A.12.4 | Promjene podataka s korisnikom, timestampom, staro/novo | | [ ] Sigurnosni događaji logirani | NIS2 čl. 21 | Neuspjela autentifikacija, Rate Limiting, sumnjivi unosi | | [ ] Rotacija logova | - | Inkrementalni format | | [ ] Bez osjetljivih podataka u logovima | CWE-532 | Provjeriti slučajno otkrivanje | ===== Brza referenca - Po vrsti napada ===== ==== Kriptografski napadi ==== [ ] Spriječena ponovna uporaba nonce-a [ ] Mitgirani timing-napadi (konstantno vrijeme) [ ] Blokirani replay-napadi [ ] Spriječena enumeracija ključeva (nasumični ID-ovi) ==== Napadi na unos ==== [ ] Spriječen Buffer Overflow (ograničenja veličine) [ ] Spriječen Integer Overflow [ ] Obrađen neispravan unos [ ] Spriječena SQL Injection ==== Napadi na dostupnost ==== [ ] Spriječeno iscrpljivanje resursa (Rate Limiting) [ ] Obrađeno trovanje zaključavanja [ ] Spriječeno iscrpljivanje memorije ==== Otkrivanje informacija ==== [ ] Poruke o greškama sanitizirane [ ] Tajne obrisane nakon uporabe (Zeroization) [ ] Bez osjetljivih podataka u logovima ===== OWASP Top 10 Referenca ===== ^ Rang ^ Ranjivost ^ Prevencija u WvdS ^ | 1 | Broken Access Control | Provjeriti autorizaciju na svim endpointima | | 2 | Cryptographic Failures | Moderni algoritmi, Zeroization | | 3 | Injection | Parametrizirani upiti, validacija unosa | | 4 | Insecure Design | Threat Modeling, Defense in Depth | | 5 | Security Misconfiguration | Sigurne zadane postavke, bez debug u produkciji | | 6 | Vulnerable Components | Održavati ovisnosti ažurnima | | 7 | Auth Failures | MFA, Rate Limiting, Session-Management | | 8 | Data Integrity Failures | Potpisi, provjera integriteta | | 9 | Logging Failures | Strukturirano logiranje, Alerting | | 10 | SSRF | Validacija URL-a, segmentacija mreže | ===== Vidi također ===== * [[.:qualitaetssicherung|Pregled osiguranja kvalitete]] * [[.:sicherheit|Sigurnosne smjernice (opće)]] * [[.:audit-core|Osnovna kontrolna lista]] * [[.:debugging|Debugging]]