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