# 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