Bug bounty: trpezlivosť ako zbraň

V tomto článku sa podrobnejšie pozrieme na to, čo znamená pojem Bug Bounty, ako uvažujú profesionálni bug bounty hunteri a prečo aj na prvý pohľad neškodné chyby môžu predstavovať vážne bezpečnostné riziko. Ukážeme si, ako možno z menej závažných zraniteľností vyťažiť maximum a premeniť ich na chyby, ktoré sú klasifikované ako high alebo critical. Práve schopnosť odhaliť skrytý potenciál zdanlivo nevinných problémov odlišuje bežných lovcov chýb od tých najúspešnejších.

Ako funguje Bug Bounty a kto sú lovci chýb?

Program Bug Bounty predstavuje príležitosť, prostredníctvom ktorej spoločnosti a organizácie ponúkajú finančné odmeny za zodpovedné odhalenie a nahlásenie bezpečnostných zraniteľností (bugov) v ich softvérových, webových a iných informačných systémoch.

Bug bounty hunteri sú bezpečnostní odborníci, ktorí majú technické znalosti, schopnosť myslieť ako útočník a vysokú motiváciu nachádzať bezpečnostné slabiny. Ich úlohou je identifikovať, dôkladne zdokumentovať a následne zodpovedne nahlásiť nájdené slabiny v informačnom systéme. Za svoj objav potom môžu získať finančnú odmenu, odborné uznanie a často aj prestíž v bezpečnostnej komunite.

Prehliadnuté, no stále nebezpečné

Úspech v programe Bug Bounty sa často začína dôkladným prieskumom cieľa. Prieskum (recon) nie je len o spustení niekoľkých skriptov alebo nástrojov. Je to premyslený a systematický proces, počas ktorého sa lovci chýb snažia pochopiť, ako je cieľový systém postavený a čo všetko ho tvorí. Ak sa niekto sústredí iba na hlavnú doménu a ignoruje ostatné časti systému, môže mu uniknúť množstvo dôležitých informácií.

Subdomain enumeration býva často zanedbávanou súčasťou prieskumu, hoci sa práve tam často skrývajú tie najzaujímavejšie nálezy. Často ide o miesta s oslabenou ochranou alebo o systémy, ktoré už dávno unikli pozornosti bezpečnostných tímov. Práve preto sa na týchto subdoménach objavujú zraniteľnosti, ktoré pretrvávajú dlhé obdobia bez povšimnutia a ktoré môžu pri správnom prístupe priniesť veľmi zaujímavé výsledky. Bug bounty hunter tak môže vďaka dôkladnému reconu objaviť subdoménu, ktorú pred ním prehliadlo aj ďalších sto iných výskumníkov. A práve tam môže čakať zraniteľnosť s vysokým dopadom.

Niekedy, aj napriek úspešnému odhaleniu chyby, je často označená len za nízko rizikovú alebo informatívnu. Z pohľadu firmy nejde o nič, čo by vyžadovalo okamžitý zásah. Vyhodnotí sa to ako nízke riziko a jednoducho sa to odloží bokom. No práve tu sa skrýva riziko, ktoré si mnohí neuvedomujú. Takéto „nevinné“ chyby môžu v kombinácii s inými zraniteľnosťami otvoriť cestu k obchádzaniu bezpečnostných opatrení alebo spôsobiť nečakaný dopad.

Osobitnou kapitolou sú situácie, keď do hry vstupuje WAF (Web Application Firewall). Mnohí výskumníci sa zastavia pri prvom zablokovaní. Keď ich payload neprejde, jednoducho pokračujú ďalej. No tí, ktorí majú chuť experimentovať, hľadať obchádzky a skúšať rôzne formáty, často objavia cestu, ktorú iní prehliadli. WAF predstavuje prekážku, nie koniec. A za touto prekážkou sa často skrýva niečo s reálnou hodnotou.

Trpezlivosť je tichá sila

V prostredí bug bounty je trpezlivosť jednou z najcennejších vlastností lovca. Často sa stáva, že aplikácia na prvý pohľad vyzerá bezpečne, koncové body nevracajú žiadne zaujímavé údaje a žiadna z ciest nevedie k odhaleniu zraniteľnosti. V takýchto situáciách prichádza na rad vytrvalosť. Skúmanie okrajových prípadov, štúdium dokumentácie, opakované prechádzanie rovnakých funkcií s novým pohľadom, testovanie rôznych kombinácií vstupov alebo dôkladná analýza logiky. Bug bounty nie je len o technických zručnostiach, ale aj o ochote stráviť hodiny bez okamžitého výsledku s vierou, že aj jeden prehliadnutý detail môže priniesť prelomový objav.

