# 10. Bezpečný kód
Metody autentizace a řízení přístupu. Biometrické metody autentizace, jejich dopady a problémy. Elektronický podpis a jeho použití. Autentizace strojů a aplikací. Zásady a principy bezpečného kódu. Typické bezpečnostní chyby na úrovni kódu, souběžnost, ošetření vstupů. Detekce bezpečnostních zranitelností, penetrační testování. Příklady z praxe pro vše výše uvedené. (PV157, PV286 , PV017, PV276)
---
Medzi **základné pojmy** patrí:
- **Hashovanie** - odtlačok (fingerprint) dát fixnej dĺžky, jedinečný (ideálne)
- Problém kolízií
- Po zmene dát sa musí zmeniť aspoň 50% výstup
- Jednosmernosť
- Bezkolíznosť (slabá, silná)
- Slabá - nájdenie kolízie pre daný fixný vstup
- Silná - ľubovolná dvojica vstupov, výhodnejšie pre útočníka
- **Kľúč**
- Rozsiahle reťazce bitov - náhodné čísla, prvočísla
- Symetrická kryptografia - rovnaký kľúč pre A,B
- Asymetrická kryptografia - privátny (podpis, dešifrovanie), verejný (overenie podpisu, šifrovanie)
- Realita - **hybridný kryptosystém**
- Asymetria - pomalé
- Symetria - rýchle
- Kombinujeme ich
- Kryptografické **primitivum** - jedna kryptografická funkcia
- Kryptografický **protokol** - algoritmus, ktorý zahŕňa dve (a viac) komunikujúce strany
- **Druhy a parametre** kľúčov:
- Symetrické (zdieľané)
- Asymetrické (verejné, súkromné)
- Bez kľúčové (hash, RNG)
**Kerckhoffov princíp**
- Algoritmus (postup) je všetkým známy
- Kľúč je tajná informácia - musí byť chránená
## Metódy autentizácie
- **Autentizácia** - proces overenia entity (a tým aj ustanovenie) identity (s požadovanou mierou záruky)
- čo poznáme (PIN, heslo)
- čo máme (kľúč, čipová karta)
- čo sme (biometria)
- niekde, kde sme
- vzťah 1:1
- **Identifikácia** - rozpoznanie určitej entity v danej množine entít - vzťah 1:N
- **Autorizácia** - udelenie určitých práv a určenie povolených aktivít
**Obecne**
- Krátke/slabé - iba pre ľudí
- Dostatočne dlhé - kryptografické kľúče
- Protokoly výzva-odpoveď
- Protokoly s nulovým šírením znalosti (**zero-knowledge**)
**Hesla, PIN, a podobne**
- Čo najjednoduchšie pre autorizovaných používateľov
- Čo najkomplikovanejšie pre neautorizovaných používateľov
**Autentizácia tajnou informáciou**
- Musí byť naozaj tajná
- Musí byť vybraná z veľkého priestoru možných hodnôt
- Ak dôjde ku kompromitácii hesla, musí byť možné zmeniť ho
### Bezpečnosť vs. ľudská pamäť
**Protokoly výzva-odpoveď**
- Odosiela sa náhodné číslo
- Vráti sa digitálne podpísané
**Druhy hesiel**
- Skupinová
- Unikátny pre každú osobu (userID = heslo)
- Neunikátny (spoločný s userID)
- Jednorázový (ne/unikátny)
**Ukladanie hesiel**
- Šifrované
- Hashované
**Hashovanie hesiel**
- Hodí sa nám jednosmernosť
- Funkcia je pomalá
- **Solenie** - salt
- Pridáme k heslu informáciu, s ktorou ho zahashujeme a to si uložíme s heslom
- Dlhšie efektívne heslo
- Riešenie pre rovnaké heslá (budú mať iný hash)
- Pepř - pepper
- Pridáme k heslu informáciu, s ktorou ho zahashujeme, ale uložíme ho bezpečne niekde inde
**Hashovanie hesiel v UNIX**
- Kedysi - DES 25x
- Teraz - SHA-2
- Shadow file
**Útoky**
- Cielený
- Plošný
- Online
- Offline
- Krádež hesla
- Slovníkový
- Permutácie písmen so znakmi a náhradami
- Slova, dáta, číslice súvisiace s užívateľom
- Hrubou silou
- Pomocné techniky, nástroje
**Úspešnosť útoku hrubou silou**
$$
\frac{\text{čas platnosti}\times\text{počet odhadov za jednotku času}}{\text{veľkosť abecedy}^{\text{dĺžka hesla}}}
$$
**Kde k útoku dochádza**
- Klient
- Databáza hesiel + kópie
- Server/host - pamäť
- Sieťová komunikácia
- Tvrdo zakódované heslá v aplikácii a HW
- Manuály a dokumentácia
**Prečo dochádza k zisteniu hesla**
- Užívatelia volia slabé heslá
- Servery a ich databáze sú častými cielmi
- Oddelené kanály nie sú oddelené
- Obnova hesla/prístupu je jednoduchšia ako iné útoky
**Expirácia hesla**
- Málo účinné
**Blacklist**
- Zakázané slabé heslá
**Odporúčanie**
- Fráze
- Dĺžka 8-10
- Používať nealfabetické znaky
- Presadzovať politiku hesiel (blacklist)
- Správca hesiel
**Generovanie kryptografického kľúča z hesla**
- Potreba kryptografického kľúča - generuje sa z hesla od užívateľa
- Entropia kľúča = entropia hesla (nízka)
- Známa funkcia PBKDF2
**Jednorázové hesla**
- Lamport hash chain
- HOTP HMAC One-time Password Algorithm
- OTP založené na čase
**Autentizácia obrazovou informáciou**
- Podobné ako PIN
**PIN (Personal Identification Number)**
- Lacnejšia klávesnica
- Zle sa pamätá
- Max 4 čísla
**Token**
- niečo, čo užívateľ má
- čo najjednoduchšie pre autorizovaných používateľov
- čo najkomplikovanejšie pre neautorizovaných užívateľov
- **Dilema** - cena výroby vs cena falšovania
- **Prevencia**
- Vybavenie
- Kontrola licencie
- Utajovanie určitých informácií
- **Najčastejšie tokeny**
- Karty
- Karta s magnetickým pruhom - Ľahko sa kopíruje
- Čipové karty
- Obvyklá - bankomatová
- SIM karta
- USB Token
- Autentizačné kalkulátory
**Čipová karta s procesorom**
- Podobná PC
- Nemá štandardné rozhranie
- Logická štruktúra karty
- Koreňový adresár MF (master file)
- Adresáre DF (dedicated file)
- Súbory EF (elementary file)
- Personalizované pre danú banku
- Je to **aktívny prvok** - dokáže robiť kryptografické výpočty
- Cieľom je **chrániť kľúč**
**Bezpečnosť čipových kariet**
- **Fyzická bezpečnosť**
- Odolnosť voči narušeniu - existuje prvok, ktorý chráni proti útočníkovi
- Zistiteľnosť narušenia - zistenie neautorizovanej modifikácie
- Detekcia narušenia - automatická detekcia narušenia
- Odpoveď na narušenie - po narušení napr. premaže hodnoty
**Klasifikácia útočníkov**
- Trieda 0 - script kiddies
- Trieda 1 - múdri útočníci bez "insider knowledge"
- Trieda 1.5 - úroveň akademických pracovníkov
- Trieda 2 - majú značné technické vzdelanie aj skúsenosti
- Trieda 3 - dobre finančne podporované organizácie
**Útoky na čipové karty**
- Logické
- Vyžadujú detailné znalosti o štruktúre karty
- Nevyžadujú špeciálne vybavenie
- Typy útokov
- Monitorovanie činnosti karty
- **Časová analýza**
- Zistenie s akým dlhým kľúčom algoritmus pracuje
- Aktivita procesora
- **Výkonová analýza**
- Analýza odberu energie
- Napr. čítačka chybového PINu
- Indukcia chýb behom činnosti
- Zmeníme napätie, teplotu, čo môže zrušiť ochranu
- Programové útoky cez API
- Využitie chýb, nedokumentovaných operácií
- Fyzické
- Invazívne - rekonštrukcia a analýza návrhu čipu
- Po útoku veľmi často prestáva fungovať
- Semi-invazívne
- Nedochádza k priamemu zničeniu čipu
- Využíva žiarenie, laser, elektromagnetické polia
**Autentizačné kalkulačky**
- Využívané v bankách
- Zabezpečené PINom
**Tokeny založené na hodinách**
- Je potrebné riešiť synchronizáciu
- Generovaný kód je závislý na čase
**Bezkontaktná karta**
- Založené na overení ID
- Ľahko sa dá skopírovať a replikovať
**FIDO token**
- Využíva techniky asymetrickej kryptografie
- **Výhody tokenov**
- Rýchlo sa zistí ich strata
- Nie sú jednoducho kopírovateľné
- Môžu sami o sebe spracovávať alebo prenášať ďalšie informácie
- **Nevýhody tokenov**
- Potrebuje špeciálnu čítačku
- Bez tokenu nie je autorizovaný používateľ rozpoznaný
- Token musí byť dostatočné zložitý
- Može prestať fungovať, čo nie je ľahko zistiteľné
## Riadenie prístupu
- Funkcie na riadenie, ktorý subjekt má aký prístup k určitému objektu
- Implementovaná bezpečnostným mechanizmom riadenia prístupu
- Zvyčajne sa upravuje nejaká tabuľka OS
**Pojmy**
- Vlastník dát
- Správca
- Užívateľ
**Typy obmedzenia**
- R, RW, X
- Čas
**Metódy**
- Centralizovaná správa
- Správca všetkých objektov
- Nastavuje kto, čo
- Výhoda - konzistencia
- Nevýhoda - vlastník nemôže nastavovať práva k svojim dátam
- Decentralizovaná správa
- Vlastník spravuje svoje vlastné dáta
- Nevýhoda - náročné zaistenie politík a konzistencie
- Výhoda - flexibilita
**Heslo**
- Rôznym heslom meníme prístup k objektom
- Napr. heslo na zápis, heslo na čítanie
- Jednoduché ale nepraktické
**Matica prístupových práv**
- Objekty - stĺpce
- Subjekty - riadky
- Obvykle ukladáme iba stĺpce (nazývame ACL)
- Alebo aj podľa riadkov (C-list)
- Môže byť aj trojrozmerná - tretí rozmer je program
- Máme trojice a k nim zodpovené prístupové práva
**Zoznam prístupových práv (ACL)**
- Ukladáme iba neprázdne prvky matice
- ACE (Access Control Element) - element prístupových práv
- Výhoda - obmedzovanie práv jednicov alebo skupiny
- Nevýhoda - ťažko vieme zistiť ku ktorým všetkým objektom má jeden používateľ prístup
**Implementácia ACL UNIX**
- User, Group, Other
- RWX, setuid, setgid, sticky (t) bit
- Nie je možné vybrať práve jedného jedinca, ktorému dávame prístup
- Nevieme zabezpečiť, že niekto zo skupiny nám nakopíruje súbory a nesprístupní ich
**Implementácia ACL moderný UNIX**
- Flagy navyše - append-only, immutable, undeletable
- Nastavuje sa pomocou chattr alebo pri bootu
- Využívajú sa klasické rwx + výnimky ACE
**POSIX ACL**
- Príkaz getfacl
- Subjekty user,group,other
- Zápis user:meno:rw-
- Pridáva sa aj maska, ktorá obmedzuje default práva
**Linux Capabilities**
- Práva rootu rozdelíme na menšie oprávnenia, ktoré pridelujeme procesom
- Napr. pridelovanie portov CAP_NET_BIND_SERVICE
**Implementácia ACL Windows**
- Dedičnosť
- Mnoho ďalších atribútov a možností
**Riadenie prístupu na čipových kartách**
- Implementované ako riadením prístupu k súborom
- Založené na PINoch
- Počet neúspešných odblokovaní je obmedzený
- PINy sú tiež uložené v súboroch
- Zmeny PINu sú viazané oprávnením
**Zoznam prístupových oprávnení**
- Capabilities, C-lists
- Ukladáme maticu po subjektoch
- Zvyčajne používané v certifikátoch
**Skupinové politiky**
- Vzťahujú sa na domény, PC alebo celé organizácie
**SAML**
- Štandard na popis a výmenu autentizačných a autorizačných dát
- Používaný predovšetkým na webu
- Single sign-on
**SAML token**
- Subject - používateľský identifikátor
- AuthnStatement - spôsob autentizácie
- AttributeStatement - ďalšie atribúty napr. príslušnosť k fakultám, skupinám
- AuthorizationStatement - autorizačné informácie, napr. zoznam rolí, povolených akcií
**Spustenie nedôveryhodného kódu**
- Autentizácia kódu
- Špeciálny jazyk neumožňujúci škodlivú činnosť
- Kontrolné programy - v praxi heuristiky
- Spustenie programu s minimálnymi právami (napr. nobody)
- Obmedzené prostredie - sandbox
**Podpora riadenia prístupu k HW**
- Fence address - oddelenie pamäťového priestoru na bezpečnú časť
- Deskriptory - základná adresa + limit pre každý proces
- Nedokážeme zdieľať pamäť medzi procesmi
- Segmentované adresovanie - segment + offset + atributy
- Dva režimy procesoru - autorizovaný, neautorizovaný
- Niekoľko režimov procesu tzv. rings
**Objektové programovanie**
- Private, protected
**Riadenie prístupu**
- Tzv. referenčný monitor
- Môže mať problémy - buffer overflow
- Veľa kódu OS je označené ako dôveryhodný napr. drivery
- Race condition - neatomickosť operácií prístupu k dátam
- Separácia oprávnení
- Na vykonanie operácie je potrebný súhlas viacerých strán
- OS toto nepodporuje
- Princip najmenších privilégií
- Užívateľ má iba tie práva, ktoré potrebuje a nič viac
- Princip default deny
- Povolené je iba to, čo je explicitne nastavené
- Tvorba blacklistov je náchylná na chyby
**Politiky riadenia prístupu**
- Voliteľný prístup (discretionary)
- chmod
- Subjekt, vlastník objektu, rozhoduje o tom kto má prístup
- Výhody - jednoduché, malá réžia, veľká vyjadrovacia schopnosť
- Nevýhody - nedostatočná bezpečnosť (neodolné voči trojským koňom)
- Povinný prístup (mandatory)
- SELinux
- Systémová politika nezávislá na vôli subjektov rozhoduje o to, kto má k objektu prístup
**Voliteľné**
- Ak nevyhovuje -> **Multilevel systems (MLS)**
**Povinné**
- Je žiadúce podporovať aj voliteľné riadenie prístupu
**Bell-LaPadula**
- Model Objekt-Subjekt
- Užívateľ má počiatočné bezpečnostné oprávnenie
- Subjektom je typicky proces - R, RW, X
- Klasifikácia je dvojica L = (C, S)
- $C \in \{TS, S, C, U\}$
- $S \in$ podmnožina množiny kategórii
- Stav systému S = (b, M, f)
- b - množina aktívnych prístupov
- M - matica prístupových práv
- f - úrovňová funkcia
- Stav je bezpečný ak sú splnené všetky bezpečnostné vlastnosti
- Subjekty sú rozdelené na dôveryhodné a nedôveryhodné
- NRU - no read up
- Nie je možné čítať dáta na vyšśej úrovni
- NWD - no write down
- Nie je možné zapisovať do nižšich úrovní
- \*-vlastnosť
- Čítať iba nižšie
- Zapisovať v rovnakej úrovni
- Pridávať aj vyššie
- Podporuje aj voliteľný (discretionary access)
**Problémy viacúrovňových systémov**
- Ako klasifikovať?
- Tendencia na príliš striktnú klasifikáciu
- Vývoj MLS býva komplikovaný a drahý
- Administrácia je náročná
- Užívateľ býva pri svojej práci príliš obmedzovaný
- Ako riešiť zníženie klasifikácie?
- Ako prepojiť viacero MLS systémov?
**Skrytý kanál - covert channel**
- Zneužitie zdieľaného prostriedku na šírenie informácii
- Napr. zaplnenie disku, pozícia hlavičky na disku, záťaž procesora
- Obrana - zavedenie šumu, zníženie šírky pásma
**Polyinštancia**
- Chránime informácie o existencii súborov
- Noninterference - vlastnosť, kedy akcie užívateľa na vyššej úrovni nijak neovplyvní to, čo vidí užívateľ na nižšej úrovni
- Riešenie - zavedieme konvencie pre pomenovanie
**Model Biba**
- Slúži k zaisteniu integrity
- Prevrátený model Bell-LaPadula
- Čítať je možné iba dáta vyššej úrovne
- Zapisovať je možné iba smerom dolu
**Dopad MLS**
- Trusted Path
- Trusted Distribution
- Trusted Facility Management
**SELinux**
- Je nadstavbou nad POSIX systémom oprávnení
- Rozhoduje sa na základe trojice identita:rola:typ a klasifikácia v MLS (voliteľné)
**Windows**
- Integritné úrovne
**Role Based Access Control (RBAC)**
- Zavedieme role, ktorým priradíme práva
- Užívateľov priraďujeme do rolí
- Príklad: ORACLE permissions
## Biometrické metódy autentizácie, ich dopady a problémy
**Biometriky**
- automatizované metódy identifikácie
- na základe meriteľných fyziologických dát
**Režimy použitia biometrik**
- Verifikácia - 1:1
- Identifikácia - 1:N
**Proces použitia**
- Registrácia
- Prvotné získanie biometrických dát
- Vytvorenie registračného vzorku
- Uloženie registračného vzorku (karta, snímač, stanica, server)
- Verifikácia/identifikácia
- Získanie biometrických dát
- Vytvorenie charakteristík
- Zrovnanie charakteristík
- Finálne rozhodnutie ano/nie
**Rozdiel medzi tokenom a biometriou**
- Variabilita - prahová hodnota
- Biometrická dáta nie sú nikdy 100% zhodné
**Chyba biometrických systémov**
- False acceptance
- False rejection
- Failure to enroll
- Failure to acquire
**Biometrické technológie**
- Fyziologické - odtlačok prstu, geometria ruky (statické)
- Behaviorálne - podpis, hlas (dynamické)
- Genotypické - geneticky založené (DNA)
- Fenotypické - ovplyvnené prostredím, vývojom (odtlačok prstu)
**Komerčné vs forenzné nástroje**
- Nízka presnosť vs vysoká
- Plne automatizované vs nutná intervencia
- Nekvalitné snímky znovu vs nie
- Uchovávame iba spracované charakteristiky vs aj pôvodné vzorky
## Elektronický podpis a jeho použitie
**Digitálny podpis**
- Musí zaistiť autentizáciu podpísaných dát
- Integrita
- Preukázanie pôvodu dát
- Mal by podporovať overenie dát/času podpisu
- Mal by byť overiteľný aj tretími stranami
- Mal by podporovať mechanizmy nepopierateľnosti (pôvodu a iné)
- Sám o sebe nezaisťuje dôvernosť - na to je šifrovanie
- Najznámejšie algoritmy - **RSA**, DSA
- Zvyčajne rozlišujeme
1. s obnovou správy (podpis obsahuje podpisované dáta)
2. bez obnovy správy (podpis neobsahuje dáta)
- Podpisuje sa väčšinou iba hash správy
- Postup
- Vytvorenie a registrácia kľúčov (certifikát)
- Vlastné podpisovanie
- Dokument -> Hash -> Podpis
- Nepoužívať rovnaký pár pre šifrovanie a podpisovanie
**Digitálny podpis** spojí nerozdeliteľne kľúč s identitou a vzniká **certifikát verejného kľúča**.
**Certifikačná autorita**
- Potvrdí platnosť verejného kľúča
- Musí byť zodpovedná
- Dokážeme jej, že danú entitu vlastníme
- Certifikáty majú vždy platnosť od/do
**Využitie podpisu**
- Autentizácia dát
- Autentizácia počítačov/tokenov
- Výzva-odpoveď
- Autentizácia osôb
**Typy podpisových schémat**
- Schémata s prílohou (pre overenie sú potrebné podpisované plaintext dáta)
- DSA (Digital Signature Algorithm)
- ElGamal
- Schnorr
- Schémata s obnovou správy (pre overenie nie je potrebné nič naviac ako podpis)
- RSA (Rivest-Shamir-Adleman)
- Rabin
- Nyberg-Rueppel
- Ľahko sa konvertujú na schéma s prílohou
**Certifikát**
- Obsahuje **verejný kľúč** užívateľa
- Je podísaný **súkromným kľúčom** certifikačnej autority
- Zaisťuje integritu kľúča a identitu osoby
**Obsah certifikátu**
- Označenie
- Bežný
- **Kvalifikovaný** = overený certifikačnou autoritou
- Začiatok a koniec platnosti
- Identifikácia osoby, pseudonym
- Unikátne ID
- Voliteľné: obmedzenie použitia
- Voliteľné: doplnkové údaje
- Podpis autority
**PKI**
- Infraštruktúra pre správu verejných kľúčov
- Bezpečnostná politika
- Procedúry
- Produkty
- Autority
**Komponenty PKI**
- Certifikačná autorita CA
- Registračná autorita RA
- Adresárová služba
**Proces vystavenia certifikátu**
- Generovanie kľúčových dát
- Príprava identifikačných údajov
- Presunutie kľúčových dát a údajov do PCS/RA
- Overenie informácií
- Tvorba certifikátu
- Vystavenie certifikátu
**Hierarchická štruktúra CA**
- Vzájomné prepojenie CA
- Neexistuje centrálna autorita
**Základné pojmy**
- **Integrita dát** - dáta neboli neautorizovane zmenené
- **Autentizácia pôvodu dát** - potvrdzujeme, že dáta pochádzajú z daného subjektu
**Metódy autentizácia dát a správ**
- Bez použitia kryptografie
- CRC
- S použitím kryptografie
**Elektronický podpis**
- Bez prívlastku
- Formálne bezvýznamná služba - mail, napísané meno ...
**Zaručený elektronický podpis**
- = Digitálny podpis
- Sám o sebe nám nedáva žiadnu záruku
**Čo podpisujeme?**
- V praxi nepodpisujeme celý dokument (pomalé)
- Iba hash
- Najprv dáta podpíšeme, až potom šifrujeme - analógia s listom v obálke
- Autenticitu sa snažime zachovať na dlhšiu dobu ako dôvernosť
**Bezpečnosť digitálneho podpisu**
- Musíme udržovať privátny kľúč v tajnosti
- Key recovery
- Rozdielny pár pre šifrovanie a podpisovanie
- Musíme zaistiť integritu verejného kľúča
- Pomocou certifikátu verejného kľúča
**Časová náročnosť**
- Existujú algoritmy, ktorých podpis je dlhšia operácia ako overenie a naopak
- RSA vs DSA EC
**Výpočetná bezpečnosť**
- Kedy bude algoritmus prelomiteľný hrubou silou
- Bezpečnosť je založená na faktorizácii veľkých čísel
**Hashovacie funkcie**
- Kryptografická hashovacia funkcia
- Není prostá - vznikajú kolízie
- Má výstup pevnej dĺžky
- Vlastnosti
- Jednosmernosť
- Bezkoliznosť - silná, slabá
- Bežné kryptografické hashovacie funkcie
- SHA-2
- SHA-3
- Hashovaciu funkciu môžeme vytvoriť z ľubovolnej blokovej symetrickej šifry
- Narodeninový paradox
**Kód na detekciu chýb**
- CRC
- Slúži na detekciu neúmyselných zmien
- Nie je kryptografická funkcia
**Autentizačný kód (digitálna pečať)**
- MAC
- Slúži k zaistení integrity dát, nie dôvernosti
- HMAC
- hash z kľúča + dát a ešte raz hash s kľúčom
- Chaffing and winnowing - zaistenie dôvernosti pomocou autentizácie
**Elektronická identifikácia - právna úprava**
- eIDAS
- Zaručený elektronický popis
## Autentizácia strojov a aplikácií
**Autentizácia počítačov**
- Na základe adresy (IP, MAC fyzická adresa)
- Na základe tajnej informáce (symetrická/asymetrická kryptografia)
**TLS/SSL**
- Autentizuje strany na základe certifikátu a protokolu challenge-response
- Povinná pre server, voliteľná pre klienta
- Zaisťuje dôvernosť, integritu a autenticitu dát
- Najprv prebehne iniciálny handshake, následne sa stanoví symetrický kľúč (Diffie-Hellman), ktorým je šifrovaný zvyšok komunikácie
**IPSec**
- Na zabezpečenie sieťovej vrstvy L4
**SSH**
- Aplikačný protokol na komunikáciu medzi klientom a serverom
- Používa symetrické a asymetrické šifrovanie podobne ako SSL/TLS
**SAML**
- Štandard založený na XML, popisuje autentizačné dáta
- Umožňuje služby Single Sign On
**Kerberos**
- Protokol a infraštruktúra na bezpečnú komunikáciu klientov a servero
- Ticket server
## Zásady a princípy bezpečného kódu
Základom bezpečného kódu je **defenzívne programovanie**.
- Overovať všetky vstupné dáta
- Ošetrenie aj tých situácií, o ktorých si myslíme, že nikdy nenastanú
- Pripraviť systém na jednoduché testovanie (Dependency Injection, dekompozícia)
- Logovanie udalostí
Ďalšie metódy:
- Použitie **bezpečného jazyka** (napr. pamäťový model, garbage collector) - Rust, Secure C
- Použitie striktného režimu prekladača
- Používať nízke prístupové práva
- Spúštanie aplikácie v sandboxe (Docker, GNU Jail)
- Dôkladné testovanie, code reviews, statická a dynamická analýza
- Z hľadiska kryptografie - používať overené knižnice (OpenSSL)
- Je nutné sledovať vývoj a vzniknuté chyby, dependency chain attacks
- Používať bezpečné funkcie (C, C++ sprintf miesto printf), nepoužívať obsolete funkcie
- Používať CI/CD
- Riadiť sa princípom deny-by-default
## Typické bezpečnostné chyby na úrovni kódu, súbežnosť a ošetrenie vstupov
Existuje **zoznam najčastejších bezpečnostných chýb** v jazykoch, a ako ich opraviť:
- Common Weakness Enumeration (**CWE**)
- OWASP Top 10 - webové aplikácie
Musíme sledovať zoznam **aktuálnych bezpečnostných dier**:
- Common Vulnerabilities and Exposures (**CVE**)
**Typické chyby**:
- Injection - vloženie vlastných inštrukcií do dát, ktoré potom program vykoná (SQL Injection, XSS)
- Prepared Statements
- Execute Disable Bit
- Absence of Logging and Monitoring
- Race Condition - (**súbežnosť**) súčasný zápis a čítanie do zdieľanej pamäte medzi vláknami
- Riešime označením kritickou sekciou, mutex, semafor, a podobne (synchronizačné primitíva)
- Lock-free štruktúry (podpora CPU)
- Musíme dávať pozor na **deadlock**
- Buffer Overflow - zapisujeme dáta za reálnu veľkosť dátovej štruktúry (prepisujeme si iné dáta)
- Vieme zamedziť použitím "canary", má ale overhead na beh programu
- Buffer Overread - vieme čítať dáta za reálnu veľkosť dátovej štruktúry
- Stack Exhaustion - vyplýtvanie miesta na zásobníku
- Heap Exhaustion - vyplýtvanie miesta na halde
- Use of Uninitialized Memory - veľmi nepríjemné, ak zabudneme inicializovať premennú a máme nedeterministické chovanie programu
- Detekovať pomocou statickej a dynamickej analýzy kódu
- Type Overflow - pretečenie hodnoty napr. `INT_MAX+1`
- Checked types (Rust)
- Zakázať implicitné konverzie
- Floating Point Error - problém s dátovým typom IEEE 754, float, double
- Použiť dátový typ Decimal
- Off-by-one Error - zvyčajne problém s indexami pri prechode dátovou štruktúrou
- Detekovať pomocou statickej analýzy kódu
- Internal Structure Leaking - odosielame potenciálnemu útočníkovi užitočné informácie o našom systéme (verzia Nginx, Apache, Windows, Linux Kernel, OpenSSL, ...), prípadne mu dávame nápovedu, prečo dostal chybu (napr. uživateľ existuje miesto Server Error)
Pri programovaní sa riadime prístupom **fail-first** - akonáhle detekujeme nevalidné dáta, prerušíme beh programu.
## Detekcia bezpečnostných zraniteľností, penetračné testovanie
Chyby **detekujeme** pomocou:
- Statické a dynamické analýzy kódu (valgrind, callgrind)
- Taint analysis
- Fuzzing
- Automata-based modeling
- Mutation testing
- Security review
Za behu programu vieme detekovať, či do kódu niekto nezasahuje pomocou **anti-tampering techník**.
- Kontrola stavu programu pred volaním funkcie alebo pred if/else blokom
- Kontrola checksums a hashov
- Honeypots
- Platí aj pre HW (čipové karty a podobne)
**Penetračné testovanie** spočíva v špecifickom hľadaní bezpečnostných chýb v nejakom softvérovom riešení.
- Môže byť interné (náš tím) alebo externé (firma tretej strany)
- Blackbox (máme iba binárku) / whitebox (máme zdrojový kód) / greybox (máme binárku a dokumentáciu)
- Bug bounty
- Disassembly
## Príklady z praxe
**Autentizácia do GSM**
- Využíva SIM kartu
- SIM obsahuje tajný symetrický kľúč, ktorý sa porovnáva v autentizačnom centre siete
**Autentizácia e-bankovníctvo, autorizácia finančných transakcií**
- Využíva dvojfaktorovú autentizáciu
- Čísla CVC
- PIN
- Biometria
**Štruktúra bankovej siete**
- HSM - hardverové bezpečnostné moduly zabezpečujú uloženie kľúčov
- DES / 3DES
**Online verifikácia PINu**
- Odoslanie zašifrovaného PIN bloku do banky HSM, kde sa porovnáva s novo-vygenerovaným PINom
**Špecifikácia EMV**
- Definuje štandardy čipových kariet
**Offline autentizácia dát na čipovej karte**
- Komunikácia medzi terminálom a kartou štandardu EMV
- SDA (iba overenie certifikátu), DDA (SDA + verifikácia privátneho kľúča karty), CDA (DDA + zahrnutý kryptogram offline transakcie)
- Založená na asymetrickej kryptografii
- Detekcia falošných kariet