Já nedokážu pochopit, že tohle někdo udělá a že nikoho kdo nad tou databází dělal nějaký dotaz tohle nenapadlo. Tohle chování je naprosto neomluvitelné.
To nie je problém len kvôli tomu že zamestnanci majú prístup k databáze, ale aj kvôli tomu že ak databáza unikne, no tak máš po účtoch.
Mať účet na Meta (Facebook, Instagram, WhatsApp, Messenger), je doslova riskovanie.
Pro mne je teda mnohem víc nepochopitelné, že prohlížeče odesílají heslo v otevřeném tvaru, a všichni se tváří, že je to v pohodě. Přitom to je ten největší problém. Ledabylé zacházení s hesly na serveru je samozřejmě omluvitelné – právě tím, že když mi prohlížeč to heslo prozradil, tak proč bych s ním já měl zacházet výrazně lépe, než prohlížeč.
Práveže ak odosiela v textovej podobe tak je to správne (a ono to vlastne v textovej podobe neposiela, lebo je to SSL šifrované)... ak by hash posielal už priamo prehliadač, tak to znamená že API prijíma hash, takže ak by unikla databáza s hashom, tak by vlastne sa vedel hocikto prihlásiť. Takto je nutnosť z hashu dostať to pôvodné heslo, ktoré APi prijíma. Takto je útok obmedzený len na útok v pamäti servera, čo je najmenšie riziko. Samozrejme tu ale záleží už od alokovaní. Problém je u jazykov s GC, kde nikto nikdy nevie kedy sa objekt uchovávajúci to heslo uvolní.
30. 9. 2024, 15:00 editováno autorem komentáře
Naštěstí už 45 let existuje asymetrická kryptografie, takže heslo ani nemusíme posílat na druhou stranu, ani nemusíme na druhou stranu posílat nic, čehož odchycení by umožnilo v budoucnu přihlášení.
To s tým nemá nič spoločné... vždy ak API očakáva "A" a informácia "A" je prezradená, tak je absolútne jedno aká je podoba "A", a či je to šifrovaná podoba informácie "B".
To samozrejme jedno nie je. Ak bude napr. "A" z tvojho príkladu podpis, vygenerovaný s využitím privátneho kľúča "B" a nejakého jednorazového náhodného vstupu zo strany API, tak každému inému bude prezradené "A" (mimo kontext tejto konkrétnej seánsy medzi vami) na starú mater.
Ak raz odosielaš akúkoľvek informáciu API, a úplne to isté pošle niekto iný, API nemá ako vedieť od koho informácia pochádza. Aj podpísané dáta môžu ísť od útočníka s tvojím podpisom. Doslova vie útočník poslať 1:1 zhodný balík dát do API ako ty...
1. 10. 2024, 17:28 editováno autorem komentáře
Doslova vie útočník poslať 1:1 zhodný balík dát do API ako ty...
Což ale samozřejmě neznamená, že API ta data musí přijmout. Např. když je tam starý čas, staré nebo už použité nonce apod.
To jedine v prípade, ak by mal buď prístup k tvojmu privátnemu kľúču, alebo by bol medzi vami v roli MITM. Prvý prípad je triv. fuckup, tam nie je čo riešiť. Na druhý existujú štandardné mechanizmy, ako takú situáciu detekovať/vylúčiť, viď napr. [1].
A aj ten MITM scenár (za predpokladu, že teda zlyhali všetky prostriedky, ktoré mu majú predísť, napr. niekto odignoroval upozornenia ohľadom certifikátov, má zavedený cert. alebo cert. autoritu podhodenú útočníkom a pod.) je stále o zneužiteľnosti čisto v kontexte tej jednej konkrétnej session. Autorizáciu mimo tento kontext mu odchytenie pokojne aj celej kumunikácie medzi vami neumožní.
2. 10. 2024, 09:59 editováno autorem komentáře
Žádné příčetné API pro přihlašování neočekává na vstupu ten samý údaj, který je uložený pro ověření, ale vždy nějaký odvozený údaj. Už i hloupá metoda HTTP Digest očekávala na vstupu hash, který byl odvozen z přihlašovacích údajů a nonce.
Problém je v tom, jak má prohlížeč poznat, která informace z té přehršle dat je heslo a že je zrovna v plaintextu.
Zde má kompletně máslo na hlavě jen a pouze Meta, která nastavila ten proces právě takhle.
Aby to bylo bezpečné, nemohlo by se to vůbec zadávat do webové stránky, ale do speciálního dialogu prohlížeče. Takže prohlížeč by to poznal velice snadno – prostě první řádek by byl login a druhý heslo. Ostatně v HTTP protokolu je autentizace na úrovni protokolu specifikovaná, akorát k tomu měly prohlížeče otřesné UI. Jenže místo toho, aby se UI spravilo a protokol zmodernizoval, na bezpečnost se úplně rezignovalo a necháváme hesla zadávat do webové stránky, ta je pak posílá v otevřeném tvaru na server – a pak si všichni divý, že server to heslo zná.
Meta má máslo na hlavě pouze v tom, že v tomhle případě nehraje jako ostatní hru „tváříme se, že server heslo nezná, i když ho zná“.
Nehájím Metu. Jenom mi vadí, že se tohle řeší jako velký problém, ale mlčí se o tisíckrát větším problému, který je příčinou toho, že vůbec Meta mohla takovouhle chybu udělat.
Není to ani týden, co jsi pod jiným článkem argumetnoval, že se systémy mají přizpůsobovat realitě. Opravdu nechápu, jak můžeš zároveň zastávat princip A
a zároveň princip not A
.
Připomínáš mi inženýra, co počítá nosnost výtahu a nadává, proč se lano počítá s bezpečností k=10, když si křídla letadel můžou dovolit být jen o chlup nad jedničkou. Ten rozdíl stejně tam jak tady existuje kvůli úplně odlišnému riziku. Zatímco heslo letí - dnes už šifrovaným - kanálem a v otevřené podobě tam existuje po dobu mrknutí oka, v databázi leží a leží a vysloveně si říká o nějaký průšvih. *
Je ustálenou praxí zacházet s hesly speciálně, protože hesla jsou něco speciálního. Otevřené mléko taky potřebuje speciální zacházení a když ho nechám týden na lince, tak se nemám co divit, když ho zkusím a bude zkažené.
[*]: u výtahů se bezpečnost přehání proto, že se silnou bezpečností a jednoduchým výpočtem učiní za dost i výpočtům složitým, jakým je namáhání lana v ohybu. Opět mi to přijde jako dost vhodná analogie: meta zvlášť mohla nasadit takové prostředky ověřování, aby heslo v otevřeném tvaru neopustilo prohlížeč (byť by si takové řešení museli přiohnout). Ale neudělali to, tady ušetřili a zapomněli tam přidat a když jim to křachlo, dostali zcela po zásluze přes prsty.
Já jsem ale v této diskusi nikde netvrdil, že se systémy nemají přizpůsobovat realitě. Pokud se něco v realitě používá a je to velmi nebezpečné, upozorňování na tu nebezpečnost nepovažuju za „nepřizpůsobení se realitě“.
Kdyby heslo v otevřeném tvaru nikdy neopustilo prohlížeč, nemůže ležet v databázi. To, že heslo letí šifrovaným kanálem, je jenom maličká část zabezpečení. Když z toho šifrovaného kanálu vypadne na serveru, není v bezpečí. Jak ukazuje právě i tento případ, kdy se to heslo v otevřeném tvaru uloží do databáze. A jak ukazují tisíce jiných případů, kdy je heslo v logu, uložené v databázi slabě zahashované, slabě zahashované nebo v otevřeném tvaru někde v záloze… Navíc to heslo se posílá při každém přihlášení znovu a znovu.
Jinak mne zrovna únik hesla trápí ze všeho nejméně, protože to heslo je unikátní jenom pro jednu službu a nic neznamená. Únik všech ostatních informací, které jsou někde evidované, mi vadí víc. Ale realita je taková, že spousta uživatelů používá jedno heslo na více místech. A to je problém. Problém je, že Facebook zná něčí heslo k e-mailu a souborovému úložišti, e-shop zná jeho heslo k Facebooku a k bankovnictví atd.
Řešení tohoto problému opravdu není v tom, že teda dobře, ať Facebook to heslo k e-mailu a souborovému úložišti zná (nebo ho může zjistit, kdy se mu zachce) – ale ať předstírá, že ho nezná. A pokud to bude předstírat špatně, tak ho potrestáme a budeme se mu smát, jak je bezpečnostně neschopný.
Meta měla prohlásit, že zaměstnanci měli povinnost zavřít oči pokaždé, když viděli v té databázi hesla. Protože přesně tak se s hesly na webu zachází – to heslo tam je sice napsané, ale když zavřu oči, tak zmizí, takže je vše v pořádku.
Je ustálenou praxí zacházet s hesly speciálně, protože hesla jsou něco speciálního.
To je právě ten problém, že se s hesly zachází speciálně, místo aby se s nimi zacházelo bezpečně.
TLS je plaintext? A je navíc uložený na trvalém úložišti? "proč bych s ním já měl zacházet výrazně lépe" - koukám, že se překonáváte.
1. 10. 2024, 08:23 editováno autorem komentáře
TLS je šifrovaný kanál mezi prohlížečem a serverem. Server ovšem z šifrovaného kanálu všechna data vybalí a má je k dispozici v otevřeném tvaru. Co s tím heslem server udělá je už čistě na jeho provozovateli (případně útočnících, kteří se na server dostanou). Jestli provozovatel serveru (nebo útočník) to heslo hned zahashuje, nebo he zapíše do textového logu, nebo ho prodá na darknetu, to jako uživatel nevíte. Jediný způsob, jak jako uživatel můžete zařídit, aby server neprováděl s heslem něco nekalého, je vůbec to heslo webové stránce nepředávat.
Ano, bezpečné zacházení s hesly by bylo takové, že by heslo v otevřeném tvaru nebo jeho ekvivalentu vůbec neopustilo bezpečnou část prohlížeče. Cokoli jiného je jen Potěmkinova vesnice a u každé informace o tom, že provozovateli serveru unikla hesla, by mělo být uvedeno, že hlavní problém byl už v tom, že se ta hesla vůbec dozvěděl.
Prohlížeč udělá maximum pro bezpečnost (neposílá žádný plaintext, ale šifrovaně přes TLS). Pokud je na straně serveru inteligent "Ledabylé zacházení s hesly na serveru je samozřejmě omluvitelné", tak si pokutu rozhodně zaslouží.
Vy to stále nechápete. Bezpečné heslo je takové heslo, které zná jenom uživatel (a jím ovládaný software) a nikdo jiný. Jakmile se to heslo zadá do webové stránky (kterou má pod kontrolou provozovatel webu, resp. možná útočník), dozvídá se to heslo někdo, kdo ho znát nemá.
Většina lidí používá jedno heslo na více místech, spousta dokonce používá všude to samé heslo. Takže třeba mají heslo k e-mailu, kam jim chodí spousta citlivých věcí. Stejné heslo mají na Faceboook, kde mají třeba soukromé fotky. A stejné heslo mají třeba tady na Rootu. Připadá vám v pořádku, že vaše heslo k e-mailu a vaše heslo k Facebooku pošle prohlížeč provozovateli Root.cz?
Je to srovnatelné s tím, kdybyste každému, kdo vám má něco doručit domů (úřadům, e-shopům, doručovacím společnostem, přátelům, vydavatelům, dámejídlům) dal klíč od svého bytu. A tvrdil byste, že s těmi klíči přece musí zacházet bezpečně. No, musí – ale nemělo by se začít tím, že nebudete dávat klíč každému, kdo si o něj řekne?
Já jsem nikde nepsal, že ledabylé zacházení s hesly na serveru je omluvitelné. Psal jsem, že je neomluvitelné ledabylé zacházení s hesly v prohlížeči, a je to daleko větší problém, než to zacházení s nimi na serveru.
> Většina lidí používá jedno heslo na více místech
Teraz ste objavili zdroj vsetkych chyb, vsetko ostatne uz je iba omacka. Preto je v browsery integrovany password manager aby ste vsade mohli mat heslo ine.
I pak by bylo mírně lepší, kdyby se heslo na druhou stranu neposílalo, protože to rozšiřuje možnosti útoků a úniků. Může dojít k nějaké částečné kompromitaci, která nebude stačit pro zajištění přístupu/perzistence (útočník se třeba dostane na jeden z mnoha nodů v load balanceru kde se terminuje TLS -- může přepisovat různé věci v aktuální session ale nemůže dělat úplně všechno a napořád), ale heslo unikne. Nebo k té chybě kdy heslo vypíšete při chybě omylem do logu.
Teraz ste objavili zdroj vsetkych chyb
Jenže lidi nepředěláte a nenaučíte je pamatovat si desítky či stovky hesel. Správce hesel je také jen způsob, jak to obejít – heslo původně znamenalo něco, co si uživatel pamatuje, není to nikde uložené. Když už mám možnost nějaké tajemství uložit, dává daleko větší smysl používat klíče a asymetrickou kryptografii než hesla.
Správci hesel v prohlížečích jsou jen o málo méně špatné kusy softwaru, než byla podpora HTTP autentizace. Dlouho neuměly hesla generovat (což je klíčová funkce); neumějí k heslům přistupovat jinak, než z prohlížeče (některá hesla musím zadávat i jinde); neumějí uložit k autentizačním informacím další údaje; neumějí pracovat s hesly sdílenými napříč doménami; neumějí pracovat s OTP; zamknou vás na své platformě, protože neumějí export; neumějí poskytnout další funkce, jako sdílení v rodině…
Ja to nechci procitat, muze mi jen nekdo strucne vysvetlit, proc by za spatne ulozena hesla mela Meta dostat pokutu? Ja to vidim tak, ze je to soukroma spolecnost, ktera si s nasimi daty muze delat cokoliv, co jsme jim odsouhlasili v podminkach, takze pokuta by byla na miste pouze v pripade, ze by mela nekde explicitne napsano, ze k nasim heslum nema pristup, protoze jsou nekde zasifrovana a pak by klamala a lhala.
Protože zákony jsou nad dohody takže určité věci se nesmí a jiné musí i kdyby jste se stokrát dohodli jinak. V digitálním světě je to ještě celkem novinka všude jinde je to běžné. Jsou nějaké předpisy jak skladovat potraviny, jak paliva, jak munici, jak hesla. Něco je závazné něco doporučené, něco je smysluplné něco zmršené… a pořád vznikají další, anarchie dávno skončila, i ta digitální.
Tot otazka jakou vhodnou paralelu vymyslet. Pravidla a zakony na nakladani s munici maji vysoky spolecensky zajem, protoze hrozi nehody s vaznymi nasledky. To same zakony pro nakladani s potravinami - otravy jidlem. Ale napriklad zakon neupravuje ze skrine musi byt pripevneny ke stene, to je ciste ponechano na blbosti lidi jestli jim spadne na hlavu nebo ne.
A jaky je zajem na uprave chodu facebooku? Prece jen nikdo nenuti nikoho to pouzivat, a pokud tam naladuje sva osobni data, je to jeho blbost. Problem s hesly je spis obecny dusledek - chceme aby vsechny firmy spravne ukladali hesla, protoze lidi pouzivaji stejna hesla pro vice uctu, a nekdy i pro dulezite ucty (napr. banka). Takze to ze facebook dostal pokutu je vlastne jen dusledek blbosti lidi, a kdyby tahle blbost neexistovala, pak by nebyl jediny duvod nutit facebook aby dobre pracoval s hesly.
K těm přišroubovaným skříním... To je trochu absurdní situace. Ještě nedávno jsem nezažil potřebu šroubovat skříně ke stěně.
Koupil jsem nedávno skříň, poskládal ji, umístil, otevřel ji a ona spadla a rozbila se. Prostě se převážila. Když jsem trochu pátral po tom proč, tak jsem zjistil, že dveře té skříně jsou z těžšího materiálu než stěny - prostě konstrukční vada. V minulosti jsem toto nikdy nezažil.
(Reklamace byla docela prdel, nechtěli o ní vůbec bavit - nakonec jsem jim na prodejně navrhl, aby tam sestavili další skříň - když nespadne, tak ji koupím a odvezu, jinak ať mi vrátí peníze. Všichni si byli tak jistí, že se nic nestane, že když spadla, tak praštila technika do hlavy a byl z toho ještě pracovní úraz.)
Osobně považuji nutnost šroubovat skříň ke stěně jako smutný pomník doby. Ať už pro výrobce, že vyrábí takový šmejd, ať už pro kupující, že nepřemýšlí.
To je sranda číst tu diskusi.
Když nechcu ukládat plaintext heslo, ale jen hash, tak musím poslat heslo v plaintextu (šifrovaným kanálem) aby si server ten hash mohl vytvořit.
Když nechcu posílat heslo, ale hash, tak musí mít server uložené plaintext heslo aby si hash udělal sám.
Ale neznám auth metodu, která by fungovala s hashem jak na servru tak v komunikaci, a netrpěla na replay attack, kdy odposlech hashe je postačující pro příští přihlášení.
Pokud ano, prosím o osvícení...
Nevím jestli je něco takového běžně implementované v prohlížečích, ale jinak to jde třeba takto: z hesla si deterministicky vygenerujete soukromý klíč pro asymetrickou kryptografii, a následně použijete ten algoritmus co používá SSH při přihlašování klíčem (u HTTPS existuje přihlašování certifikátem, což funguje podobně).
Tu sa bavime o ochrane v pripade ze je napadnuty server. Ten vam moze podstrcit challenge z ineho servera kde sa chce vasim uctom dostat a ked mate rovnake heslo aj tam tak sa tam dostane.
Takze sme vsetko super prekomplikovali ale nic sme nezlepsili.
Tohle je mnohem komplikovanější útok, který vyžaduje plnou kontrolu serveru místo jednoduché exfiltrace databáze. A navíc řešení dávno existuje a používá se. Uživatel se identifikuje podepsaným payloadem (většinou JWT, další alternativa je Paseto token), který obsahuje zamýšleného příjemce tokenů (u JWT je to AUD). Pokud si napadený server vezme payload a zkusí ho použít jinde, jiný web je s tím pošle do háje.
Chápu správně, že tvrdíte, že když používám stejný SSH klíč pro servery A a B, tak server A může nějakým způsobem zproxovat přihlašování na server B a přihlásit se tam místo mě?
To mi přijde neuvěřitelné, a dokonce si myslím, že to nejde ani v případě, kdy budu slepě odklikávat takové ty hlášky že klíč protistrany není známý/změnil se.
Ja som to pochopil inak a možno keď to spíšem, tak sa mi utriedia myšlienky.
Máme dva servery, kam sa klient prihlasuje kľúčom (môže byť SSH). Jeden je napadnutý útočníkom a má ho plne pod kontrolou.
Vy sa pokúsiťe prihlásiť na ten napadnutý server a ten urobí to, že preproxuje ( nie priamo, ale s úpravami) spojenie na cielový server, ktorý ešte nemá pod kotrolou. Urobí naň výzvu, To čo sa má podpísať pošle vám, vy to podpíšete mysliac si, že ide o prvý server (ten napadnutý), napadnutý server prevezme odpoveď a pošle ju na server, ktorý sa snaží napadnúť. A voilá, je tam.
Možno si to predstavujem veľmi jednoducho.
Nikoli, takhle to nefunguje. V TLS i SSH se používá Diffieho–Hellmanova výměna klíčů. Princip je v tom, že klient se serverem si dohodnou šifrovací klíč, který budou v rámci spojení používat, ale ten klíč se nikdy neposílá v rámci komunikace, ani nejde odvodit z toho, co se posílá. Tj. ten útočník uprostřed může přeposlat výzvu serveru klientovi a odpověď klienta přeposlat zase na server – ale výsledkem bude, že klient a server budou mít šifrovací klíč a útočník uprostřed nebude mít nic.
V rámci téhle výměny se ale nedělá žádné ověření protistrany. Útočník by tedy mohl udělat to, že nebude klientovi posílat výzvu originálního serveru, ale svou vlastní. Právě proto, aby tohle nemohl útočník udělat, je potřeba ověřit klíč serveru (buď certifikát v TLS, nebo otisk klíče v případě SSH).
Toto je este iba faza autorizacie, tam sa posiela iba challenge ktory klient podpise svojim privatnym klucom. Ak posle challenge z druheho servra tento klient ho podpise a ma co potreboval.
Toto nie je ziadny MITM. Vy si chcete urobit session na uplne iny server vy ste jeho klient. Vy mate privatnym klucom podpisany challenge z ineho servra.
Podle mne Čavo popisoval MitM útok, a ten na SSH udělat nejde, pokud si klient zkontroluje, s jakým serverem komunikuje (podle otisku klíče serveru) – ať už z DNS, ze své cache nebo to ověří uživatel.
> budu slepě odklikávat takové ty hlášky že klíč protistrany není známý
A dokonca ani to sa nestane, lebo spojenie so serverom A je validne. Proste iba challenge servera A bude ten zo servera B a potom odpoved poslete na server B.
Z toho isteho dovodu mate iny kluc na podpisovanie dokumentov a iny na prihlasovanie. Teoreticky by vam server mohol podhodit ako challenge hash nejakeho dokumentu a ak ho podpisete 'podpisovym klucom' tak ma vami podpisany dokument.
> A dokonca ani to sa nestane, lebo spojenie so serverom A je validne. Proste iba challenge servera A bude ten zo servera B a potom odpoved poslete na server B.
A podle vás je tedy SSH zranitelné na tento typ útoku? Byl byste to ochoten předvést? Ať nemluvím do větru: za bounty, řekněme 10000 Kč (či ekvivalent v EUR/BTC)?
(pro jistotu předem explicitně uvádím, že se nebavíme o neomezeném forwardingu SSH agenta)
Když nechcu ukládat plaintext heslo, ale jen hash, tak musím poslat heslo v plaintextu (šifrovaným kanálem) aby si server ten hash mohl vytvořit.
Nemusím.
Když nechcu posílat heslo, ale hash, tak musí mít server uložené plaintext heslo aby si hash udělal sám.
Nemusím.
Ale neznám auth metodu, která by fungovala s hashem jak na servru tak v komunikaci, a netrpěla na replay attack, kdy odposlech hashe je postačující pro příští přihlášení.
To umí i hloupá autentizační metoda HTTP Digest, standardizovaná v roce 1997.
Vtip je v tom, že těch hashů je víc. Na serveru je uložený hash odvozený ze jména, hesla a domény. V komunikaci se pak posílá hash odvozený z prvního hashe a výzvy poslané serverem.
Skuste si pozriet take mTLS. To by v podstate stacilo, dokonca by vam stacil certifikat od hociktorej uznavanej autority aby ste si nemuseli nikde zriadovat ucet a vsade vas 'poznali'.
O HTTP digest sem si cetl kdyz to byla 5 let zhava novinka, tak sem si to precetl znova... A nepamatuju si to az tak spatne, cituji z wikipedie:
A server can store HA1 = MD5(username:realm:password) instead of the password itself. However, if the stored HA1 is leaked, an attacker can generate valid responses and access documents in the realm just as easily as if they had access to the password itself. The table of HA1 values must therefore be protected as securely as a file containing plaintext passwords.
Kdyz se nad tim zamyslim, tak ano porad je to lepsi nez primo plaintexty, protoze to v pripade uniku jde pouzit pouze pro prihlaseni k te postizene sluzbe, a nejde to vytezit na databazi hesel pro jine sluzby (kde by mohl byt stejny login a heslo) protoze aspon realm bude jiny (snad). A taky to zabrani pripadnemu odposlechu hesel na napadenem servru.
Jak tam ale pisou ze tyhle digesty by mely zabranit phishingu, tak o tom pochybuji. Pokud se dostanu na phishingovou stranku, a ta misto digestu pouzije basic auth, tak si to ani nevsimnu, a heslo poslu... Aspon sem si teda nevsiml ze by prohlizece nejak prominentne informovaly jestli se pouziva basic nebo digest. A to nemluvim o tom, ze HTTP auth se vubec pouziva strasne malo.
Kazdopadne nejaky clanek o tom jak to udelat nejlepe (a prakticky) - aby heslo nebylo ani na servru ani nikde po ceste v plaintextu by bylo zajimave. Zatim mi z toho vychazi jenom autentizace klientskymi SSL certifikaty, a s tou jsem se na webu nikde nepotkal. (pouze SSH klice jedou na stejnem principu). Pripadne nejake ty kerberosy, a autentizace pres 3. stranu (mojeID)? Ale i tam to heslo nekde lita, takze je to jenom prehozeni problemu na jiny server.