Rovnako dôležité ako nájsť zraniteľnosť je aj schopnosť maximalizovať jej potenciálny dopad. V programoch bug bounty sa často stáva, že nález, ktorý by bol na prvý pohľad klasifikovaný ako „nízky“ alebo „stredný“ a ocenený niekoľkými stovkami dolárov, môže mať v skutočnosti oveľa väčší potenciál. Dôkladnejšia demonštrácia dopadu alebo navrhnutie realistického scenára zneužitia môže tento nález posunúť do kategórie „vysoký“ alebo dokonca „kritický“, čo môže znamenať odmenu v tisícoch dolárov. Report bez jasnej demonštrácie zneužitia má v bug bounty menšiu hodnotu. Nezáleží len na technickej presnosti, ale aj na schopnosti uvažovať ako útočník a vytvoriť uveriteľný scenár útoku.

Čo je bug chaining?

Bug chaining (reťazenie chýb) je technika, pri ktorej sa kombinujú dve alebo viac zraniteľností s nízkou závažnosťou, aby sa vytvorila zraniteľnosť s vysokou závažnosťou. Samostatne tieto chyby nemusia predstavovať významné reálne riziko a možno by sa ani nedali zneužiť. Ak ich však útočník dokáže správne prepojiť, spoločne môžu obísť bezpečnostné mechanizmy a umožniť útoky, ktoré by inak neboli možné.

Od zraniteľnosti Open Redirect po Account takeover

Tento scenár demonštruje ako kombinácia dvoch zdanlivo nenápadných zraniteľností Open Redirect a verejne dostupného súboru phpinfo.php môže viesť k vážnemu bezpečnostnému problému konkrétne k prevzatiu používateľského účtu.

Príklad útoku:

Webová stránka obsahuje zraniteľnosť typu open redirect, ktorá umožňuje presmerovanie používateľa na ľubovoľnú URL adresu zadanú v parametri url. Útočník tak môže nasmerovať obete na škodlivé webové stránky.

  • http://example.com/clanok/openredirect.php?url=//attacker.com

Verejne prístupný súbor phpinfo.php odhaľuje citlivé informácie o konfigurácii servera.

  • http://example.com/clanok/phpinfo.php

V niektorých prípadoch je možné zraniteľnosť open redirect zneužiť na vloženie a spustenie škodlivého JavaScript kódu priamo v prehliadači obete.

  • http://example.com/clanok/openredirect.php?url=javascript:alert(1)

Naším cieľom je preukázať, ako je možné zneužiť zraniteľnosť typu Open Redirect na prevzatie používateľského účtu. Bežné bezpečnostné opatrenia, ako je nastavenie atribútu HttpOnly pre session cookie (ktorý zabraňuje prístupu k súboru cookie cez JavaScript), boli implementované.

Napriek týmto opatreniam sme objavili alternatívny spôsob získania session cookie. Zistili sme, že stránka phpinfo.php odhaľuje informácie o serveri vrátane hodnoty HTTP_COOKIE v sekcii Environment. Táto hodnota obsahuje session cookie a je prístupná každému, kto navštívi stránku phpinfo.php.

Stránka s výstupom phpinfo()
Stránka s výstupom phpinfo()

Útočník môže vytvoriť špeciálne upravený XSS payload, ktorý zneužíva zraniteľnosť Open Redirect na krádež session cookies obete. Tento kód je navrhnutý tak, aby sa po spustení v prehliadači obete (na strane klienta) pokúsil získať citlivé informácie z výstupu stránky phpinfo.php. Konkrétne, útočník cielene extrahuje hodnotu HTTP_COOKIE, ktorá obsahuje session cookie obete. Následne tento škodlivý kód odosiela ukradnuté cookies na server ovládaný útočníkom.

XSS payload
XSS payload

Ak nič netušiaca obeť klikne na škodlivý odkaz obsahujúci tento špeciálne upravený XSS payload, jej webový prehliadač automaticky vykoná vložený škodlivý kód JavaScriptu. Následne útočník dekóduje base64 dáta a získa session cookie:

Server útočníka
Server útočníka

Tento scenár zdôrazňuje, že vo svete Bug Bounty nie je vždy najefektívnejšie okamžite reportovať každú nájdenú zraniteľnosť. Namiesto toho je často výhodnejšie zastaviť sa, premyslieť si širší kontext a hľadať prepojenia medzi jednotlivými zraniteľnosťami. Aj tie zraniteľnosti, ktoré sa na prvý pohľad zdajú ako nízko alebo stredne závažné, môžu v kombinácii viesť k devastujúcemu útoku s úplným kompromitovaním používateľského účtu

Keď XSS a CSRF spolupracujú

Vo svete bug bounty tvoria XSS (Cross-Site Scripting) a CSRF (Cross-Site Request Forgery) silné spojenectvo. Často sa stáva, že úspešné XSS útoky pripravujú pôdu pre CSRF, a naopak. Kým XSS útočníkovi umožní prepašovať škodlivý kód do prehliadača obete, CSRF nenápadne zneužije jej prihlásenie na vykonanie nežiaducich akcií.

