3 · Zabezpečení softwaru
Zabezpečení softwaru
- Tohle je úvod do kyberbezpečnosti CS50.
- Tento týden se zaměříme na zabezpečení softwaru, který používáš nebo vytváříš.
- Minule jsme představili různé útoky, kterými od tebe mohou útočníci získat informace.
Phishing
- Představili jsme phishing, při kterém tě útočník podvodem přiměje poskytnout nějaké informace.
Ve zdrojovém kódu webu, například v jazyce HTML, můžeš narazit na tento kód:
<p>...</p>Značí začátek a konec odstavce. Obsahuje otevírací a uzavírací značku.
- Podobně odkazy používají speciální značku nazývanou anchor, která uživatele přenese z jedné stránky na jinou.
Kód takového odkazu vypadá následovně:
<a href="https://harvard.edu">Harvard</a>Jde o značku odkazu: kliknutím na slovo „Harvard“ navštíví uživatel harvard.edu.
- Na skutečné stránce můžeš na odkaz najet myší a zjistit, kam přesně vede.
- Útočníci mohou využít tvé nepozornosti a tvrdit, že odkaz vede na jeden web, přestože ve skutečnosti vede jinam.
Mohou například použít tento kód:
<a href="https://yale.edu">https://harvard.edu</a>Odkaz podvodně zobrazuje https://harvard.edu, ale otevře yale.edu. Uživatel si myslí, že kliká na Harvard, a ve skutečnosti navštíví Yale.
- Představ si, jak může útočník touto strategií vyvolat dojem, že navštěvuješ jeden web, zatímco se nacházíš na jiném.
- Útočníci často vytvářejí falešné verze webů pouze proto, aby uživatelé zadali citlivé údaje. Kdybys například byla studentkou Harvardu na falešném harvardském webu, mohla by ses pokusit přihlásit a předat útočníkovi uživatelské jméno i heslo.
Vkládání kódu
- Cross-site scripting, zkráceně XSS, je útok, při kterém je web prostřednictvím uživatelského vstupu přiměn ke spuštění škodlivého kódu.
- Například při vyhledání slova „cat“ na Googlu se toto slovo zobrazí i jinde na stránce spolu s počtem výsledků hledání.
- Představ si, že útočník znalý webových technologií místo běžného vstupu vloží kód a pokusí se tím web přimět, aby ho spustil.
Do vyhledávacího pole by například mohl zkusit vložit:
<script>alert('attack')</script>Skript zobrazuje upozornění s textem „attack“. Google takové upozornění díky svému zabezpečení nezobrazí; příklad představuje to, o co by se mohl útočník pokusit.
- Pokud web slepě zkopíruje uživatelský vstup a zobrazí přesně to, co útočník napsal, je to závažný bezpečnostní problém.
Odražený útok
- Odražený útok, reflected attack, zneužívá způsob přijímání vstupu webem. Přiměje prohlížeč odeslat požadavek, jehož výsledek zaútočí na uživatele.
Představ si, že někdo podvodem přiměje uživatele kliknout na takovýto odkaz:
<a href="https://www.google.com/search?q=%3Cscript%3Ealert%28%27attack%27%29%3C%2Fscript%3E">cats</a>Odkaz obsahuje přesně předchozí skript, který má na obrazovce vyvolat upozornění „attack“.
- Uživatelova akce tak přiměje jeho vlastní prohlížeč, aby útok odrazil zpět proti němu.
Uložený útok
- Web může být zranitelný také vůči útoku, při němž je podveden k uložení škodlivého kódu.
- Představ si odeslání škodlivého kódu e-mailem. Pokud poskytovatel e-mailu slepě přijme jakýkoli zaslaný kód, může se obětí útoku stát každý příjemce zprávy.
Escapování znaků
- Služby se proti takovým útokům chrání escapováním znaků. Software má escapovat potenciálně problémové znaky, které mají zvláštní význam v programovacím či značkovacím jazyce.
Například tento kód:
<p>About 6,420,000,000 <script>alert('attack')</script></p>zabezpečený software vypíše takto:
<p>About 6,420,000,000 <script>alert('attack')</script></p>Zápis je trochu nepřehledný, ale
<slouží k escapování znaku, který by mohl představovat hrozbu. Výstupem je potom pouze textová reprezentace škodlivého kódu.- Mezi běžně escapované znaky patří:
<: znak menší než,<.>: znak větší než,>.&: ampersand,&.": dvojité uvozovky,".': jednoduché uvozovky,'.
HTTP hlavičky
- HTTP hlavičky jsou další informace či pokyny předávané prohlížeči.
Podívej se na následující hlavičku:
Content-Security-Policy: script-src https://example.com/Tato bezpečnostní politika povolí JavaScript z odpovídajícího zdroje v samostatných souborech, obvykle s příponou .js. Inline skripty uvnitř HTML bez dalšího povolení prohlížeč nespustí.
Podobně může následující hlavička omezit načítání CSS na externí soubory:
Content-Security-Policy: style-src https://example.com/style-srcv tomto příkladu vymezuje povolený zdroj stylů; přednáška tím ilustruje omezení vložených stylů a použití souborů .css.
SQL injection
- Structured Query Language, tedy SQL, je jazyk, který umožňuje získávat konkrétní informace z databáze.
- Zvaž, jak by útočník mohl přimět SQL ke spuštění škodlivého kódu.
Podívej se na tento SQL kód:
SELECT * FROM users WHERE username = '{username}'Uživatelem zadané jméno se zde vloží přímo do SQL kódu.
- Uživatelskému vstupu nikdy nedůvěřuj.
- Vstup musí být bezpečně zpracován; původní poznámky to popisují jako vyčištění a escapování všech vstupů.
Představ si, že útočník do pole pro uživatelské jméno vloží:
malan'; DELETE FROM users; –-Kromě uživatelského jména tak vkládá také škodlivý kód.
Výsledkem je tento dotaz:
SELECT * FROM users WHERE username = 'malan'; DELETE FROM users; --'Škodlivý vstup přidá do dotazu další příkaz. V tomto nebezpečném příkladu se ze systému odstraní všichni uživatelé, tedy každý účet.
Představ si, že systém požaduje uživatelské jméno a heslo pomocí následujícího dotazu:
SELECT * FROM users WHERE username = '{username}' AND password = '{password}'Dotaz pracuje s oběma údaji od uživatele.
Útočník by do pole pro heslo mohl vložit:
' OR '1'='1Potom se spustí následující SQL kód:
SELECT * FROM users WHERE username = 'malan' AND password = '' OR '1'='1'Z hlediska logiky dotazu vede tato podmínka k vrácení všech uživatelů v databázi.
Aby to bylo zřetelnější, podívej se na přidané závorky:
SELECT * FROM users WHERE (username = 'malan' AND password = '') OR '1'='1'Kód zobrazí buď uživatele, pro které platí kombinace jména a hesla, NEBO všechny uživatele.
- Vložená druhá podmínka je vždy pravdivá. Útočník tak může přes tuto zranitelnost získat informace o všech uživatelích systému včetně správce.
Připravené dotazy
- Prepared statements, připravené či parametrizované dotazy, bezpečně oddělují strukturu databázového dotazu od vstupních hodnot.
- V původním zjednodušeném výkladu zajišťují, že je uživatelský vstup správně escapovaný.
Následující kód:
SELECT * FROM users WHERE username = '{username}'nahradí zápisem:
SELECT * FROM users WHERE username = ?Původní poznámky to ilustrují náhradou apostrofu
'dvojicí''. Předchozí útok pak při bezpečném zpracování hodnoty odpovídá této reprezentaci:SELECT * FROM users WHERE username = 'malan''; DELETE FROM users; --'Apostrof za slovem „malan“ je zdvojený, takže vložený škodlivý příkaz nemá význam samostatného SQL kódu.
- V tomto příkladu je tedy škodlivý text zpracovaný jako data a škodlivý kód se nespustí.
Command injection
- Příkazová řádka umožňuje ovládat počítač textovými příkazy místo klikání na nabídky a tlačítka.
- Útok command injection vloží příkaz určený ke spuštění přímo v systému pod aplikací.
- Když se uživatelský vstup předá příkazové řádce jako příkaz, následky mohou být katastrofální.
- Dvěma častými rizikovými místy jsou
systemaeval. Předání neošetřeného uživatelského vstupu může umožnit spuštění škodlivých příkazů v systému. - Vždy si přečti dokumentaci a zjisti, jak vstup bezpečně zpracovat a případně escapovat.
Vývojářské nástroje
- Vraťme se k HTML a webu.
- Vývojářské nástroje v prohlížeči ti umožní prohlížet část kódu, který stojí za webovou stránkou.
Podívejme se, co přes tyto nástroje můžeš dělat. Následuje ukázka vstupního prvku:
<input disabled type="checkbox">Jde o zaškrtávací políčko, checkbox. Atribut
disabledje deaktivuje, takže ho běžným kliknutím nelze použít.- Bezpečnostní obtíž spočívá v tom, že HTML je uložené také na počítači uživatele. Ten tedy může změnit svou lokální kopii.
Uživatel může pomocí vývojářských nástrojů HTML na vlastním počítači upravit:
<input type="checkbox">Z lokální kopie byl odstraněn atribut
disabled.- Nikdy nedůvěřuj pouze validaci na klientovi.
Podobně zvaž toto HTML:
<input required type="text">Vyplnění tohoto textového vstupu je označené jako povinné.
Někdo s přístupem k vývojářským nástrojům může povinnost odstranit:
<input type="text">Atribut
requiredzmizel.- Ani v tomto případě nelze spoléhat na to, že samotná klientská validace zajistí bezpečnost webové aplikace.
Validace na serveru
- Serverová validace kontroluje, že je uživatelský vstup přijatelný a bezpečný.
- Podrobnosti přesahují rozsah této přednášky, ale základní princip je jednoduchý: vstup se musí ověřovat na serveru. Uživatelskému vstupu nikdy nedůvěřuj.
Cross-site request forgery (CSRF)
- Další hrozbou je cross-site request forgery, zkráceně CSRF.
- Weby používají mimo jiné dvě základní metody interakce: GET a POST.
- GET získává informace ze serveru.
Přednáška používá ilustrační nákupní scénář s tímto HTML:
<a href="https://www.amazon.com/dp/B07XLQ2FSK">Buy Now</a>V hypotetickém příkladu by jediné kliknutí vyvolalo nákup produktu.
- Představ si, že někdo uživatele přiměje koupit něco, co koupit nechce.
Mohl by vložit obrázek, jehož načtení automaticky odešle požadavek na nákup:
<img src="https://www.amazon.com/dp/B07XLQ2FSK">Adresa v ukázce neposkytuje obrázek. Prohlížeč se ale pokusí provést GET na tuto stránku, což by v popsané zranitelné aplikaci mohlo způsobit neoprávněný nebo nechtěný nákup.
- Útočníci mohou podobně zneužít také POST.
Podívej se na HTML tlačítka „Buy Now“:
<form action="https://www.amazon.com/" method="post"> <input name="dp" type="hidden" value="B07XLQ2FSK"> <button type="submit">Buy Now</button> </form>Tento formulář by mohl vyvolat mylný dojem, že je uživatel před neoprávněným nákupem chráněn. Obsahuje skrytou hodnotu, kterou by hypotetická aplikace používala při ověřování. Programátor by proto mohl považovat uživatele za bezpečné.
- Jako u mnoha jiných zneužití je ale tento pocit bezpečí neopodstatněný.
Několik dalších řádků může předchozí ochranu obejít. Představ si, že útočník umístí na svůj web, tedy mimo Amazon, tento kód:
<form action="https://www.amazon.com/" method="post"> <input name="dp" type="hidden" value="B07XLQ2FSK"> <button type="submit">Buy Now</button> </form> <script> document.forms[0].submit(); </script>Kód najde formulář na stránce útočníka a automaticky ho odešle.
- Podstatou CSRF je právě možnost přimět uživatele, aby nechtěně provedl akci na jiném webu.
- Jednou z ochran je CSRF token: server vytvoří pro uživatele tajnou hodnotu a při odeslání ověří, že přijatý token odpovídá tomu očekávanému.
- Tyto tokeny se často předávají v HTTP hlavičkách.
Spuštění libovolného kódu (ACE)
- Arbitrary code execution, ACE, je spuštění kódu, který nepatří k zamýšlenému fungování softwaru.
- Jednou z hrozeb je buffer overflow, přetečení vyrovnávací paměti. Software dostane příliš mnoho vstupních dat, která přetečou do jiných částí paměti a naruší fungování programu. Například očekává krátký vstup, ale uživatel zadá extrémně dlouhý.
- Podobnou hrozbou je stack overflow, přetečení zásobníku. Přetečení může umožnit vložení a spuštění škodlivého kódu.
- Takové útoky lze někdy použít ke crackingu: obejití registrace nebo platby za software.
- Mohou také souviset s reverzním inženýrstvím, při kterém se zkoumá, jak kód funguje.
Software s otevřeným zdrojovým kódem
- Jedním z přístupů k řešení podobných hrozeb je používat a vytvářet open-source software. Jeho zdrojový kód je veřejně dostupný na internetu.
- Kód lze auditovat a hledáním a opravami chyb omezovat bezpečnostní hrozby.
- I takový software však může být zranitelný vůči útokům.
Software s uzavřeným zdrojovým kódem
- Closed-source software je opakem open-source softwaru.
- Jeho kód není veřejně dostupný. Původní poznámky uvádějí jako možnou výhodu, že do něj útočníci nemohou jednoduše nahlížet.
- Jde ale o kompromis: u otevřeného kódu mohou zranitelnosti hledat tisíce očí, u uzavřeného kódu je obsah před veřejností skrytý.
Obchody s aplikacemi
- App stores provozují například Google a Apple. Kontrolují předkládaný software a hledají škodlivé záměry.
- Instalace pouze schváleného softwaru může poskytovat větší ochranu než instalace aplikací libovolného vývojáře mimo obchod.
- Obchody využívají kryptografii k přijímání softwaru podepsaného oprávněnými vývojáři. Software následně opatřují digitálními podpisy, takže operační systém může ověřovat instalaci oprávněného a podepsaného softwaru.
Správci balíčků
- Správci balíčků používají podobné podepisovací mechanismy pro ověření důvěryhodnosti toho, co stahuješ od třetích stran. Úplnou bezpečnost ale nezaručují.
- Stále se snažíme zvyšovat překážky, které útočník musí překonat, aby nainstaloval škodlivý kód.
Bug bounty
- Bug bounty jsou placené příležitosti k hledání a odpovědnému hlášení zranitelností softwaru.
- Odměna může přesvědčit potenciálního útočníka, aby místo zneužití zranitelnost nahlásil a nechal si za nalezení zaplatit.
Identifikace zranitelností
- Vývojáři mohou sledovat databázi Common Vulnerabilities and Exposures a identifikátory CVE, aby zjistili, jaké zranitelnosti se ve světě řeší.
- Mohou používat také Common Vulnerability Scoring System, CVSS, který hodnotí závažnost zranitelností.
- Exploit Prediction Scoring System, EPSS, pomáhá odhadovat pravděpodobnost zneužití a stanovovat priority bezpečnostní práce.
- Katalog Known Exploited Vulnerabilities, KEV, obsahuje známé zranitelnosti, u nichž bylo pozorováno aktivní zneužívání.
Co jsme probrali
V této lekci jsme se věnovali zabezpečení softwaru. Probrali jsme:
- Jak útočníci využívají phishing, vkládání kódu, odražené útoky, SQL injection a uložené útoky k pronikání do softwaru.
- Jak escapování znaků, HTTP hlavičky, připravené dotazy a serverová validace pomáhají jejich útoky překazit.
- Jak obchody s aplikacemi, správci balíčků a podpisy vývojářů pomáhají bránit instalaci škodlivého kódu.
- Jak odborníci na kyberbezpečnost sledují zneužívání zranitelností.
Uvidíme se příště!