iOSのSSLに関するバグ

なんかTLとRebuild: 33: There's No Test For goto fail (hotchpotch)で話題になってた。

Apple史上最悪のセキュリティバグか、iOSとOS XのSSL接続に危険すぎる脆弱性が発覚──原因はタイプミス? | アプリオ


上記の記事を最初読んだときgoto failが常に実行されるから常に失敗する気がして、それじゃあ「常に検証が成功することになってしまう」のところがよく分からなかったんだけど、上記記事のリンク先の記ImperialViolet - Apple's SSL/TLS bugを読んだらなんとなくわかった。


問題のコードは下記。goto failが2つ連続で並んでいるのが問題。pythonじゃなくてCなのでSSLHashSHA1.update(&hashCtx, &signedParams)の結果が0であっても2番目のgoto failが実行される。なんでgoto文使うんだって話があるかもだけど例外機構が無い場合はしょうがないような。。。で、このときerr変数は0なのでfail:のreturn errで何が返るかっていうと0、つまり正常終了ですね。たとえ次のチェックSSLHashSHA1.final(&hashCtx, &hashOut)の結果が失敗、つまりerrが0以外でもね。fail:のところにいくのに正常終了ってなんじゃそりゃって思ったけど、errが0なのにfail:に来ている時点で想定外ですよね。。。

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;
}

(from http://opensource.apple.com/source/Security/Security-55471/libsecurity_ssl/lib/sslKeyExchange.c)

Hacker Newsではやはりというべきかpythonの話が出ていて、pythonのインデントに文句言う人がいるけどこのケースではバグを防げたのにってのがあって、まあ確かにって思った。


ともあれ、iOS 7.0.6に速やかにアップデートしたほうがいいでしょう。