ウェブアプリケーションセキュリティとバッドノウハウ、そしてグッドラッパーの関係
by 金床

----------------------------------
はじめに
----------------------------------

 筆者はウェブアプリケーション開発者であると同時にセキュリティ技術にも興味がある。自身がSeaSurfers MLというウェブアプリケーションセキュリティをテーマとしたメーリングリストを主催しており、またセキュリティコミュニティに多くの知人、友人がいる。しかし彼らとウェブアプリケーションなどのセキュリティ対策について意見を交換すると、違和感をおぼえることが多い。

 彼らは脆弱性の原理についてとても詳しいのだが、以下のような会話が頻繁に発生するのである。

「…つまり原理的に考えて、このようにすればXSSは発生しないんだよ」
「なるほど納得。…でもその対策を行っても、IEだと例のバグで、XSSが発生してしまうのではないか」
「それはIEが(あるいはマイクロソフトが)悪いのであって、私の対策は正しいんだよ」
「…」

 ウェブアプリケーション開発の現場ではユーザの大部分がIEを使っているため、セキュリティ上の問題も含めてIEに対応することは必須となる。そのため筆者はここで示したような考え方に疑問を持っていた。「現場で役に立たないセキュリティ対策を提示して意味があるのか」と。

 しかし一方で、彼らが持っている豊富な知識と本質的な理解に助けられることも非常に多い。ある時は彼らの意見にうんざりし、ある時には感心させられる、というこの状態は、筆者個人にとって一種の謎であった。さらにコミュニティレベルでの様子を観察してみると、どうも開発者のコミュニティとセキュリティのコミュニティとの間では交流が少ないように思える。

 また、自分自身が今までに言ったり書いたりしてきた内容を思い出してみると、どうも矛盾することが多い。あるときは「〜で対策になるなら、それでいいのでは」と考えつつ、「HTTPレベルで理解しないと、本質は見えてこない」と思っているときもあるのだ。

 このことについて少し考えてみたところ、ある像が浮かび上がってきた。

----------------------------------
バッドノウハウとグッドラッパー
----------------------------------

 「バッドノウハウ」と「グッドラッパー」という言葉がある。これらの言葉の存在は筆者がこの問題を考える上で大きな助けをしてくれた。それぞれの言葉の詳細な意味については以下のURLを参照のこと

・バッドノウハウ
http://0xcc.net/misc/bad-knowhow.html

・グッドラッパー
http://www.hyuki.com/techinfo/knowhow.html

 以下は引用である。まずバッドノウハウについて以下のように書かれている。

 「何でこんなことを覚えないといけないのだ ろうか、とストレスを感じつつも、それを覚えないとソフトウェア を使いこなすことができないためにしぶしぶ覚えなければならない、 といった類いのノウハウ」

 そしてグッドラッパーについては次のように書かれている。

 「人間の負担を軽くするようなラッパーを作ることを考えましょう。バッドノウハウを注意深く理解し、検討するのはラッパーを書く人が行う。そのラッパーを使う人はバッドノウハウを苦労して理解する必要がない。そのように発想を変えるのです。」

 ウェブアプリケーションの開発とそれに伴うセキュリティ対策についても、これらの考えを適用することができる。

 ウェブアプリケーション開発では、完成したアプリケーションは安全なものである必要がある。セキュリティ対策が行われている必要があるが、しかしセキュリティ対策そのものは目的ではない。つまりウェブアプリケーション開発におけるセキュリティ対策(XSSやSQLインジェクションなどの非常に複雑でやっかいな対策)は、開発者にとっては「しぶしぶ覚えなければならない」ノウハウなのである。つまり、「目的ではないが、それを覚えないと目的を達成することができない」存在であり、これはまさしくバッドノウハウなのだ。

 そして、セキュリティ対策というバッドノウハウに対し、負担を軽くするラッパー(グッドラッパー)は既にいくつも存在している。以下にいくつか例を示す(本当に「グッド」なのかどうかはここでは評価しない)。

