Tweets by @buherablog
profile for buherator at IT Security Stack Exchange, Q&A for IT security professionals

A BitBetyár Blog

Túljártál a nagyokosok eszén? Küldd be a mutatványodat! (e-mail a buherator gmailkomra jöhet)

Full-Disclosure / Névjegy / Coming out


Promó

H.A.C.K.

Címkék

0day (110) adobe (87) adobe reader (21) anonymous (26) apple (60) az olvasó ír (49) blackhat (20) botnet (22) bug (200) buherablog (44) buhera sörözés (39) bukta (49) deface (38) dns (22) dos (29) esemény (82) facebook (26) firefox (64) flash (33) gondolat (31) google (59) google chrome (36) hacktivity (37) hírek (117) incidens (224) internet explorer (88) iphone (35) java (50) jog (22) kína (21) kriptográfia (68) kultúra (21) linux (24) malware (43) microsoft (142) móka (48) mozilla (23) office (26) oracle (40) os x (43) patch (197) php (20) politika (31) privacy (58) programozás (22) safari (34) sql injection (62) windows (85) xss (77) Címkefelhő

Licensz

Creative Commons Licenc

Apple vs. SSL - GOTO fail;

2014.02.22. 12:14 | buherator | 14 komment

Az Apple ma kiadott iOS frissítésében (7.0.6, 6.1.6) egy különösen veszélyes problémát javított a készülékekkel szállított SSL könyvtárban. Úgy tűnik, Stefan Essernek sikerült megtalálnia a problémát okozó kódrészletet, amivel az Apple előkelő pozícióra tett szert a hülye hibák ranglistáján:

static OSStatus
SSLVerifySignedServerKeyExchange(SSLContext *ctx, bool isRsa, SSLBuffer signedParams,
uint8_t *signature, UInt16 signatureLen)
{
// ...
if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
goto fail;
goto fail;
if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
goto fail;

err = sslRawVerify(ctx,
ctx->peerPubKey,
dataToSign, /* plaintext */
dataToSignLen, /* plaintext length */
signature,
signatureLen);
// ...

fail:
SSLFreeBuffer(&signedHashes);
SSLFreeBuffer(&hashCtx);
return err;

}

Amint látjátok, egy feltehetően véletlenül becsúszott(?) sorduplikáció azt eredményezi, hogy a kód hibaágra fut még az SSL tanúsítvány tényleges ellenőrzése előtt, ami nem lenne akkora baj, ha a függvény visszaadott hibakódja nem jelezne sikert (err=0, nincs hiba). Így a hibás implementáció gyakorlatilag bármilyen tanúsítványt elfogad. (Komolyan érdekelne, hogy egy ilyen problémára miért nincs legalább egy unit teszt az Apple-nél...)

A durva az, hogy a Register szerint a probléma az OS X 10.9.1-et is érinti, javítás azonban egyelőre csak a 10.9.2 bétájában áll rendelkezésre (vagy talán ott sem). Szintén kellemetlen helyzetben vannak a jailbreakerek, akik számára egyelőre nem áll rendelkezésre a frissített verziókra szánt evasi0n.

Friss: Kutyacica tesztjei szerint a probléma legalább 2013 márciusa óta fenn áll. Ez azt jelenti, hogy az Apple megvalósítását használó SSL kliensek (pl. Safari) már legalább egy éve nem voltak megbízhatók.

Friss2: A legfontosabb információk, az eszközök tesztelésére használható tesztek, illetve linkek a nem hivatalos patchekhez a gotofail.com-on vannak összegyűjtve.

Címkék: apple ssl os x fail ios

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben.

hillaby · http://twitter.com/hillaby 2014.02.23. 12:31:41

Itt a probléma nem a goto-val volt, (merthogy az elég gyakori a C-s világban, ld. pl. OpenSSL forrása), hanem egyrészt a kapcsos zárójelek, másrészt pedig - és ez a szomorú - a tesztek hiányával. El se hiszem, hogy egy ilyen fontos funkciót valahogy nem tesztelnek az Apple-nél.

Gerilgfx 2014.02.23. 14:06:32

semmi különös, csak a szokásos apple minőség.

