====== 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]]