・SQLインジェクションに対してバインドメカニズムを使用する(発想)
・バッファオーバーフローに対してJavaや.NETを使用する(発想)
・XSS対策として全部の文字をエスケープしてしまう
・CSRF対策として「hidden+POST方式」のセッション管理を使う(発想)
・ネットワーク上の盗聴やなりすましに対してSSLを使う
・MicrosftのAntiXSSライブラリ
・筆者が作成しているCSRF防止用プラグイン(http://guardian.jumperz.net/manual/en/body118.html
・OWASPのCSRF防止用ソフトウェア(https://www.owasp.org/index.php/CSRF_Guard
・RoRにCSRF防止機能を追加するプラグイン(http://wiki.rubyonrails.org/rails/pages/Security%20Extensions%20Plugin

 グッドラッパーはソフトウェア的なものであったり、ただの発想であったりする。

 負担をどれだけゼロに近づけることができるかが、グッドラッパーの出来であると言える。

----------------------------------
3つの役割
----------------------------------

 さらに考察を進めるために、ウェブアプリケーション開発とセキュリティにおいて存在する3つの役割を示す。

・ウェブアプリケーション開発者
・グッドラッパー提供者
・セキュリティマニア

 これら3つの役割はそれぞれ異なる目的を持ち、また異なる活動を行う。

----------------------------------
■ウェブアプリケーション開発者
----------------------------------

 ウェブアプリケーション開発者は、もちろんウェブアプリケーションの開発を行う。その性質は次のようなものだ。

・「開発したアプリケーションが安全であること」が達成されているならば、その手段は問わない。セキュリティ対策は目的ではないため、そこにはできるだけリソースを割かないようにしたい。

・完成したアプリケーションを使用するユーザはほとんどがウェブブラウザとしてIEを使っているため、ウェブアプリケーションの動作やセキュリティ対策はIEを中心に考える。「IEでは動作しないウェブアプリケーション」「IEではセキュリティ上の問題が発生してしまうウェブアプリケーション」では目的が達成されたことにならない。

・自身が開発するアプリケーションが安全であれば、あるいは自身が使う開発環境でのセキュリティ対策が理解できていれば、それで満足であり、自分と関係のないところで開発されているウェブアプリケーションのセキュリティには興味がない。つまり自身に適したグッドラッパーが手に入れば、それでよいと考える。

----------------------------------
■グッドラッパー提供者
----------------------------------

 グッドラッパー提供者は、以下のような性質を持つ役割だ。

・ウェブアプリケーションのセキュリティ対策が開発者にとってはバッドノウハウであることを理解しており、ウェブアプリケーション開発者が楽をできるような仕組み(グッドラッパー)が必要であると考えている。グッドラッパーを作成し、提供することを目的とする。

・IE特有のバグのようないわゆる「非本質的なセキュリティ上の問題」についても知識があり、ウェブアプリケーション開発者にとってはこれらについても対策が必要であることを理解している。これらについても可能な限りグッドラッパーで対応することを考える。

・ウェブアプリケーション開発で登場する数多くの規格や決まり事、仕様など(例としてHTML、JavaScript、SQL、HTTP、SSLや文字コードなど)に関する知識は、セキュリティマニアに比べると不足していることが多い。そのため、グッドラッパーの制作にはセキュリティマニアの助けを必要とする。

・すべての開発者が使うことができるような汎用的なグッドラッパーを提供することは難しいことが多く、環境依存のグッドラッパー(Javaでしか使えない、あるいはLinuxでしか使えない、ようなもの)の提供にとどまってしまうこともある。

----------------------------------
■セキュリティマニア
----------------------------------

 セキュリティマニアは、以下のような性質をもつ役割である。

・本質的なセキュリティ上の問題(XSSやSQLインジェクションなど)がなぜ起こるのかを原理的に理解し、それに対する根本的な対策を提示することを目的とする。

・持っている知識の量が多く、またそれらは汎用性も高い。そのため環境に依存しない対策を提示することができることが多い。

・IEのバグのような非本質的なセキュリティ上の問題を毛嫌いし、それがどのようなもので、どの程度の影響があるのか、またウェブアプリケーション側で対策可能なものなのか、などの点について検討さえしない傾向がある。

・問題を解決するための研究そのものが目的になってしまう場合がある。

・ウェブアプリケーション開発者にとってはセキュリティ対策はバッドノウハウであることを理解せず、誰に対してでも自らと同じように根本的に理解することを求めてしまう

・グッドラッパーの存在を「本質の隠蔽であり、有害だ」と考えてしまう。

----------------------------------
役割と個人の関係
----------------------------------

 前項で3つの役割を示したが、筆者をはじめ、それぞれの個人が必ずしもこのうちどれか1つに当てはまるということではない。多くの人がウェブアプリケーション開発者の側面、グッドラッパー提供者の側面、セキュリティマニアの側面をそれぞれ異なる比重で併せ持つことが多い。

 例えば筆者はこれら3つのすべての面を持っており、割合で表現すると「開発者としての自分が5割」「グッドラッパー提供者としての自分が4割」「セキュリティマニアとしての自分が1割」といったところだろうか。この割合がどのようになるのかによって、その人の個性が出てくる。

 これは、その時々で異なる役割を果たしていると考えることもできる。

 ある時点ではウェブアプリケーション開発者として「セキュリティ対策は面倒すぎる。何か楽な解決策(グッドラッパー)はないだろうか」と考えているとしよう。
 色々と探し回ってみたもののよいものが見つからず、「仕方ない。細かいことを考えずに済むように、セキュリティ対策をまとめて隠蔽できる仕組みを作ろう」と考えたとする。この時点でグッドラッパー提供者の役割に変化しているのだ。
 そしてさらに「この作成してみたグッドラッパーはきちんと機能するだろうか。心配なので、さらに原理を調べてみよう」と考えたのならば、その時点ではセキュリティマニアという役割に変化していると考えることができる。

 筆者はウェブアプリケーション開発を行い、またグッドラッパーを作成することも多い。しかし自分では研究を行わず、セキュリティマニアの助けを借りることが多い。まれに自分できちんと原理的な部分(例えばHTTPなど)まで考えることがある。このような感覚で、「5割、4割、1割」と表現した。

----------------------------------
議論がかみ合わないケース
----------------------------------

 3つの役割はお互いに目的などが異なっているため、議論がまったくかみ合わないことがある。ここではかみ合わない代表的な例を2つ示す。

 セキュリティマニアが(XSSやSQLインジェクションなどの)複雑なセキュリティ上の問題について原理に従った解決策を提示しても、それはウェブアプリケーション開発者にとってはややこしすぎる(バッドノウハウである)。そのため「複雑すぎて理解できない」「そんなことまでやってられない」と受け入れられない。また、IEのバグのような非本質的なセキュリティ問題についてまったく対策を示さないため、「現場では役に立たない」とされてしまう。このように、セキュリティマニアが示す対策はウェブアプリケーション開発者には受け付けられない。

 また、グッドラッパー提供者が示す解決策(つまりグッドラッパーそのもの)は、研究者からは「原理的でない」「隠蔽しているだけで、本質的な理解を妨げる」「安易な解決策を提示するのはむしろ有害だ」などと批判される。このように、グッドラッパー提供者が示す対策はセキュリティマニアには受け付けられない。

 先述したように個人が複数の役割を果たす場合もあり、この結果として矛盾したように見える言動を行ってしまうことがある。ある時点では「楽に対策ができれば、それでいいのでは」とし、別の時点では「根本的に原理を理解できなければ、対策はできない」などとしてしまうのが良い例だ。前者はウェブアプリケーション開発者やグッドラッパー提供者、そして後者はセキュリティマニアの立場からの意見である。筆者自身、このパターンの自己矛盾が今までに何度もあったし、他の人がそのような一見矛盾した説明をしているのを見たこともある。

 
----------------------------------
議論がかみ合うケース
----------------------------------

 議論がしっかりかみ合うケースももちろん存在する。代表的な例は次のようなものだ。

 セキュリティマニアが示す対策は原理を明らかにしており、また汎用性が高いため、グッドラッパーを作成するために大いに助けになる。そのためグッドラッパー提供者にとっては有益な情報であり、この意味ではグッドラッパー提供者に受け入れられる。

 また、グッドラッパー提供者が示す対策(グッドラッパーそのもの)はウェブアプリケーション開発者の負担を軽減するため、ウェブアプリケーション開発者に受け入れられる。ここでの議論はしっかりとかみ合う。

 また、3つの役割すべてについて、同じ役割同士の議論はかみ合うことが多い。その際行われる議論は情報交換の意味合いが強くなる。セキュリティマニア同士の議論はお互いの研究をより深める。グッドラッパー提供者同士の議論はより出来の良いグッドラッパーに繋がる。そしてウェブアプリケーション開発者同士は、それぞれが試したグッドラッパーは使いやすかったか、などの情報交換を行う。

 
----------------------------------
まとめ
----------------------------------

 このように、意見がかみ合うケースとかみ合わないケースは比較的はっきりとしているので、誰かの意見を聞いたり読んだりする際には、その状況での相手と自分の役割を意識してみるとスムーズに話が(あるいは理解が)進むだろうと考えられる。また、自身とは異なる役割の意見を理解することで、結果として全員が利益を享受できることが期待される。

 現在の状況として、3つの役割のうち、グッドラッパー提供者がとても不足しているように感じる。それぞれのセキュリティ上の問題に対して良いグッドラッパーが揃ってくれば、(現在ひどいとされている)ウェブアプリケーションセキュリティの状況が改善されるのではないかと考えられる。




2007/5/27 Version1.2
2007/5/20 Version1.1
2007/5/16 Version1.0