2005年7月19日(火曜日)
リモートデスクトップで DoS
「WindowsのリモートデスクトップにDoSの脆弱性 (internet.watch.impress.co.jp)」。
クライアントマシンならまだしも、サーバが殺されるときついですね。Windows Server 2003 も対象なので、まったくもって他人事ではないのですが。
- 「リモートデスクトップで DoS」にコメントを書く
サニタイズの話つづき
「サニタイズ言うな?」のお話にコメントをいただきました (ありがとうございます)。私の理解したところを以下にまとめておきます。
「セキュアなWebアプリ実現のために本来やるべきことは? - 高木浩光氏 (pcweb.mycom.co.jp)」の記事のサニタイズの話の部分ですが、ざっと見るといろいろな論点が挙げられているように見えるものの、ポイントとなるところは意外と少ないのではないかと感じました。たとえば以下のような論点があるように見えますが、
『サニタイズ』はろくな対策をしていないことを一言で表現できる便利な言葉であり
(~中略~)
「そもそも(SQL Injection、Command Injectionなどの)インジェクション系の脆弱性が起こるということは、セキュリティ以前にきちんと(本来処理されるべき)記号のエスケープ化などを行っていないということだし、すなわち本来入力されうる文字列を処理できなくなるということでもある」「Buffer Overflowにしても、センスのあるプログラマは常にバッファ境界等に対して意識しており、あまりそのような問題は起こさない」と、適切にプログラムを記述すればサニタイズの必要性は本来ないはずだ、と主張する。
これは「サニタイズと言う必要がない」という話にはなりますが、「サニタイズと言わない方が良い」という話にはつながりません。良く読むと、該当部分で「サニタイズと言わない方が良い」理由になっている部分は、実は一カ所しかありません。以下の部分です。
「開発者にとっては綺麗にプログラムを書くことが大命題であり、セキュリティ屋が(セキュリティ関連の)問題を指摘してくると『プログラムが汚くなる』としてそれを嫌う人が多い」
ここでは「セキュリティ屋がセキュリティ関連の問題を指摘」した際に、開発者が「『プログラムが汚くなる』としてそれを嫌う」という点が問題とされています。しかし、私にはこれがぴんと来ませんでした。私には「プログラムが汚くなる」という反応を受けた経験が無かったからです。そもそも、サニタイズをしてもプログラムが汚くなるとは限らないのに、何故「プログラムが汚くなる」という反応になるのかが分かりませんでした。
しかし、これはいただいたコメントではっきりしました。
高木さんが思っているサニタイズのイメージは「本来は必要ないがセキュリティ上の問題を解決するためだけに仕方なく入れる処理」というものだと思います。というか私がそういうイメージを持っています。
この「高木さん」を「開発者の方」に置換すると、すべてをすっきりと理解することができます。
「セキュリティ屋が(セキュリティ関連の)問題を指摘」する局面で「サニタイズしてください」と言っている場合、それは「所定の機能要件を満たすための処理が、たまたまセキュリティ上の問題をも解決する」というケースも含んでいます。たとえば、SQL 文を適切にエスケープするだけで解決する場合は、それだけで十分なのです。「仕方なく」別の処理を入れる必要はありませんし、「プログラムが汚くなる」ような事もありません。しかしながら、言われた開発者がサニタイズという言葉から「仕方なく入れる処理」を連想したとすると、「プログラムが汚くなる」という反応になっても不思議はありません。
ここで起きているのは、「サニタイズ」という言葉の意味のすれ違いです。
そもそもサニタイズの発想というのは、外部入力はすべて汚染されている ("taint" である) という考え方に基づきます。「PerlのTaintモード(汚染検出モード) (www.ipa.go.jp)」などはまさにその考え方で、このモードでは、外部から入力されたすべてのデータに対して、使用する前に何らかの処理をしなければならないことになります。この「何らかの処理」こそがサニタイズです。これは「外部入力値がそのまま使われないように外部入力値をチェックする処理」として適切なものであれば何でも良く、プログラマがセキュリティを全く意識せず、単に機能要件を満たすために追加した処理であっても、その処理によって外部入力値が適切にチェックされていれば、それでサニタイズできていることになります。
しかし、単純に「サニタイズ」というキーワードだけを見ると、その言葉は無害化、消毒という意味ですから、そこから「無害化のためだけの処理」という意味を連想したとしても不思議ではありません。そして実際にそういう理解をされている方がいて、「サニタイズ」という言葉で適切に問題が伝わらないケースがあり、まさにそれが問題にされているのだと言えます。
簡単にまとめると、「サニタイズ」という言葉には広義の意味と、言葉のイメージから派生した狭義の意味とがあり、それぞれ
- 外部入力値がそのまま使われないように、外部入力値をチェックする処理。プログラマの実際の意図は問わず、そのように機能する処理すべてを含む
- 問題のある外部入力値がそのまま使われないように外部入力値をチェックするセキュリティ上の処理。プログラマがセキュリティ上の処理を意図したものだけを指し、本来の動作をさせるために入れた処理を含まない
という意味に解釈されます。高木さんが挙げたケースでは、セキュリティ屋は前者の意味で使っているのに、開発者は後者の意味に理解したために「プログラムが汚くなる」という反発を受けたのだと考えられます。そして、このようなすれ違いを避けるために、少なくとも「サニタイズと言う必要がない」場面では「サニタイズ」という言葉の使用に注意を払った方が良い、という結論が導き出されます。
- 前(古い): 2005年7月18日(Monday)のえび日記
- 次(新しい): 2005年7月20日(Wednesday)のえび日記