Názory k článku
Co je Cross-Site Request Forgery a jak se mu bránit
Tajná hodnota ve formuláři nefunguje
celé vláknoTento útok je trochu slabší než CSRF, protože takhle nejdou vkládat automatem položky do formuláře, jde pouze simulovat kliknutí. Ale dá se takhle např. i změnit heslo, stačí, když útočník na své stránce dá do iframe stránku na změnu hesla, přičemž texty překryje něčím, co se tváří jako captcha a přiměje uživatele, aby opsal obsah obrázku do políčka a kliknul na submit.
Správné řešení na obranu je nepoužívat cookies vůbec a autentizační hash vkládat do URL. Aby URL bylo pokaždé jiné a nikdo ho nemohl uhodnout.
clickjacking
celé vláknoRe: clickjacking
celé vláknoRe: clickjacking
celé vláknoRe: clickjacking
celé vláknoDáváte vývojáři na výběr vlastně jedinou možnou obranu: javascript, který zabrání zobrazení jeho stránky v IFRAME jiného webu. Čili v nejlepším případě přenášíte hrozbu ze sebe na svého uživatele (pokud bude ochrana před CJ účinná, bude vyžadovat zapnutý JS u uživatele a tím ho vystavovat riziku; spíš ta ochrana účinná nebude a přesto vystaví uživatele riziku, takže teď budete ohroženi oba). Mě to úplně v pořádku nepřipadá.
Re: clickjacking
celé vláknoRe: clickjacking
celé vláknoProblém je v tom, že aby ta kontrola před vložením stránky do IFRAME fungovala, tak:
1) Musí být v browseru povolen javascript obecně, což není v zájmu uživatele. Fakticky to znamená, že ta stránka musí být napsaná tak, aby bez javascriptu vůbec nefungovala.
2) Musí browser dovolit změnu Location (což myslím zatím žádný browser nezakazuje, ale dost dobře se na to nemůžete spolehnout už proto, že to může zablokovat třeba nějaká nadstavba).
Osobně si hlavně myslím, že clickjacking je hrubá chyba tvůrců browseru. Co já vím, tak jsou principielně dva způsoby, jak to funguje, a obě by měly být vyloučeny "by design":
1) Útočník překryje ovládací prvek cizího webu svým prvkem a nějak dosáhne toho, že browser kliknutí na útočníkův element přepošle jako kliknutí i na element oběti. To se podle mě nedá označit jinak než za hrubou chybu browseru.
2) Útočník upraví element oběti tak, aby pro uživatele vypadal neškodně a současně lákavě, aby na něj klikl (třeba z input type=submit udělá input type=image s obrázkem imitujícím zajímavý link). Pak jde ovšem o klasický cross site scripting, který by prohlížeč také neměl povolit - nebo se aspoň zeptat, jestli to je OK.
Re: clickjacking
celé vláknoNení. Když by byla chyba na straně prohlížečů, bylo by to dobré a šlo by to vyřešit na úrovni prohlížečů (čili relativně rychle). Clickjacking se ale bude muset řešit (a začal řešit) na úrovni standardů. Je to podobné jako s css exploitem - prohlížeče se chovají správně, byť výsledek je pro uživatele nešťastný - a ťeď babo raď, jak z toho ven.
Re: clickjacking
celé vláknoTakže podle vás je v pořádku, když browser při kliknutí na element X pošle kliknutí elementu Y? Je v pořádku, když skript ze stránky X může ovlivnit obsah stránky Y?
Jak z toho ven je celkem triviální:
1) Výrobce browseru upraví svůj produkt tak, aby se kliknutí na prvek X skutečně poslalo jen prvku X.
2) Výrobce browseru upraví svůj produkt tak, aby skript ze stránky X mohl upravovat jedině stránky ze stejné domény.
3) Aby nedošlo k rozbití webů, které jsou (nesmyslně a hloupě) rozhozeny do několika domén s tím, že je vyžadováno mezidoménové skriptování, zavede se buď nějaký standardizovaný META (kterým stránka X řekne prohlížeči, "souhlasím, aby můj obsah měnily skripty s URL odpovídající regularnímu výrazu R") nebo si browser povede uživatelsky definovatelný seznam "povolených cross-scriptů" (tak, jako si dnes browsery vedou seznam povolených cookies nebo seznam povolených popupů). To první je lepší a univerzální, ale nejspíš reálně neprosaditelné, to druhé se může zavést okamžitě.
Re: clickjacking
celé vláknoMyslím, že tyhle předpoklady jsou nesprávné (proto nelze hodnotit ani jejich závěry).
Takže podle vás je v pořádku, když browser při kliknutí na element X pošle kliknutí elementu Y?Můžu vidět nějaký příklad, které tohle skutečně dělá? Clickjacking útoky, které znám, jsou totiž založeny na tom, že uživatel skutečně klikne přímo na element Y.
Je v pořádku, když skript ze stránky X může ovlivnit obsah stránky Y?Opět bych požádal o příklad, abych se omylem nebavili o něčem, co možná vůbec neexistuje 8-)
Re: clickjacking
celé vláknoUdálost kliknutí je v současnosti definovaná tak, že informaci o kliknutí pošle všem elementům, které se na dané pozici nacházejí (dokud někdo z nich nezapne event.cancelBubble). Takže pokud mám div a uvnitř něj span, dostanou informaci oba. To nelze změnit, jinak by přestala fungovat spousta současných aplikací.
Clickjacking navíc může být důmyslnější - zakryje se vše kromě malého místečka cílové stránky a uživatel je motivován k tomu, aby kliknul právě na toto místo (např. formou hry). Uživatel pak skutečně kliká do cílové stránky, takže by navrhovaná opatření nepomohla.
Jediným řešením by bylo zcela zakázat klikání do rámů, to by ale zase ovlivnilo současné aplikace (i když by jich asi zase tak moc nebylo).
Re: clickjacking
celé vláknoJediné systematické řešení, které zatím bylo navrženo, je Jakube zakázání vkládání aplikací ho iframe. Ať již na úrovní HTML hlavičky nebo HTTP protokolu. Jiné řešení zřejmě neexistuje. Pokud by tě navržené řešení a diskuse okolo něj zajímala detailně, podívej se na http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2008-September/thread.html#16284.
Pokud to projde, tak si prostě většina aplikací (kromě těch, které chtějí fungovat i jako gadgety) přidá tuhle hlavičku, počká se na nové verze prohlížečů a bude vystaráno. Do té doby nezbývá, než se vložení do iframe bránit JavaScriptem.
Re: clickjacking
celé vláknoRe: clickjacking
celé vláknoRe: clickjacking
celé vláknoRe: clickjacking
celé vláknoRe: Tajná hodnota ve formuláři nefunguje
celé vláknoRe: Tajná hodnota ve formuláři nefunguje
celé vláknoPři přijímání požadavků zase řetězec porovnává a pokud nesedí nebo vypršel čas, tak akci neprovede.
Pokud útočník nezná uživatelovo jméno/heslo a pokud nešmíruje komunikaci mezi serverem a uživatelem (ta se dá navíc zašifrovat v https), tak se k tomu náhodnému parametru v URL nijak nedostane. Pokud ten řetězec v URL někdo vytáhne z historie browseru nebo ze starých proxy logů, tak je mu na nic, protože vypršel jeho čas.
S tímhle parametrem v URL funguje např. xchat nebo mail.centrum.cz a nevidím v tom problém.
Re: Tajná hodnota ve formuláři nefunguje
celé vláknoRe: Tajná hodnota ve formuláři nefunguje
celé vláknoRe: Tajná hodnota ve formuláři nefunguje
celé vláknoProstě si představte, že jste přihlášený do Googlu na svůj Gmail účet. No a teď vás nějaká stránka přesvědčí, že ve své poštovní schránce máte kliknout na "delete all", a v zápětí vás přesvědčí, že máte kliknout na "yes, really". Google může mít zabezpečení jaké chce, pokud jste do něj přihlášen a útočící stránce se podaří vás přesvědčit, ať na ty linky kliknete, tak prostě nemůže nijak zabránit tomu, abyste si svou poštu nesmazal.
A o tom právě je celý clickjacking: že existuje způsob, jak uživatele přesvědčit, aby udělal akci, kterou by normálně vůbec neudělal. Nemá to celkem nic společného se zabezpečením napadávaného webu, který tomu dost dobře nemůže zabránit.
Re: Tajná hodnota ve formuláři nefunguje
celé vláknoAž na tu javascriptovou kontrolu na vložení do iframe, která je celkem spolehlivá 8-)
Re: Tajná hodnota ve formuláři nefunguje
celé vláknoPlus si nejsem až tak 100% jistý, že jediným způsobem, jak použít clickjacking, je IFRAME. Předpokládám, že přinejmenším přes OBJECT by to mělo jít taky, a nebyl bych až tak moc překvapen, kdyby se clickjackovací funkce objevily i pro samostatná okna (přes window.open si otevřít nové okno, šikovně ho namaskovat a nechat uživatele, ať si do toho klikne).
Re: Tajná hodnota ve formuláři nefunguje
celé vláknoŠlo by to tak, že ti útočník zobrazí titulní stránku a donutí tě kliknout na "login" (a předpokládá, že máš zaplé samovyplňování hesla) a pak na "delete email".
OT: CSRF podle nového TRZ...
celé vlákno§ 228:
(1) Kdo překoná bezpečnostní opatření, a tím neoprávněně získá přístup k počítačovému systému nebo k jeho části, bude potrestán odnětím svobody až na jeden rok, zákazem činnosti nebo propadnutím věci nebo jiné majetkové hodnoty. ...
§ 229
(1) Kdo v úmyslu spáchat ... trestný čin neoprávněného přístupu k počítačovému systému a nosiči informací podle § 228 ... vyrobí, uvede do oběhu, doveze, vyveze, proveze, nabízí, zprostředkuje, prodá nebo jinak zpřístupní, sobě nebo jinému opatří nebo přechovává
a. ... postup, nástroj nebo jakýkoli jiný prostředek, včetně počítačového programu, vytvořený nebo přizpůsobený k neoprávněnému přístupu do sítě elektronických komunikací, k počítačovému systému nebo k jeho části, nebo
b.počítačové heslo, přístupový kód, data, postup nebo jakýkoli jiný podobný prostředek, pomocí něhož lze získat přístup k počítačového systému nebo jeho části,
bude potrestán odnětím svobody až na jeden rok, propadnutím věci nebo jiné majetkové hodnoty nebo zákazem činnosti.
-> takže autor článku rok natvrdo ("vytvoření trvalého platebního příkazu na útočníkův bankovní účet", "příklad bude destruktivní", odkaz na wireshark => úmysl je zde celkem zřejmý), my ostatní, co to čteme, bysme mohli vyváznout jen s podmínkou... ;-)
Re: OT: CSRF podle nového TRZ...
celé vláknoRe: OT: CSRF podle nového TRZ...
celé vláknoNicméně je dobré, mít na paměti existenci podobných obludností.
Ano: Úmysl je v naprosté většině případů prakticky neprokazatelný. (autora tedy necháme jít s podmínkou ;-)
Ale: § 228 žádný úmysl nezmiňuje. Takže CSRF (bude) zakázáno zákonem a basta! ;-)
Re: OT: CSRF podle nového TRZ...
celé vlákno1. Kdo si zvolí heslo, které je rovno jeho datu narození, jménu manželky, psa, kočky, oblíbeného sportovního klubu či podobné, bude potrestán odnětím svobody na 6 měsíců nebo zákazem práce s výpočetní technikou na pět let.
2. Výjimečný trest dostane ten, kdo zvolí heslo "12345" nebo několik stejných znaků.
A bude! :)
Re: OT: CSRF podle nového TRZ...
celé vláknoPrevence musí bejt!
Re: OT: CSRF podle nového TRZ...
celé vláknoRe: OT: CSRF podle nového TRZ...
celé vláknoAJAX a cookies
celé vláknoDalší problém je s technologií AJAX - tam je potřeba toto řešit také, jelikož se jedná v principu o to samé a lze to napadnout úplně stejným způsobem.
Ad ochrana:
U uživatele je myslím rozumné používat "anonymní mód" - viz http://zdrojak.root.cz/zpravicky/google-chrome-vicenasobne-prihlaseni/.
Na straně stránek to je mnohem těžší, tam je nejspíš nejrozumnější celkem náročná implementace nějakého jednorázového tunelu nad autorizací v Javascriptu (v tom případě by web měl být kompletně napsaný nad technologií AJAX, aby všechna data šla přes tento tunel); toto řešení je imunní vůči CSRF (tunel si posílá nějakou jednorázovou hodnotu, která se mění pro každý další dotaz na server) i proti Clickjackingu - při otevření iframu se znovu načte stránka, a tudíž nebude uživatel autorizován, jelikož bude autorizován jen v rámci tunelu na původní stránce.
Bohužel formuláře bez autorizace nelze proti Clickjackingu efektivně bránit, maximálně v Javascriptu zabránit, aby byl web načten v iframu.
Re: AJAX a cookies
celé vláknoZáleží na tom, jak moc jste si jistý, že je vaše aplikace odolná vůči XSS. Pokud se XSS nebojíte (myšleno oprávněně, protože vstupy pečlivě kontrolujete), tak lze cookies bez problémů použít. Ale je to skutečně o potenciální riziko navíc (důležité je, že je jen "potenciální").
Re: AJAX a cookies
celé vláknoRe: AJAX a cookies
celé vláknoNe, tohle skutečně nejde, to by byla velká bezpečnostní bota v návrhu samotných cookies.
Re: AJAX a cookies
celé vláknoRe: AJAX a cookies
celé vláknoRe: AJAX a cookies
celé vláknoNic takového možné nebylo, IE6 kontroluje přístup k vnořeným rámům stejně jako všechny ostatní prohlížeče (pokud se liší doména rámu, žádný přístup nepovolí).
Přinejmenším takový výrok nelze napsat bez újmy na obecnosti - pokud máte na mysli nějaké konkrétní neopravené verze IE6 nebo nějaký speciální způsob využívající jiné bezpečnostní chyby tohoto prohlížeče, tak je potřeba to napsat. Jinak je takový výrok obyčejný FUD.
Re: AJAX a cookies
celé vláknoRe: AJAX a cookies
celé vláknoRe: AJAX a cookies
celé vláknoRe: AJAX a cookies
celé vláknoRe: AJAX a cookies
celé vláknoRe: AJAX a cookies
celé vláknoPokud odešle formulář, automaticky se použije i hodnota PHPSession, tedy bude přihlášen a kód se provede.
Re: AJAX a cookies
celé vláknoTaké jsem zcela nepochopila čeho chcete dosáhnout tím šifrováním, ale třeba mi to vysvětlíte. A AJAX na pozadí také používá POST / GET požadavky, takže nepochybuji že to také půjde prolomit - je to sice složitější na implementaci, ale určitě to půjde.
Re: AJAX a cookies
celé vláknoPomocí javascriptu se dostaneme na hodnoty uložené v cookies (pomocí
document.cookie), pokud nebude u cookie nastavený flag httpOnly a prohlížeče bude httpOnly flag podporovat.
Šifrováním se docílí toho, že na nezabezpečené síti nepůjdou odposlechnout hodnoty cookies (hodně důležité je např. sessionId), které se běžně používají pro uložení stavu, že uživatel je přihlášen.
Re: AJAX a cookies
celé vláknoStandardní request:
1) server vygeneruje tajnou hodnotu cookie "A" a zašifruje ji čímž získá hodnotu "B" kterou pošle klientovi
2) klient vezme hodnotu "B" a odešle ji společně s requestem (například ji vloží do formuláře)
3) server vezme zašifrovanou hodnotu cookie, dešifruje a porovná
S odposlechem:
1) server vygeneruje tajnou hodnotu cookie "A" a zašifruje ji, atd. ...
2) zlý hacker odposlechne zašifrovanou hodnotu cookie a uloží si ji
3) zlý hacker vytvoří potřebný request (formulář) a přiměje klienta aby ho odeslal, přičemž v requestu použije odposlechnutou šifrovanou hodnotu
4) server přijme request, a bez problémů ho zpracuje protože obsahuje "bezpečnou" tajnou hodnotu
A včil jsme v piči - celé to právě popsané šifrování cookie je nedomyšlené a nefunguje. Aby to fungovalo tak by klient nesměl posílat zpět tu samou šifrovanou hodnotu jako dostal, ale musel by ji nějak upravit - například dešifrovat a zašifrovat jiným heslem, které by ale musel znát server aby výsledek mohl dešifrovat a zkontrolovat.
Ne že by takové JS šifrování neexistovalo, ale vyžaduje to další věci - například bezpečnou výměnu klíčů. Ale možná existuje nějaká ďábelsky chytrá finta která to řeší. Daleko jednodušší mi ale přijde prohnat to přes SSL a nešaškovat s nějakým custom developed šifrováním.
A teď mne omluvte, jdu se dívat na mexickou telenovelu.
Re: AJAX a cookies
celé vláknotím jsem samozřejmě myslel to vaše "prohnat to přes SSL" :) ...takže to myslíme stejně - místo http použít https
RE: Co je Cross-Site Request Forgery a jak se mu bránit
celé vláknoRE: Co je Cross-Site Request Forgery a jak se mu bránit
celé vláknoRE: Co je Cross-Site Request Forgery a jak se mu bránit
celé vláknoAsi nejčastějšími typy útoků, které mohou číst uživatelská data jsou: XSS a JavaScript Hijacking (http://jeremiahgrossman.blogspot.com/2007/04/javascript-hijacking.html).
RE: Co je Cross-Site Request Forgery a jak se mu bránit
celé vláknoRE: Co je Cross-Site Request Forgery a jak se mu bránit
celé vláknoRE: Co je Cross-Site Request Forgery a jak se mu bránit
celé vlákno
<img id="obrazek" src="http://server/administrace/?zobrazEmaily=true" />
a pak v javascriptu toto:
var obr = document.getElementById('obrazek');
alert(obr.ziskejObsahNacteneAdresy());
tj. jestli neexistuje nějaká metoda objektu image, která by vrátila obsah, který prohlížeč načetl
odpověď: nevím o tom a pokud by něco takového existovalo, byla by to závažná bezpečnostní díra prohlížeče (něco podobného, jako kdyby šlo skriptovat mezi frames z různých domén)
"obrázek se dostane do nepovolených rukou" - o obrázek se v tomto případě nejedná - prohlížeč nezobrazí nic nebo zobrazí chybně načtený obrázek (záleží na použitém prohlížeči)
Re: Google
celé vláknoOdhlášení je akce, která nepochybně změní stav aplikace, takže by měla být provedena metodou POST. Alespoň já jsem to tak v phpMinAdminu udělal.
Re: Google
celé vláknoRe: Google
celé vláknoRe: Google
celé vláknoJá osobně také automatické odhlášení považuji za útok, ale mnohé webové aplikace nejsou chráněné (např. aplikace od googlu: výše uvedené URL a také gmail: pomocí URL https://mail.google.com/mail/?logout).
Email na seznamu je ochráněn proti automatickému odhlášení (pomocí ve článku uvedeným hashId).
Někdo to ale za útok nepovažuje, protože nedojde ke ztrátě dat...
drobna korektura + dalsi poznamky
celé vláknoVe formulari pod "Rozšíření útoku na metodu POST" ma asi byt method="post" (get by tam asi mohlo byt, pokud by utocnik vedel, ze serverova aplikace je napsana v PHP a pouziva $_REQUEST)
Ruby on Rails k ochrane pred CSRF take pouzivaji vygenerovanou hodnotu v hidden poli formularu, a session data ukladaji zasifrovana do cookies. Pry to docela funguje, ovsem az na zranitelnost proti jinemu typu utoku, tzv, reply attack (viz treba http://www.ruby-forum.com/topic/102147#new), ovsem nazory na zavaznost tohoto typu utoku se ruzni
Jeste co se XSS (a potazmo vlastne i CSRF), tyce, vedeli jste, ze PHPkova funkce setcookie() prijama od verze 5.2. parametr httponly, ktery zabranuje cteni obsahu cookie pomici javascriptu? (http://cz.php.net/manual/en/function.setcookie.php)
Re: drobna korektura + dalsi poznamky
celé vláknohttonly je dobrá věc, ale funguje, myslím, zatím jen v IE a Firefoxu. Ostatní prohlížeče přístup povolí i k takovému cookies; nicméně to nijak nebrání tomu nastavovat httponly jako prevenci v každém případě.
Re: drobna korektura + dalsi poznamky
celé vláknoTYPO (= překlep)
celé vlákno<form action="http://webmail/poslat" method="get">
Předpokládám že v bloku textu ukazující post útok by měla být metod="post"
Tajna hodnota v cookie
celé vláknoPan Pejsa, mozete objasnit ako bola ta idea s tajnou hodnotou v Cookies myslena? V kombinacii s per-session hashId spomenutou o odstavec vyssie tato ochrana predsa nedava ziaden zmysel... (k utocnikovmu CSRF submitu browser automaticky prilozi cookie, takze utocnik nema co riesit a nepotrebuje ziadne XSS). Alebo mi nieco unika? Vdaka!
Re: Tajna hodnota v cookie
celé vláknoRe: Tajna hodnota v cookie
celé vláknoA) na klientské straně vygenerujeme nějaký hash a uložíme ho do cookies a zároveň hodnotu hashe přidáváme ke každému odesílanému formuláři (server o hodnotě hashe nic neví)
B) server při přijetí požadavku (odeslaný formulář od klienta) má k dispozici veškeré cookies, které nastavil klient (v PHP např. proměnná $_COOKIES) a zároveň přístup k POST/GET datům - v těch je také přiložený hash
- server tedy zkontroluje hodnotu uloženou v cookies proti hodnotě z formuláře
- útočník se hodnotu v cookies nedozví a je schopen pouze vytvořit formulář bez hash hodnoty
(snad je tomu teď lépe porozumět)
Re: Tajna hodnota v cookie
celé vláknoNehledě na to že cookie se dá využít i elegantněji - na serveru si vygeneruji hodnotu, uložím si ji a pošlu ji uživateli jako cookie. Díky tomu on mi ji při každém requestu automaticky pošle a já si ji mohu porovnat se svojí uloženou hodnotou. Výhoda je v tom že nemusím do úmoru tu hodnotu vypisovat do "hidden" položek všech formulářů (a funguje to dokonce i pro GET requesty aniž bych musela tu tajnou hodnotu uvádět v URL).
Teda, původně mne všechny ty internety jenom otravovaly, ale já jim snad nakonec ještě přijdu na chuť ...
Re: Tajna hodnota v cookie
celé vláknoIMHO je lepší generovat tu tajnou hodnotu už na serveru a ne až na klientovi - například pokud vaše aplikace JS nevyžaduje tak proč ho tam zbytečně tahat, že? A implementačně je to skoro stejné, nijak výrazně se to neliší - pár řádek PHP kódu.
vždy záleží na konkrétní aplikaci - vím že existují takové, které javascript nepoužívají
Nehledě na to že cookie se dá využít i elegantněji - na serveru si vygeneruji hodnotu, uložím si ji a pošlu ji uživateli jako cookie. Díky tomu on mi ji při každém requestu automaticky pošle a já si ji mohu porovnat se svojí uloženou hodnotou. Výhoda je v tom že nemusím do úmoru tu hodnotu vypisovat do "hidden" položek všech formulářů (a funguje to dokonce i pro GET requesty aniž bych musela tu tajnou hodnotu uvádět v URL).
Ano - to je princip CSRF útoku :) Hodnota v cookie se posílá automaticky z prohlížeče s jakýmkoliv požadavkem na daný server. Pokud nepoužiji "hidden" položku pro odesílaný formulář, mám zranitelnou aplikaci na CSRF. Díky této položce se dá velmi rychle zkontrolovat, zda-li nějaká aplikace je chráněna proti CSRF či nikoliv.
Re: Tajna hodnota v cookie
celé vláknoAle snad mne omlouvá pozdní hodina a skutečnost že jsem byla rozrušená z pořadu "Volejte věštce" - ta ježibaba ve studiu vážně umí věštit budoucnost!
Re: Tajna hodnota v cookie
celé vláknoRe: Tajna hodnota v cookie
celé vlákno1) server www.jezevcik.com vygeneruje tajnou hodnotu "x" a pošle ji klientovi
2) útočník na server www.vzteklina.com umístí skript který na server pošle POST request "delete-all", a přiměje uživatele aby ho spustil (jedno jak)
3) útočníkův skript se ale spouští na www.vzteklina.com a tudíž nedostane cookies nastavené pro www.jezevcik.com
4) server www.jezevcik.com si zkontroluje hodnotu "x" a má vyhráno
Re: Tajna hodnota v cookie
celé vláknoasi jsem taky něco nepochopil. Pokud útočník na www.vzteklina.com použije k útoku IFRAME z domény www.jezevcik.com, kde lstivě skryje to, že se jedná o stránku "chcete smazat všechny své e-maily" a donutí (jedno jak) uživatele kliknout na "ano"...
...pak server jezevcik.com dostane:
1. tajny hash ktery si sam vygeneroval
2. tajnou cookie, kterou si sam nastavil
Podle mého není v případě použití IFRAME žádný rozdíl mezi tím, jak uživatel server jezevcik.com používá normálně a jak ho používá, aniž by o tom věděl. V tom případě je však jakákoliv ochrana tohoto typu neúčinná.
A druhá věc k Vašemu příkladu - POST se pošle na jezevcik.com (jinak by to nebyl útok na jezevcik.com) a ten svou cookie, kterou si v bodě jedna nastavil, samozřejmě obdrží.
Podvrzeni refereru?
celé vlákno"protože CSRF útok využívá prohlížeč oběti" (v casti o kontole user-agent)
Jak jdou tyhle dve veci dohromady? Jak je mozne zfalsovat referer na strane klienta, tedy prohlizece obeti? Diky, Leo
Re: Podvrzeni refereru?
celé vláknoRe: Podvrzeni refereru?
celé vláknoRe: Podvrzeni refereru?
celé vláknoProblém je v tom, že se na přítomnost Refereru nedá spolehnout, protože např. firewally ho odstraňují. Kvůli tomu bychom museli povolit provedení operace i bez Refereru, což by dovolilo útočit na uživatele se zapnutým firewallem.
Re: Podvrzeni refereru?
celé vláknoPlus (pro podporu nazoru o nesmyslnosti zalozeni obrany proti CSRF na kontrole refereru) pridam, ze je mozne vytvorit v prohlizeci pozadavek uplne bez refereru a to pro POST i GET metodu
Re: Podvrzeni refereru?
celé vláknoRe: Podvrzeni refereru?Re: Podvrzeni refereru?Re: Podvrzeni refereru?
celé vláknoRe: Podvrzeni refereru?Re: Podvrzeni refereru?Re: Podvrzeni refereru?
celé vláknoRe: Podvrzeni refereru?
celé vláknohttp://www.cgisecurity.com/lib/XmlHTTPRequest.shtml
Je to sice z roku 2005 ale týká se to IE 6, což je stále ještě relativně dost rozšířený browser.
Takže pokud někdo bude chtít, nedá mu asi velkou námahu složit si obdobným způsobem libovolný request s libovolným refererem.
Re: Podvrzeni refereru?
celé vláknoRe: Podvrzeni refereru?
celé vláknoRe: Podvrzeni refereru?
celé vláknoA jak konkretne by v tomto pripade slo podle Vas podvrzeni refereru Javascriptem zneuzit k CSFR (predpokladejme, ze uzivatel / obet utoku ma ten nezabezpeceny IE6).
Problem s firewally je opacny - neumozni CSRF, pokud referer vyzaduji a delam jeho kontrolu tak omezim opravneneho uzivatele, ale neumoznim utok.
Leo
Re: Podvrzeni refereru?
celé vlákno(1) znemožnit daný typ útoku
(2) neznemožnit fungování aplikace
Při srovnání s tokenem to prostě vychází výrazně lépe pro token - je spolehlivý a bez negativních efektů.
Re: Podvrzeni refereru?
celé vláknoA navíc Leoš Ondra správně poukázal na to, že odkázaný útok se pro CSRF nedá použít, protože CSRF je založeno na transparentním poslání cookie, ke kterému při tomto útoku nedojde.
Takže i když souhlasím, že Referer se pro obranu proti CSRF použít nedá (protože ho firewally filtrují), tento příspěvek je poněkud mimo.
Re: Podvrzeni refereru?
celé vláknoNerozumím jak s tím souvisí to že CSRF je založeno na transparentním posílání cookie - to je samozřejmě v podstatě pravda, ale jak to souvisí s obcházením kontroly referera?
Re: Podvrzeni refereru?
celé vláknoOdkázaným útokem se dá podvrhnout Referer, nepošle se ale cookie. CSRF tímto útokem tedy provést nelze.
Re: Podvrzeni refereru?
celé vláknoKaždopádně shodneme se že token je řádově lepší ochrana před CSRF než kontrola refereru?
Re: Podvrzeni refereru?
celé vláknoA co continuation-based frameworky, např. Seaside?
celé vláknoMyslím, že to je zabezpečení víc než slušné.
Re: A co continuation-based frameworky, např. Seaside?
celé vláknopříklad: zobrazím si stránku kde je akce "delete", tu samou stránku ještě jednou v druhé záložce (zase je tam akce "delete" s novou hash hodnotou) a z té první se pokusím o akci "delete" (se starým hashem)
...dojde k chybě?
Re: A co continuation-based frameworky, např. Seaside?
celé vláknoAno, funguje. Onen předávaný hash akce totiž neidentifikuje akci samotnou, ale jejího předka (alespoň takhle to má Apache Cocoon). Na serveru pak nemusíte mít seznam navazujících akcí, ale může to být strom – pokud z jednoho místa otevřete víc záložek, má odpovídající místo ve stromu víc potomků.
Re: A co continuation-based frameworky, např. Seaside?
celé vláknoPokud bychom otevřeli první záložku a měli adresu "www.apl.cz/?_s=RfbsExbGPszyseST&_k=CqAJIouj", otevřeli druhou záložku a přesně tam zkopírovali tu adresu, zobrazilo by se nám to samé a dokonce adresa by zůstala stejná. Pokud bychom na té stránce kliknuli na akci "delete" (která by měla na obou stránkách stejný hash), v obou případech by se akce provedla (díky mechanismu cache, uchovávající posledně použité požadavky), ale poté by byla v každé záložce jiná adresa, protože každa záložka by vygenerovala nový request nezávisle na sobě. V každé takto vyrenderované stránce by samozřejmě odkazy (i když ukazující třeba na stejné akce) měly už naprosto jiné action hashe.
Díky za precizní článek s výbornými příklady
celé vláknoDíky za výborný článek a díky zejména za výborné příklady.
(Přeposílám kolegovi, který se mne dneska párkrát ptal, proč nás pořád tak trápí ten ActionController::InvalidAuthenticityToken :)
karmi
Re: Díky za precizní článek s výbornými příklady
celé vláknoOchrana v Nette
celé vláknoPokud používáte Nette Framework, můžete aktivovat ochranu před CSRF metodou addProtection(). V praxi to může vypadat nějak takto:
// jednoduchý formulář na změnu emailové adresy
$form = new Form;
$form->addText('email', 'E-mail:')
->addRule(Form::FILLED, 'Please enter new email.')
->addRule(Form::EMAIL, 'The entered email is not valid.');
$form->addSubmit('save', 'Save');
$form->addProtection('Please submit this form again
(security token has expired).');
Zprava v metodě addProtection je volitelná a zobrazí se uživateli tehdy, pokud odesílání kvůli CSRF ochraně selže. Například když token stačil vyexpirovat.