2014年2月25日火曜日

iOSのセキュリティバグが発覚

こんにちは。
株式会社Pro-SPIREソリューション事業部の藤野です。

2月も今週で終わりです。これから暖かくなってきますね。

さて、今回は先日発覚したApple史上最悪のセキュリティバグと呼ばれている
SSL接続のバグについてです。

2014年2月22日にiOS 7.0.6のアップデートが発表されたことにより、
この問題が大きな話題となっております。

何が問題かといいますと、あるコーディングミスによりSSL認証が機能していないまま
ネットワークとの接続が行われていたのです。

Apple、iOS 6と7のアップデート公開 SSL/TLS通信傍受の恐れ
http://www.itmedia.co.jp/enterprise/articles/1402/24/news034.html

iOSのSSL/TLS通信傍受の脆弱性は「悪夢」、OS Xにも存在
http://www.itmedia.co.jp/enterprise/articles/1402/25/news039.html


GoogleのエンジニアであるAdam Langleyさんが実際のソースコードの問題点を記述されていましたので、引用します。

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;
}
引用:
ImperialViolet Adam Langley's Weblog
https://www.imperialviolet.org/


上記のコードで「goto fail;」が2行連続で書かれていることに問題があります。
通常、if文で{}をつけない場合は、条件が合致した時にif文の次のステートメントの処理のみ行います。

ところが今回のケースでは「goto fail;」が2行連続で書かれているので、if文の結果に関わらず
2つ目の「goto fail;」の処理が実行されることになります。
そのため


        if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
            goto fail;


以降の処理が行われることはないまま「fail:」の処理に移動してしまいます。
これにより、SSL認証が正しく行われないまま接続に成功してしまうということです。
非常に単純なミスだそうです。

---

さて、そもそもSSLとは何のことでしょうか。
SSLとは「Secure Sockets Layer」の略で、暗号化により通信を安全に保つ仕組みのことです。

SSLとは 【 Secure Sockets Layer 】 - 意味/解説/説明/定義 : IT用語辞典
http://e-words.jp/w/SSL.html

例えば、私たちがWebサイト等でログインするとき、
ユーザー名とパスワードの情報を入力して、サーバー側へデータを送信しますが、
この情報を暗号化せずに送ってしまうと、悪意を持った人が横から盗み見ることができてしまいます。
そこで、SSLで暗号化することにより、その暗号を解く鍵を持ったサーバーだけがユーザー名やパスワードを見られるようにするのです。

今回のバグでは私たちの情報が危険な状態に晒されたまま
通信が行われていたということになります。

まだアップデートしていない人は早急に行いましょう。
ただし、そのときは安全なネットワークの中で行ってください。


たった1行のコーディングミスでこんなにも大きな影響を及ぼします。
開発のときはテストの作業も十分に注意して行いたいと思います。

0 件のコメント:

コメントを投稿