水無月ばけらのえび日記

bakera.jp > 水無月ばけらのえび日記 > H18年度ウェブアプリケーション開発者向けセキュリティ実装講座

H18年度ウェブアプリケーション開発者向けセキュリティ実装講座

2006年12月16日(土曜日)

H18年度ウェブアプリケーション開発者向けセキュリティ実装講座

13日に「H18年度ウェブアプリケーション開発者向けセキュリティ実装講座 (www.ipa.go.jp)」を見てきたので、私なりに思ったことを少し。

【講演1】 脆弱性の届出情報の深刻度評価について

CVSS のお話。「IPA が受付けた脆弱性をCVSSを用いて分析した結果を紹介します」ということで、具体的にこんな事例がこうなった、という話を期待していたのですが……。残念ながら統計データだけで、具体的な事例は出ませんでした。

もっとも、それは私の期待が大きすぎただけで、話としては普通に面白かったと思います。

【講演2】 安全なWebアプリケーションの作り方(番外編)

極楽せきゅあ日記 (d.hatena.ne.jp)などで有名な園田さんの講演。中心はフレームワークのお話で、あとは書籍の脆弱性のお話など。

書籍の話ですが、個人が批判する分には問題ないと思うものの、何をもって誤りとするのかが難しいですね。「のけぞる本!」なんてコンテンツがありますが、これは HTML の仕様に照らして間違いだと言っているので、間違いだと断じるだけの論拠があります。しかし、脆弱なコードを脆弱と判断するのは容易ではないでしょう。特にコードの断片だけ出されている場合、「このコードは入力時のサニタイズを前提としている」などと言われる可能性があります。

「鉄則の話で笑い取れなかった」……とおっしゃっていますが、私と隣にいた人は笑っていたので、一部には受けていたと思います。単純に「鉄則」を知っていたかどうかが分かれ目になっていて、知らない人が多かったのではないかと思いますが……。

※そういえば今年の鉄則 (internetweek.smartseminar.jp)の資料って公開されているのでしょうか?

【講演3】 安全なウェブアプリケーション開発に向けた活用事例

HIRT のお話。HIRT の紹介とか歴史とか苦労話とか。話題がやや拡散していたためか、あんまり印象に残りませんでした (すみません)。

【講演4】 失敗事例から学ぶウェブアプリケーション開発のヒント

脆弱なアンチパターンの紹介。入力時に置換するのは駄目で出力時に処理しなければならない……という話なのですが、駄目な理由がきちんと説明できていない印象を受けました。

たとえば、入力時に全てのパラメータをエスケープする処理、これが駄目な理由が説明できていません。開発が小規模であり、DB を使わず、入力値を HTML にしか出力しない場合には、入力時に全てエスケープしてしまう方法でもあまり問題なかろうかと思いますが……。実際、フリーで配布されている掲示板のスクリプトでは、ReadParse() 相当の処理の中で < などをエスケープしてしまうということが一般的に行われており、これだけで XSS を回避できています。

※入力時にエスケープする方法の問題としては、User-Agent などの処理が漏れること、大規模開発だと多重エスケープ問題が発生したりすること、HTML 以外のもの (たとえば電子メール) に出力しようとすると別のエスケープが必要になるので漏れる危険性があること、などがあります。

危険文字の削除処理の説明についても詰めが甘いと思いました。出ていた例はこんなのですが、

$foo =~ s/script//g;

これが駄目なのは当然でしょう。そこまでは良いのですが、以下のようにすればどうでしょうか。

1 while $foo =~ s/script//g;

この処理なら、指摘されていた問題は起きません。実際、昔ニフティにあった「パレット」という掲示板では後者のような処理をしていまして、この処理自体には問題ありませんでした。

※……とは言え、その「パレット」にも貫通方法がたくさんあったわけで、危険文字の削除という発想が危険なことにはかわりありません。

あと、expression 話では数値文字参照よりも CSS のエスケープの話が必要なのではないかとか、全体として詰めの甘さが目立ちました。言おうとしている内容が間違っているとは思わないのですが、もうちょっと精度の高いお話にできるのではないかと思います。

【講演5】 安全なウェブアプリケーション発注のあり方

経済産業省方面で検討中の、ウェブアプリケーションセキュリティガイドラインのお話。

話の内容は非常に重要なのですが、「開発者向け実装講座」と題するセミナーの内容としてふさわしいかどうかは、やや疑問です。これは実装よりも上流の工程で考慮しなければならない話で、設計はもちろん、サービス企画にまで影響してくる話です。セキュリティ屋や実装屋だけではなくて、いわゆる Web ディレクターであるとか、そういった層に聞いてもらいたい話だと思いました。

最後に、全体通しての感想。

このセミナーに限らず、最近ではウェブの脆弱性に対する「取り組み」の考え方が変わってきているように思います。昔は「まずはテキトーにつくり、脆弱性があったら直す」という状態だったのですが、それでは駄目だというのが共通認識になってきており、「最初から安全なものをつくる」、あるいは「自然に安全なものができる」という方向を目指すようになってきています。その方法のひとつがフレームワークであり、あるいは設計から縛るようなガイドラインであったりするわけです。

個人的には「サニタイズ言うな」という話もその流れの中にあるものだと理解しています。狭義の「サニタイズ」は「テキトーにつくって事後にセキュリティ対策のための処理を追加する」という発想につながる概念で、そのような考え方を助長したくないから「サニタイズ言うな」なのでしょう。

だいたい、XSS なんてのは「何が起きても常に valid な HTML を出力する」という誇りがありさえすれば、それだけで 9割方回避できるのです。ユーザが入力した < を文字参照に変換する処理は、誇りを守るための処理であって、セキュリティを意識したものではないのです。

※ちなみに残りの1割は javascript: スキームとか UTF-7 とか。

関連する話題: IPA / Web / セキュリティ / サニタイズ言うな / 書籍の脆弱性

最近の日記

関わった本など