NagySzellem 2014.02.23. 16:17:45

@hillaby: Azért pont a c alapú nyelvekben, a goto nélkül érdemes dolgozni, de a tesztelés ilyen szintű elmaradása, az szinte hihetetlen.

NagySzellem 2014.02.23. 20:22:40

@hillaby: Ez már döfi! 49 goto 437 hasznos kód sorban. Kösz, élmény volt. :)
Eric csak írni szeret kódot, olvasni nem.
Ez a disassembler programok szintje.

buherator · http://buhera.blog.hu 2014.02.23. 20:55:01

@hillaby:
A beágyzott xkcd strip szerintem jól rávilágít a probléma lényegére. És ezen az sem változtat, hogy a goto elterjedt (vö. "egyél szart, 100 milliárd légy nem tévedhet").

Emellett persze más szempontok (indent, zárójelezés, hibakezelési minta,...) is felhozhatók a problémával kapcsolatban (avandeursen.com/2014/02/22/gotofail-security/), de ennél egyértelműbb példát a goto ellen csak nagy kínlódás árán tudnék felhozni.

hillaby · http://twitter.com/hillaby 2014.02.23. 21:19:59

@buherator:

goto nélkül ugyanez a függvény:
- vagy tele lenne ismétlődő

SSLFreeBuffer(&signedHashes);
SSLFreeBuffer(&hashCtx);
return err;

blokkokkal

- vagy az egyre növekvő indentálás miatt kimászna jobbra a képernyőből

Ha pedig felbontjuk függvényekre (amit ilyenkor javasolni szoktak), akkor csomó, csak egy helyről meghívódó függvényt gyártottunk, feleslegesen.

Egyik sem túl jó, persze a goto sem. Ez van, ha C-ben programozunk.

hillaby · http://twitter.com/hillaby 2014.02.23. 21:38:57

Egyébként még az utolsó lehetőség a legkevésbé fájdalmas.

dailyvicodin 2014.02.23. 23:36:50

ha valaki nem lenne lusta használni a { } zárójeleket, sokkal könnyebben rájönne, hogy fasságot csinál.

Drout 2014.02.24. 18:06:59

ilyenkor úgy elolvasnám mit mond petert (zokszigen) erre a témára :)

domi007 2014.02.24. 21:37:04

Eszerint az elemzés szerint azért nem annyira triviális tesztesetet gyártani a problémára, mert nem egyértelmű, hanem a handshake legmélyén van:
www.imperialviolet.org/2014/02/22/applebug.html

Tegnap IRCn kicsit körbejártuk a goto-t is, és végül is a konszenzus az volt, hogy nem feltétlenül bűn itt használni amíg megmarad az ilyen goto fail szinten és nem burjánzik tovább.

theshadow · http://hackstock.blog.hu/ 2014.02.26. 12:52:03

static OSStatus
SSLVerifySignedServerKeyExchange(SSLContext *ctx, bool isRsa, SSLBuffer signedParams,
uint8_t *signature, UInt16 signatureLen)
{
// ...
if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) == 0 &&
(err = SSLHashSHA1.final(&hashCtx, &hashOut)) == 0)
{

err = sslRawVerify(ctx,
ctx->peerPubKey,
dataToSign, /* plaintext */
dataToSignLen, /* plaintext length */
signature,
signatureLen);
// ...
}

SSLFreeBuffer(&signedHashes);
SSLFreeBuffer(&hashCtx);
return err;

}

Problem? (Esetleg blog.hu elrontja a formázást.)

bagoj ur 2014.02.26. 13:12:09

@dailyvicodin: +1 Goto nem _annyira_ gáz, de a kapcsos zárójelek elhagyása luxus. És minden kód auditnál előjön egy rakás és a legfegyelmezettebb programozó is lespórolja néha. Szerintem a compilernek nem lenne szabad lefordítania és kész. Jó ötletnek tűnhetett anno de nem az.

hillaby · http://twitter.com/hillaby 2014.02.28. 09:01:06

@theshadow: sőt, ilyet is láttam már:

err = func1();
if (err == 0) {
err = func2();
}
if (err == 0) {
err = func3();
}
if (err == 0) {
err = func4();
}
return err;