2014/02/24(月)ソースコードのコピペは危険
ソースコードのコピペミスでで深刻な脆弱性が生み出されてしまったそうです。
Apple史上最悪のセキュリティバグか、iOSとOS XのSSL接続に危険すぎる脆弱性が発覚──原因はタイプミス? | アプリオ
こんなことが起こらないようにPythonを使おう! だと1行で終わってしまうので、もう少し真面目に書いてみますw
最初にこの記事を読んだとき、無条件でfailラベルにジャンプするということは、脆弱性というよりは、成功するべきケースでも必ず失敗するんじゃないのかと思ってしまったのですが、ソースを見てみると、failという名前とは裏腹に成功時にもここを通るようですね。いいのか、こんなラベル名で。
さて、すでに昨日のニュースですから、Twitter上でも様々な意見を見かけました。しかし、ちょっとずれている意見が多いんじゃないかなーという印象を受けました。
まず、gotoを使うのがおかしい、という指摘は的外れと言わざるを得ません。忌み嫌われるgotoではありますが、今回の使い方はC言語では許されることの多いケースの一つです(ほかに許されやすいケースは多重ループから一気に抜ける場合)。そりゃ例外機構があれば使いますけど、ないものは仕方がないじゃないですか。
ちなみに私の今のプロジェクトではgotoが禁止されているため、関数の途中で抜ける場合はそのたびに後処理を書かなければいけません。
if (処理A() != 正常コード) { 後処理; return; } if (処理B() != 正常コード) { 後処理; return; }
ものによっては後処理が全体の半分を占めるという笑えない関数も存在します。もうやだ……。
閑話休題。
また、中括弧をつけないことを許容するコーディングルールが悪い、という意見もありました。確かに、if文、for文などで、たとえその内部の処理が1つの文であっても中括弧をつける、というルールを採用しているプロジェクトも多いと思います。そして、そのルールを採用していれば、今回の事故は防げたはずです。
今回の事象だけ考えれば、そのようなルールを持ち込むことで解決できるでしょう。しかし、根本的な部分である、きちんとテストをしていないという問題点は解決しません。
今回のケースは、網羅性で言えばC0すら満たしていないわけですし、一番メインの処理である(ように見える)sslRawVerify()を通していません。私たちはまともにテストをしていませんよ、と公言してしまったことにも等しいわけです。また、テスト以前にこれは静的解析ツールで発見できるレベルのミスですし、そもそもコンパイラが警告を吐いているレベルの間違いです。
これ、ほかのところは大丈夫なんですかね。かなり重要なはずのSSL関連の部分をちゃんとテストしていないのですから、それ以外のところはもっと酷いかもしれませんよ。