Príklad útoku:

Zoberme si scenár kde máme webovú aplikáciu, ktorá umožňuje používateľovi zmeniť svoje zobrazované meno cez endpoint „POST /dashboard/update-profile“ pomocou parametra username. Bug bounty hunter zistí, že parameter username obsahuje zraniteľnosť typu Stored XSS.

Request
Request
Response
Response

Hoci sa na prvý pohľad zdá, že dopad zraniteľnosti je nízky, keďže aktualizované meno vidí len samotný používateľ vo svojom profile, situácia sa komplikuje, ak sa skombinuje s ďalšou zraniteľnosťou. Endpoint /dashboard/update-profile totiž nie je chránený proti CSRF (Cross-Site Request Forgery) útokom.

Útočník teda môže pripraviť škodlivú webovú stránku, napríklad https://attacker.com, ktorá obsahuje skrytý HTML formulár, nastavený tak, aby automaticky odoslal POST požiadavku na legitímny endpoint aplikácie. V tomto prípade https://example.com/dashboard/update-profile:

CSRF
CSRF

Keď obeť navštívi túto stránku, automaticky sa odošle požiadavka na zmenu používateľského mena. Táto požiadavka uloží škodlivý JavaScript kód do profilu obete. Akonáhle si obeť znova otvorí svoj profil, vložený skript sa vykoná a session cookie je odoslaná útočníkovi. Útočník tak získa plnú kontrolu nad účtom použivateľa. Pôvodne neškodná zraniteľnosť, ktorá umožňovala spustenie XSS iba v rámci vlastného profilu používateľa, sa premenila na vážny problém.

Od Clickjackingu až k spusteniu XSS

V tomto scenári útočník demonštruje útok, pri ktorom je clickjacking využitý ako vektor na zneužitie zraniteľnosti typu self-XSS. Clickjacking oklame používateľa, aby nevedome interagoval s webovou stránkou spôsobom, ktorý vedie k spusteniu škodlivého JavaScriptového kódu.

Self-XSS, predstavuje potenciálne riziko, keďže umožňuje používateľovi, aby si sám vložil a spustil škodlivý JavaScriptový kód. V izolovanom prostredí sa táto zraniteľnosť považuje za nízkorizikovú, pretože je nepravdepodobné, že by používateľ úmyselne spustil škodlivý skript proti sebe samému. Útočník môže využiť clickjacking na maskovanie škodlivých akcií, čím oklame používateľa, aby nevedomky spustil self-XSS kód.

Predstavme si webovú aplikáciu s formulárom na pridanie recenzie, v ktorej sa nachádza zraniteľnosť typu self-XSS. Táto zraniteľnosť sa aktivuje, keď používateľ vloží škodlivý JavaScriptový kód do poľa „Tvoje meno“ a následne klikne na tlačidlo „Odoslať recenziu".

Self-XSS vo formulári
Self-XSS vo formulári

V niektorých prípadoch aplikácia umožňuje predvyplnenie formulára pomocou parametrov z URL adresy. Tento mechanizmus funguje tak, že do URL sa pridajú konkrétne parametre a hodnoty, napríklad meno alebo e-mail, a stránka následne tieto údaje automaticky vyplní do príslušných polí formulára. V takom prípade je možné vložiť aplikáciu s pripraveným XSS payloadom do skrytého iframe prvku, ktorý je prekrytý falošným používateľským rozhraním na podvodnej stránke.

<iframe sec="http://example.com/recenzia.php?name=<img src=x onerror=print()" />&rating=star5#feedback=test"></iframe>

Útočník už len nastaví clickjacking tak, aby bola pôvodná stránka neviditeľná a nad ňou sa zobrazila falošná stránka s výzvou, ktorá presvedčí používateľa, aby klikol na požadované miesto.

Clickjacking
Clickjacking

Keď používatelia kliknú na tlačidlo „Click me“ na podvodnej stránke, v skutočnosti aktivujú tlačidlo na legitímnej stránke, čím sa spustí JavaScriptový kód.

Kombinácia clickjackingu a XSS
Kombinácia clickjackingu a XSS

Záver:

Bug chaining nám ukazuje, že ani zdanlivo malé a nízkorizikové zraniteľnosti by sa nemali podceňovať. To, čo vyzerá ako len low alebo medium chyba, sa môže v kombinácii s inou stať vážnym bezpečnostným problémom. Útočníci hľadajú práve takéto cesty, ako jednotlivé chyby spojiť do jedného funkčného útoku s vysokým dopadom.

Preto je dôležité nezanedbávať žiadny nález a všetky zraniteľnosti riešiť zodpovedne, bez ohľadu na ich počiatočné zaradenie podľa závažnosti. V prostredí bug bounty programov môže byť práve detail, ktorý sa na prvý pohľad zdá nepodstatný, kľúčovým prvkom pre vážny problém.