Doufám, že všichni, kteří teď zuřivě vyměňují serverové privátní klíče, si uvědomují, že pokud server přistupuje heslem nebo privátním klíčem k dalším zdrojům (databáze, LDAP, SMTP server, webové služby), mohly být tyto přístupové údaje také v části paměti zaslané případnému útočníkovi. A je to myslím mnohem pravděpodobnější, než že tam byl privátní klíč serverového certifikátu (jedná se o paměť, která byla pravděpodobně nedávno uvolněna).
Takže bych nejdřív měnil klientská hesla k databázím, LDAPu, SMTP, privátní klíče pro autentizaci klienta webových služeb – a až na závěr, pokud dojdu k tomu, že jde o riziko převyšující cenu nového certifikátu, bych měnil privátní klíč serverového certifikátu.
Samozřejmě je nutné v případě žádosti o nový certifikát vyměnit privátní klíč, nestačí pro současný klíč požádat o nový certifikát.
Dakujem za clanok. Ak som to spravne pochopil tak utocnici maju tym vecsiu sancu ziskat moje udaje cim castejsie sa prihlasujem, cize ked stahuejem maily raz za 10 minut tak ma maju skoro urcite, ale ked ako admin menim nastavenie crona raz za mesiac tak by museli mat riadne stastie aby ziskali moje heslo.
V 90. letech jsem trochu přičuchnul k programování podobných kritických aplikací a vždy platilo, že pokud v programu používám citlivá data (heslo, klíč, ale i rozšifrovanou komunikaci), musím je držet v paměti jen po nezbytnou dobu a před uvolněním pamětí vymazat (přepsat nejlépe náhodným řetězcem). Právě proto, aby pak někdo nedostal alokovanou paměť se zbytkem citlivých údajů. Toto je absolutní požadavek a má přednost před jakýmikoliv nevýhodami (snížení propustnosti, ...).
Jak je možné, že tak základní pravidlo ignorují vývojáři OpenSSL? To to opravdu psala tlupa nadšenců bez základních znalostí o bezpečném programování?
Rozšifrovanou komunikaci musí OpenSSL předat dál, třeba webovému serveru. A nemůže ovlivnit, co s tím bude aplikace dál dělat, jestli to webový server bude držet v paměti jen po nezbytnou dobu a před uvolněním paměti data přepíše. Webový server by musel vymazávat každý kousek paměti, který uvolňuje. To je nereálné.
Dnes se za správné řešení (pokud už chcete nebo musíte používat jazyk s explicitním memory managementem) považuje používat takové implementace malloc a free které znemožňují podobné úniky dat. Chtít po programátorech aby data z paměti mazali přímo v kódu své aplikace je pro ně spousta práce a hlavně se v tom velmi lehce dá udělat chyba.
Bohužel vývojáři OpenSSL si udělali vlastní implementaci malloc a free která je z pohledu bezpečnosti úplně špatně, a tím vedla k tomuto problému (Heartbleed).
Víc se dá dočíst například na http://it.slashdot.org/story/14/04/10/1343236/theo-de-raadts-small-rant-on-openssl
Víc se dá dočíst například na http://it.slashdot.org/story/14/04/10/1343236/theo-de-raadts-small-rant-on-openssl
Panebože, zneuznaný sociopat opět radí. Kdy zas bude nějaká "pomooooc, krachujeme" sbírka na jeho OS?
Jenomže problém je, když dostanu třeba čtyřkilový blok vedle používanýho 16kilovýho, kde jsou citlivý data.
Takže nestačí jenom mazat RAMku, ale ještě je celkem dobrý validovat komunikaci s vnějším světem. "A podmínka if(RealDataLength != ReceivedDataLength) throw EBrokenPacketError" nesmí nikde chybět. Průšvih je, že tohle je tak triviální věc, že každý bere jako samozřejmost existenci téhle podmínky a ani se neobtěžovali napsat na to nějaký unit test!
Mýlíte se, neposílají se data uvolněná z heapu. Princip chyby je v tom, že se vezme délka payloadu podstrčená útočníkem, alokuje se potřebný buffer pro odpověď a do toho bufferu se zkopíruje payload dat z requestu. Co je v paměti kolem requestu nikdo neví, může to být alokovaná i nealokovaná pamět. Více viz
http://blog.cryptographyengineering.com/2014/04/attack-of-week-openssl-heartbleed.html
"alokuje se potřebný buffer pro odpověď a do toho bufferu se zkopíruje payload dat z requestu"
Nemělo by tohle náhodně způsobovat segfault? Když bude buffer v paměti umístěn kousek od konce alokované paměti pro daný proces, tak si při čtení sáhne mimo tento alokovaný prostor a celkem nutně bude docházet k segfaultům ne?
Nebo je nějakou jinou "vlastností" openssl zaručeno, že ten buffer bude vždy dostatečně daleko od hranice paměti? Jestli mají vlastní malloc, tak je možné asi všechno.
Ano, může to způsobit segfault, ale ve většině případů se to nestane. Pokud má OpenSSL vlastní alokátor, tak ten si naalokuje systémovým alokátorem velký kus paměti, ve kterém si potom dělá svoje alokace. Pravděpodobnost, že by data requestu byly na konci bloku, za kterým už není 64 KB paměti, je malá.
Nene. Já jsem to pochopil takhle:
1. Útočník pošle ping s daty 16 Bytů a požadavkem na 64kB.
2. Server alokuje paměť pro přijatý paket (řekněme 4kB ve widlích - minimální objem). Co je uloženo kolem je mu jedno.
3. Server odešle požadovaných 64kB, ty 4kB jsou na začátku.
4. Útočník chytne odpověď a zahodí první 4kB dat. Má 60kB heapu ze serveru.
5. S každým opakováním může získat jiný kus RAMky.
No a v těch blocích za alokovaným bufferem už je to loterie, co se v nich najde. Může to být vyplněný nějakou neutrální hodnotou (třeba 0xdeadbeef jak doporučuje McConnel), náhodná hodnota, nebo tam může být přihlašovací paket jinýho uživatele, ketrý čeká na parsování. Útočník dostane blok binárních dat a musí je ještě parsovat, aby zjistil, co vlastně (ne)má. A pokud chce třeba 1MB RAMky, musí dotaz opakovat a nějak si poskládat image RAM. Což chvíli trvá a RAM se při tom dynamicky mění... Takže kumšt není vytáhnout 60kB RAM, kumšt je umět rozpoznat, co přišlo a něco s tím podniknout. A štěstí je rovnou chytnost data, který potřebuje.
Každopádně nevím, jestli je to víc chyba, nebo ostuda.
Vysvetleni, ktere muzete pouzit pro rodice, managery...
http://xkcd.com/1354/
K jaké paměti má vlastně OpenSSL přístup? Z logiky věci by měly být paměťové prostory jednotlivých procesů oddělené. Nebo je paměť společná pro celý HTTP server, včetně všech modulů, interpretů a podobně?
Pokud ano, tak mi to připadá jako dost velký návrhový nedostatek - v porovnání například s IIS, kde jsou třeba FastCGI moduly zcela odděleny (i co se přístupových práv týče).
OpenSSL má přístup k celé paměti aktuálního procesu který tu knihovnu používá. To platí na Windows stejně jako na Unixech. Pokud jde o Apache httpd, tak tam jde o modul mod_ssl, který realizuje SSL/TLS, a běží ve stejném procesu který obsluhuje spojení s klienty. Pokud v tom samém procesu běží například PHP, je k dispozici spousta dat, ale i pokud je aplikační zpracování v jiném procesu (např. PHP přes FastCGI, nebo třeba aplikační server připojený přes mod_proxy_ajp) tak je v paměti procesu celkem dost dat - například tělo i parametry HTTP požadavků, což mohou být i přístupová jména, hesla nebo autorizační cookie - takže je to úplně stejné jako u IIS.
Přesně tak, jen bych ještě podotknul, že knihovna OpenSSL používá svůj vlastní alokátor paměti, takže je velmi nepravděpodobné, že by se někomu pomocí heartbeatu podařilo získat data z jiné části paměti stejného procesu, než té, která patří knihovně OpenSSL. Jenže TLS knihovnou musí z logiky věci procházet veškerá data a to jak v šifrované, tak i v nešifrované podobě, takže i tak jde o poměrně hodně zajímavých dat.
Kdyz se nad tim zamyslite, tak vam asi samotnemu dojde, ze by to byla dost zasadni dira do systemu. Takto by slo cist jakakoli data z jinych procesu napr. jinych uzivatelu.
Kdyz alokujete v C, tak vam knihovna da nejaky kus ktery byl nejspis v tom danem procesu uz pouzit drive, cili tam bude nahodny bordel z toho procesu. Pokud uz v ramci procesu pamet neni, tak system prideli nejake nove stranky a predpokladam (popravde nevim), ze to vynuluje nebo nejak jinak nastavi/znahodni.
No ve Windows se alokuje pomocí VirtualAlloc a každý commitnutý 4KB blok (stránka) je automaticky nulovaný. V linuxu se blok commituje při prvním přístupu (před tím, co je rezervován mallocem) a vsadím se, že je taky vynulovaný. Jakmile je blok commitlý, patří plně do vlastnictví procesu.
Jednodušeji a lépe, každý proces je v paměti naprosto a dokonale izolován. Z jeho pohledu je v paměti sám a na nevyužitých adresách jsou buď nuly, nebo minové pole. Jen za určitých okolnosti lze sdílet paměť mezi procesy, ale to musí extra vyjednat a pak ten proces vidí sdílený kus ve vyjednaném rozsahu a ani o bajt víc.
Alokace paměti má dvě vrstvy: procesovou a jadernou. Jaderná alokuje vždy po stránkách, jinak to neumí. Ty samozřejmě mohly patřit jiné aplikace, a tak je při alokaci vždy vynuluje. Takže k úniku dat z jiné aplikace takhle dojít nemůže. Uvnitř procesu se pak tyto stránky rozdělují na menší jednotky, protože datové struktury málokdy potřebují celou stránku. Ty se po dealokaci recyklují (volání jádra jsou dost drahá, proto se alokátor snaží je minimalizovat), ale to už nikdo nemaže a tak při další alokaci můžou být na naalokovaném místě dříve smazaná data toho samého procesu.
Velikost payloadu ve zprávě musí být, protože za payloadem následuje ještě pole paddingu s proměnlivou velikostí, viz definici zpráv v RFC 6520.
Ono když už něco vyjde jako RFC, znamená to, že se na to podívalo několik párů očí, takže „totální selhání“ není úplně pravděpodobný scénář.
Nekdo by mohl argumentovat - a co MS08-067? Chyba MS08-067 sice umoznovala vzdalene spustit kod, ale jen pokud byly do internetu vystrceny porty, ktere tam nemaji co delat. Tohle (https://news.ycombinator.com/item?id=7576389) je trochu jine kafe…
No tohle je na urovni exploitu v prohlizeci, ktere jsou (bohuzel) bezne. Utocnik musi dosahnout toho, ze obet navstivi kompromitovany web…
Prijde mi, ze na tuto knihovnu "nejakeho Jendy" bylo spolehano zejmena proto, ze to pouzivaji vsichni, tak to musi byt ok. http://permalink.gmane.org/gmane.comp.security.cryptography.randombit/3341: "Overall, I would say that yes, OpenSSL is a huge mess for application
developers. In that sense, it's very bad. On the other hand, it's the
most thoroughly reviewed open source crypto implementation, and hasn't
had very many security bugs found in the library per se. " Toto ("most thoroughly reviewed open source crypto implementation") byla asi jen dobra vira…
Jinak by tohle nezustalo 2 roky nepovsimnute:
/* Enter response type, length and copy payload */
*bp++ = TLS1_HB_RESPONSE;
s2n(payload, bp);
memcpy(bp, pl, payload);
// hodnotu promenne payload kontroluje utocnik
Moc by som sa netesil ak MS este nema zadne vratka tak ich urcite dostane. Preco? Sloboda nieco stoji a na vychode je taka krajina kde ludia citaju azbuku, a maju jadrove hlavice. Je mozne ze za tyzden uz bude tako krajina susedit zo Slovenskom. Putina by nesledoval len blazon.
Len tak som si stiahol openSSL zdrojaky ci su naozaj take necitatelne. Pre kratkost casu som si vybral kod AES. Dalo by sa mu vytknut ze je tam malo komentarov a ze mena premennych su striktne dvojznakove niekedy doplnene cislom (napr. rk[5] = rk[1] ^ rk[4]; ). Ale myslim ze je ten kod pochopitelny.
Chápu vaše znepokojení z pozvolna nastávajícího souseda, ale už jste zjistil co to znamená to doplnění číslem? ;-) Jedna z mých oblíbených funkcí "doplňování číslem" v C je že to je v podstatě jen makro - takže se a[b] převádí na *(a+b), takže a[b] je to samé co b[a] neboli by se ten příklad dal přepsat na rk[5] = 1[rk] ^ 4[rk]; a to teprve vypadá zajímavě! :-)
Aj si za tym „a ze mena premennych su striktne dvojznakove niekedy doplnene cislom“ stojim, daval som tam priklad na dvojznakove rk[ 7] = rk[ 1] ^ rk[ 6];
Pridavam priklad na dvojznakove doplnene cislom tp1 = rk[j]; A pre upresnenie myslim "tp1".
Ked vtipkujeme na temu hranic CR tak pridam este taky smiesny dodatok. Nejaky rusky oddiel zabludi prejde hranice SR sporadicky odpor rozdrti a po tych 14 dnoch 96.8% slovakov bude suhlasit v referende s pripojenim k Rusku :-)
Ono to je este trosku zlozitejsie, rk je definovne ako pointer.
u32 *rk;
U32k je definovane ako pole
static const u32 rcon[] = {
0x01000000, 0x02000000, 0x04000000, 0x08000000,
0x10000000, 0x20000000, 0x40000000, 0x80000000,
0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
je to v subore openssl-1.0.1g\crypto\aes\aes_core.c
Trosku AES poznam ale naozaj neviem co je rk. Mohlo by to byt roundkey ?
Stiahnutie openssl mi trvalo 10 sekund a rozbalenie 5 sekund. To je malinka strata casu, kazdy sa moze presvedcit sam ci to je necitatelne.
Suhlasim ze tato chyba je tragedia, tak by sa mala komunita poucit a hladat chyby. Lebo inak hrozi MS SSL kde mozeme len hadat co je vnutri.
Tak samotny AES sa neda naprogramovat nejak extra zle. Co takto ho ale pouzit v nejakom blokovom mode, napriklad GCM. To az potom zacina sranda s (ne)dokumentaciou a digitalna archeologia, ze ako to vlastne autori OpenSSL mysleli.
Este vacsia sranda nastava, ked clovek chce implementovat nejaky blokovy mod, ktory aktualne nie je v kniznici podporovany, alebo je implementovany ciastocne a nie je exportovany navonok. Vzhladom na (ne)dokumentaciu, je to prakticky nadludsky vykon. Dodnes si pamatam na tie 4 levely makier, ktore nerobia nic ine, iba obfuskuju miesto, kde su niektore exportovane funkcie implementovane.
Autora toho "OpenSSL is written by monkeys" uplne chapem a mam takmer identicku skusenost...
Ten článek je bulvárního typu ..
To sem si o ROOT nemyslela že klesne až takhle.
V článku ůmyslně a zcela chybí označení kterých SSL knihoven a jaké verze se to týká což je informace důležitá než blekotání okolo s neurčitostí...
Chybí i pitva kódu v té ssl knihovně přesně kde to je způsobeno .
Ten článek je bulvárního typu ..
To sem si o ROOT nemyslela že klesne až takhle.
To je snadné napsat, mnohem těžší obhájit. Buďte prosím konkrétní a jmenujte prvky, ve kterých vám článek připadá bulvární. Možná máte pravdu a já to jen nevidím. Takovýmto výkřikem do tmy mě ale nepřesvědčíte.
V článku ůmyslně a zcela chybí označení kterých SSL knihoven a jaké verze se to týká což je informace důležitá než blekotání okolo s neurčitostí...
Tady důrazně ohrazuji proti slovu ůmyslně. Vy mi vidíte do hlavy? Pokud ne, těžko můžete posoudit, co bylo úmyslné a co bylo opomenutí. Uznávám, čísla dotčených verzí v článku být mohla. Na druhou stranu, článek je především post-mortem analýzou v době, kdy už je (doufáme) všechno záplatováno a všichni informováni předchozími aktualitami. V článku je také aktivní odkaz na CVE-2014-0160, což je autoritativní zdroj se seznamem postižených verzí.
Chybí i pitva kódu v té ssl knihovně přesně kde to je způsobeno .
Odkaz na pitvu kódu je na konci podkapitoly V čem je problém. Domnívám se, že jednoduché vysvětlení podstaty problému je užitečnější než opisování ukázek kódu; každý nemusí rozumět zrovna konkrétnímu programovacímu jazyku.
A ty vysokourovnove architektury budou napsany v cem konkrentne ? Rozkouskovani a parsing packetu bude vzdy docela nizkourovnova prace nehlede na programovacim jazyku. Musim prece cist presne jak to mam RFC, ne doufat, ze to snad dopadne dobre a ten int bude opravdu 32 bitu a jeste se to spravne prehodi podle endianity. Na druhou stranu bullet proof memory alokator by docela hodil.
„Rozkouskovani a parsing packetu bude vzdy docela nizkourovnova prace nehlede na programovacim jazyku. Musim prece cist presne jak to mam RFC, ne doufat, ze to snad dopadne dobre a ten int bude opravdu 32 bitu a jeste se to spravne prehodi podle endianity.“
K tomu ale přece vůbec není potřeba memcpy, které ti omylem přepíše kus paměti, která s tím vůbec nesouvisí.
A například v Pythonu se parsuje binární paket takto:
struct.unpack("!I",bytearray(q[16:20]))
Kupodivu je endianita jasně daná, i je jasně dané, že je to 32bit unsigned.
Napr. v jazyce Erlang jsou na praci s binarnimi daty celkem elegantni syntakticke konstrukce ktere jsou velmi rychle (mikrosekundy). Delat v tom nejaky binarni protokol je radost. Na ASN1 tam je knihovna a pod. Integery jsou tam pro jistotu nekonecne. Na SSL je tam systemova interni knihovna (nevim jak moc kompletni).
Neda se to embedovat do jinych jazyku (jako treba Lua).
Jinymi slovy - daji se najit potecionalne zajimave cesty ci jejich naznaky.
Vsetko sa to zaklada na viere ze kniznice v nejakom jazyku su nezranitelne. Odporucil by som sa pozriet na videa z defcon tusim 19. Prednasajuci napisal program v c nieco ako hello world co vypisoval co bolo v prikazovom riadku ako parameter. Pomocou printf funkcie spravnych parametrov co pretiekli v pameti ziskal prava root, len tak za 40 minut prednasky.
Prelozil som si zaciatok. "Scheme-79 je jednocipovy mikroprocesor ktory implementuje dialekt jazyka lisp". Co by to bolo v realnom serveri? Nieco ako matematicky koprocesor pre 386? Ako hlavny procesor si to neviem predstavit hlavne preto lebo vsetky program by sa museli prerobit z x86 na lisp, to je tak 20 rokov prace ludstva. Viem si to predstavit v dalekej buducnosti ako pocitac lode Enterprise a namiesto lispu by bola anglictina napriklad.
Jednou k tomu stejně dojde. Například, až bude bude jednou průmysl donucen přestat hopkat kolem vonneumanovské architektury a přejít ke skutečně masivně paralelním architekturám (dataflow), protože ze samotné podstaty sekveční architektura prostě nejde donekonečna chaoticky oblepovat "zlepšováky" typu OoOE.
Jinak co se týče obhajoby tvrzení, že eliminovat složitost výpočetních systémů u zdroje (tzn. v hardwaru) je nejen správné, ale i nutné, nemá-li tato složitost dosáhnout skutečně absurdních a nezvladatelných rozměrů, mnohem více je k dočtení zde.
Věta "Nutno dodat, že stejnou funkcí disponuje i transportní protokol TCP, ovšem perioda jeho keepalive zpráv je v řádu hodin" je trochu zavádějící. Časování se dá nastavit v /proc/sys/net/ipv4/tcp_keepalive_*
AFAIK se v Linuxu nedá nastavit pro jednotlivá spojení, takže keepalive na vyšší vrstvě má opodstatnění, ale takhle obecně to není.
Podle TCP Keepalive HOWTO se dokonce dá nastavit časování každému procesu zvlášť. Ale neznám aplikaci, která by to dělala. Ve vedlejší diskuzi ještě padl argument, že TCP keepalive může rozbít špatně napsané aplikace, které nepočítají s tím, že volání read(2)
ze soketu vrátí nulu.
Ale kdybych měl do citované věty ještě rýpnout z jiné strany, pak není pravda, že perioda je v řádu hodin. Dvě hodiny jsou pouze prodleva před prvním heartbeatem, pak následují keepalive zprávy každých 75 sekund, aspoň ve výchozím nastavení.
To, jaký používáte správce hesel není v tomto kontextu vůbec relevantní. Jedině snad, kdyby správce hesel samotný byl heartbleedem postižen, pak by bylo nutné vyměnit úplně všechna hesla v něm uložená.
Jak moc nebezpečné je hesla neměnit se neví. O zranitelnosti se pravděpodobně dlouho nevědělo, nikdo však nemůže vyloučit opak. V každém případě obecné doporučení pro bezpečné heslo je takové heslo aspoň jednou ročně vyměnit, takže změnu hesel můžete mít jako součást pravidelné rutiny.