Apple: goto fail

Tipične računalne pogreške nastaju kodiranjem u brzini i uz nedovoljno pažnje. Srećom, mnoge od tih pogrešaka bivaju otkrivene već prilikom kompajliranja, kada kompajler prijavi grešku ili upozorenje. One koje se provuku prolaze kroz dugotrajnu proceduru provjere kvalitete i većinom bivaju ispravljene prije puštanja proizvoda na tržište. Taj proces nije idealan, no ovo što se dogodilo tvrtki Apple poprilično je nezgodan i zaista opasan problem.

Apple je nedavno u tišini izdao zakrpe za iOS i odbio ih detaljnije komentirati. Tako je samo zaintrigirao stručnjake za sigurnost koji su istražili problem i otkrili opasan propust u kodu koji verificira ispravnost SSL certifikata, a koji se nalazi u Appleovom kodu kojim je zamjenjen stari kod iz OS X 10.7 i starijih.

Ovo je izvorni kod problematičnog mjesta:

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

Vjerojatno vam je, ovako ponuđen na pladnju, problem odmah iskočio pred oči: programer je dva puta za redom napisao "goto fail;".

Na sumnju da je riječ o nedovoljno iskusnom programeru dovodi nas činjenica da je koristio naredbu za "pacere" goto kojoj programeri pribjegavaju tek onda kada logiku ne mogu zadati "normalnijim" grananjima, a želja za izbjegavanjem vitičastih zagrada za označavanje bloka naredbi, koja bi ovaj copy&paste problem eliminirala, dovela je do situacije u kojoj se naredba viška bespogovorno izvršava jer nije dio niti jednog uvjeta i tako faktički zaobilazi kontrolu SSL certifikata.

Krajnji rezultat je opasan sigurnosni propust u kojem svatko može podvaliti bilo kakav lažni SSL certifikat, a računalo/telefon će ga "progutati", otvorivši tako široku cestu malicioznim namjerama nepoznatih osoba.

Rješenje problema je što brži update OS-a na telefonima i uskoro na računalima, a u međuvremenu je moguće malo pomoći izbjegavanjem korištenja Safari browsera (ali istu rutinu koriste i drugi Appleovi proizvodi, odnosno korištenjem Open Source rješenja (Firefox, Thunderbird...) za komunikaciju s vanjskim svijetom.

Detalje o problemu ima Sophos, a na blogu ImperialViolet pronaći ćete detalje o softverskom propustu.

Vote: 
5
Vaša ocjena: Nema Average: 5 (1 vote)

Komentari

https://www.imperialviolet.org/2014/02/22/applebug.html says:

I coded up a very quick test site at https://www.imperialviolet.org:1266. Note the port number (which is the CVE number), the normal site is running on port 443 and that is expected to work. On port 1266 the server is sending the same certificates but signing with a completely different key. If you can load an HTTPS site on port 1266 then you have this bug.