====== Varnostni kontrolni seznam ====== **KRITIS/NIS2-skladno** varnostno preverjanje na podlagi CWE ranljivosti in vzorcev napadov. Ta kontrolni seznam je **obvezen** pri spremembah: omrežja, avtentikacije, kriptografije, podatkovne baze, zunanjih API-jev. ===== Kdaj uporabiti ===== Ta kontrolni seznam uporabite, kadar sprememba zadeva: * Kriptografske operacije * Avtentikacijo / avtorizacijo * Omrežno komunikacijo * Dostop do podatkovne baze * Klice zunanjih API-jev * Nalaganje datotek * Uporabniške vnose ===== Kriptografska varnost ===== ^ Preverjanje ^ CWE ^ Opis ^ | [ ] Edinstvenost Nonce | CWE-323 | AES-GCM Nonce mora biti edinstven za vsako šifriranje | | [ ] Sledenje Nonce | CWE-323 | Sledenje uporabljenim Nonce, uveljavitev MAX_NONCES_PER_KEY | | [ ] Rotacija ključev | CWE-323 | Rotacija ključa po doseženi omejitvi Nonce | | [ ] Kriptografski RNG | CWE-330 | OpenSSL/OS CSPRNG za ključe/Nonce | | [ ] Naključni ID-ji | CWE-330 | Brez zaporednih ključev/ID-jev sej | | [ ] Primerjava s konstantnim časom | CWE-208 | Za tajne podatke, MAC, žetone, API-ključe | | [ ] Zaščita pred ponovitvijo | CWE-294 | Sledenje Nonce/časovnih žigov/zaporedja | | [ ] Šifriranje kanala | CWE-300 | mTLS za zunanjo komunikacijo | ==== Primer: Primerjava s konstantnim časom ==== (* PREPOVEDANO - Mogoč napad s časovnim stranskim kanalom *) function VerifyToken(const AToken, AExpected: string): Boolean; begin Result := AToken = AExpected; (* Prekine pri prvi razliki! *) end; (* PRAVILNO - Konstantni čas *) 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; ===== Varnost pomnilnika ===== ^ Preverjanje ^ CWE ^ Opis ^ | [ ] Brisanje pomnilnika | CWE-316 | Brisanje tajnih podatkov po uporabi | | [ ] Brez tajnih podatkov v dnevnikih | CWE-532 | Nikoli ne beležite ključev, gesel, žetonov | | [ ] Varna obdelava nizov | CWE-316 | SecureString (C#), secrecy (Rust) | | [ ] Ključni material izbrisan | CWE-316 | try-finally zagotavlja čiščenje ob izjemah | ==== Primer: Brisanje ==== procedure ProcessSecret(const ASecret: string); var LocalCopy: string; begin LocalCopy := ASecret; try (* Obdelava *) DoSomethingWith(LocalCopy); finally (* Izbris tajnega podatka - ne samo sprostitev! *) FillChar(LocalCopy[1], Length(LocalCopy) * SizeOf(Char), 0); LocalCopy := ''; end; end; ===== Validacija vnosov ===== ^ Preverjanje ^ CWE ^ Opis ^ | [ ] Omejitve velikosti | CWE-400 | Uveljavitev MAX_PAYLOAD_SIZE (privzeto: 64KB) | | [ ] Prekoračitev celega števila | CWE-190 | SafeAdd(), checked_add(), preverjena aritmetika | | [ ] Preverjanja null | CWE-476 | Na vseh mejah API | | [ ] Brez Unwrap pri vnosu | CWE-248 | Ustrezna obdelava napak, brez Panic | | [ ] Parametrizirane poizvedbe | CWE-89 | Nikoli konkatenacija nizov za SQL | | [ ] Validacija znakov | - | Seznam dovoljenih znakov za identifikatorje kjer je primerno | ==== Primer: Preprečevanje SQL Injection ==== (* PREPOVEDANO - Mogoč SQL Injection *) procedure GetUser(const AUsername: string); begin Query.SQL.Text := 'SELECT * FROM users WHERE name = ''' + AUsername + ''''; Query.Open; end; (* PRAVILNO - Parametrizirano *) procedure GetUser(const AUsername: string); begin Query.SQL.Text := 'SELECT * FROM users WHERE name = :username'; Query.ParamByName('username').AsString := AUsername; Query.Open; end; ===== Obdelava napak (varnost) ===== ^ Preverjanje ^ CWE ^ Opis ^ | [ ] Sanirane sporočila | CWE-209 | Brez poti/verzij/sledi sklada odjemalcu | | [ ] Popolno beleženje | - | Interno beleženje popolne napake pred saniranjem | | [ ] Brez Panic v storitvi | CWE-248 | Elegantna obnovitev, storitev ostane aktivna | | [ ] Ohranitev sledi sklada | - | Ponovno metanje brez ovijanja | ==== Primer: Sanirana sporočila o napakah ==== (* PREPOVEDANO - Preveč informacij *) procedure HandleError(E: Exception); begin ShowMessage('Error in C:\Users\Admin\App\src\Database.pas:142: ' + E.Message); end; (* PRAVILNO - Interno beleženje, zunanje saniranje *) procedure HandleError(E: Exception); begin (* Interno popolno beleženje *) Logger.Error('Database error at %s: %s', [E.ClassName, E.Message]); (* Zunanje samo sanirano sporočilo *) raise EUserError.Create(rsDatabaseOperationFailed); end; ===== Razpoložljivost (zaščita pred DoS) ===== ^ Preverjanje ^ CWE ^ Opis ^ | [ ] Omejevanje hitrosti | CWE-400 | Token Bucket na odjemalca/končno točko | | [ ] Omejitve velikosti zahtev | CWE-400 | Zgodnja zavrnitev prevelikih vsebin | | [ ] Varnost zaklepanja | CWE-667 | Mehanizem za obnovitev zaklepanja | | [ ] Čiščenje virov | CWE-772 | try-finally, using, defer, RAII - vedno | | [ ] Obdelava časovnih omejitev | CWE-400 | Časovne omejitve za vse zunanje operacije | ===== Varnost niti ===== ^ Preverjanje ^ CWE ^ Opis ^ | [ ] Obdelava zastrupljenih zaklepov | CWE-667 | Obnovitev iz zastrupljenih zaklepov | | [ ] Brez pogojev tekmovanja | CWE-362 | Nitno varne podatkovne strukture | | [ ] Atomarne operacije | CWE-362 | Za števce, zastavice, skupno stanje | | [ ] Preprečevanje mrtvih zaklepov | CWE-833 | Vrstni red zaklepanja, časovne omejitve | ===== Revizija in skladnost ===== ^ Preverjanje ^ Standard ^ Opis ^ | [ ] Vse spremembe zabeležene | ISO 27001 A.12.4 | Spremembe podatkov z uporabnikom, časovnim žigom, staro/novo vrednostjo | | [ ] Varnostni dogodki zabeleženi | NIS2 čl. 21 | Neuspešna avtentikacija, omejevanje hitrosti, sumljivi vnosi | | [ ] Rotacija dnevnikov | - | Inkrementalni format | | [ ] Brez občutljivih podatkov v dnevnikih | CWE-532 | Preverjanje nenamernega razkritja | ===== Hitra referenca - Po vrsti napada ===== ==== Kriptografski napadi ==== [ ] Preprečena ponovna uporaba Nonce [ ] Omiljeni napadi s časovnim stranskim kanalom (konstantni čas) [ ] Blokirani napadi s ponovitvijo [ ] Preprečeno naštevanje ključev (naključni ID-ji) ==== Napadi na vnose ==== [ ] Preprečen prekoračitev medpomnilnika (omejitve velikosti) [ ] Preprečena prekoračitev celega števila [ ] Obdelani nepravilni vnosi [ ] Preprečen SQL Injection ==== Napadi na razpoložljivost ==== [ ] Preprečena izčrpanost virov (omejevanje hitrosti) [ ] Obdelano zastrupljanje zaklepov [ ] Preprečena izčrpanost pomnilnika ==== Razkritje informacij ==== [ ] Sanirana sporočila o napakah [ ] Tajni podatki izbrisani po uporabi (brisanje) [ ] Brez občutljivih podatkov v dnevnikih ===== Referenca OWASP Top 10 ===== ^ Uvrstitev ^ Ranljivost ^ Preprečevanje v WvdS ^ | 1 | Broken Access Control | Preverjanje avtorizacije na vseh končnih točkah | | 2 | Cryptographic Failures | Sodobni algoritmi, brisanje | | 3 | Injection | Parametrizirane poizvedbe, validacija vnosov | | 4 | Insecure Design | Modeliranje groženj, obramba v globino | | 5 | Security Misconfiguration | Varne privzete nastavitve, brez razhroščevanja v produkciji | | 6 | Vulnerable Components | Ažuriranje odvisnosti | | 7 | Auth Failures | MFA, omejevanje hitrosti, upravljanje sej | | 8 | Data Integrity Failures | Podpisi, preverjanje celovitosti | | 9 | Logging Failures | Strukturirano beleženje, opozarjanje | | 10 | SSRF | Validacija URL, segmentacija omrežja | ===== Glejte tudi ===== * [[.:qualitaetssicherung|Pregled zagotavljanja kakovosti]] * [[.:sicherheit|Varnostne smernice (splošno)]] * [[.:audit-core|Kontrolni seznam Core]] * [[.:debugging|Razhroščevanje]]