おれブログ

インターネット業界の片隅にいる40代のオッサンによる雑記系ブログです。

 本サイトはプロモーションが含まれています

iOSセキュリティ不具合のコードについて簡単に説明してみます。

iOSのSSL脆弱性問題で盛り上がってますね。

バグの概要を聞いて、確かにヤバイと思い、所有しているiOS製品4台をすべてアップデートしました。

そして不具合コードが公開されているというので見てみたけど、これは・・・開発現場でありがちwww

というわけで、プログラミングなんて分からんって人向けに簡単に説明してみます。普段はそれっぽいことに全く触れてないんですが、一応エンジニアの端くれだったりします。  (`・ω・´)


APPLE AirMac Extreme ME918J/A



そもそも今回の不具合って何がヤバいの?

えっと、ブラウザでアクセスする場合、通常はHTTP通信を使っています。けど、パスワードとか口座番号とかクレジットカード番号といった重要情報を入力する場合はSSL通信ってのを使っているんです。よくブラウザのURL欄がいつもの http:// じゃなく https:// で始まってる時がありますよね? あれがSSL通信している時なんです。

このSSL通信を使うメリットは分かりやすく言っちゃうと、やり取りが暗号化されるってことと、アクセスするサーバーが信頼できるってことです。暗号化については分かりやすいと思います。パスワードとか暗号化しないでやり取りするなんて嫌ですよね。

では、もう一つのサーバーが信頼できんのかって話はどうでしょうか? 例えばネットバンキングする時、○○銀行のサーバーのように見えて実は犯罪者の立てた偽サーバーかもしれない。そんなサーバーに大事な情報を入力したくないですよね。そのため、SSL通信は第三者機関が発行したSSL証明書をチェックして信頼できるかどうかを判断しています。なので、皆さんは安心してネットバンキングとかネット決済とかできるんです。

でも、iOS7.0.5はSSL証明書が偽物であっても、インチキ証明書であっても、なんちゃって証明書であっても、とにかく何でも信頼しちゃうらしいんです。そのため、上記の安心安全設計が崩壊しています。だからヤバいんです。


Apple社が公開しているコードの不具合説明

プログラミング未経験者にも分かるようにがむばってみます。 (`・ω・´)

こちらがApple社が公開しているコードの抜粋です。全文はこちら

f:id:hi-zakky:20140226001917j:plain

ピンクマーカーを引いた goto fail; という文に注目してください。これ、なんか変ですよね?

他はすべて if で始まる文1つに対して、1個の goto fail; なのに、ピンクマーカーのところだけ goto fail; が2つ並んでます。

実はこの2つ目の goto fail; がやらかしちゃってるんです。

何をどうやらかしちゃってるのか?

if で始まる文は、SSL通信のための条件がきちんと整っているかについて一つ一つチェックしています。1つでも問題あればエラー処理を走らせてSSL通信させない仕組みになってます。

if チェックがもしエラーだったら直後の文が実行され、問題なければ2つ後ろの文が実行されます。

つまり17行目のチェックはエラーの場合18行目が、問題ない場合は19行目(ピンクマーカー)が実行されるので、どっちにしても goto fail; になってしまうワケなんです。

で、この goto fail; が走るとどうなるか? 多分プログラム未経験の方でも予想できると思いますが、25行目の fail: ってところに飛ばされます。

本来は17行目のチェックで問題なしだった場合、20行目のチェックを行って、それでも問題がなければ上では省略した最終チェック処理を行うわけなんですが、そういったチェックをすべてすっ飛ばして正常終了、つまり、SSL証明書は信頼できるよーって判定しちゃってます。

goto fail; となっているので、一見するとエラー処理が走ってSSL通信までいかないんじゃないの? って思ってしまうんですが、そんなことはなくて、ピンクマーカーの19行目の goto fail; を通った場合は正常終了と見なされ、なんちゃってSSL証明書であっても信頼してSSL通信を行ってしまうんです。


こんなことってあるの? 多分あります・・・(´・ω・`)

これ多分コピペミスとかの単純ミスじゃないかと思うんですが、この規模の開発だったら普通はリリースするまでに試験やレビューを何回もやるので、こういうミスは気づくはずなんですよね。

特にSSL証明書のチェック処理なんて、セキュリティの根幹部分なので、偽物証明書は通過できないかの試験なんて開発者レベルの試験でも確認するはずだし、その後の第三者試験でも確認するはず。じゃないとリリースなんて絶対許されないはず。

と、思ってしまうんだけど、実際は大規模な開発になればなるほど、こういう人的ミスが入り込んでしまうんですよね。困ったことに。

昔のメインフレームとかの大型コンピュータ向け開発の時代は、もうガッチガッチに机上コードレビューなんかもして、リリースする時は全てのファイルのタイムスタンプを指さしチェックとかして、リリースすること自体が一大イベントだったこともあります。そしてこういったリリース全般を管理する人は開発者よりも立場が上で、それこそリリースをさせていただく、みたいな感じでした。

けど最近は大規模開発であっても、Gitとか個人でも簡単にバージョン管理できちゃうので、そういったチェック機能が個人に委ねられ、リリース管理者の権限が減ってきています。開発者ってのはどうしても自分のコードに甘くなりがちなので、この辺りの歪みは深刻な気がしています。

とはいえ、昨今の短納期開発に対応するには、リリース管理者に一極集中するようなのんびりとした体制を組む余裕はないってのが正直なところ。開発現場にいる人たちはこういうジレンマを感じながらも立ち止まる余裕もなく、日々開発に明け暮れているんですね。

まぁ、Appleの開発現場を知ってるワケじゃないのででかいことは言えませんが、今回の事は起こるべくして起こった、そんな気がして仕方ありません。明日は我が身、本当に気をつけねば・・・



アップル、グーグルが自動車産業を乗っとる日
桃田 健史
洋泉社
売り上げランキング: 1,008

アップルvs.グーグル: どちらが世界を支配するのか
フレッド ボーゲルスタイン
新潮社
売り上げランキング: 2,135

図解 アップル早わかり (1時間でわかる図解シリーズ)
大谷 和利
中経出版
売り上げランキング: 226,006