水無月ばけらのえび日記

bakera.jp > 水無月ばけらのえび日記 > サニタイズ言うな?

サニタイズ言うな?

2005年7月13日(水曜日)

サニタイズ言うな?

セキュアなWebアプリ実現のために本来やるべきことは? - 高木浩光氏 (pcweb.mycom.co.jp)」。

「パラメータ改ざん」というキーワードがよろしくないというお話は激しく同意。ありとあらゆるパラメータは当然改竄できるのですし、たいていは改竄されてもたいした問題は起きないので、改竄されること自体は全く問題ではないはずです。ただ、たまに改竄されると問題が起きてしまうケースがあって、「パラメータ改竄による偽価格データの送信」「パラメータ改竄によるディレクトリトラバーサル」「パラメータ改竄によるクロスサイトスクリプティング」といった事が起きますが、それらはそれぞれ価格の改竄、ディレクトリトラバーサルクロスサイトスクリプティングの問題であって、パラメータ改竄としてひとくくりにすべきではないでしょう。脆弱性の一類型として「パラメータ改ざん」というキーワードを使うのは不適切だとずっと思っていました。

それはさておき、今ひとつ分からなかったのがサニタイズの話です。

高木氏は「既存のサイトに対して、そのセキュリティ対策として『サニタイズ』を行うというのは、セキュリティ屋の発想としては極めて自然である」と述べつつも、「そもそも(SQL Injection、Command Injectionなどの)インジェクション系の脆弱性が起こるということは、セキュリティ以前にきちんと(本来処理されるべき)記号のエスケープ化などを行っていないということだし、すなわち本来入力されうる文字列を処理できなくなるということでもある」「Buffer Overflowにしても、センスのあるプログラマは常にバッファ境界等に対して意識しており、あまりそのような問題は起こさない」と、適切にプログラムを記述すればサニタイズの必要性は本来ないはずだ、と主張する。

以上、セキュアなWebアプリ実現のために本来やるべきことは? - 高木浩光氏 より

SQL文の発行の際には普通にエスケープ処理をしておけばそれだけで十分であり、特別に「悪意ある入力を無害化する」ということを意識しなくても良いはずだ、というお話でしょうか。確かに、セキュリティ云々を抜きにして考えても、ユーザが検索文字列に単引用符(')を含めたら SQL のエラーが出る、というのはバグでしょうし、そういうバグが起きないように書いていれば、自然と SQL インジェクションなどできない状態になっているはずです。

実は「サニタイズ」と一口に言っても、そこには全く違う 3つの方法論があるのですね。

これを、たとえば単引用符(')を検索したケースに適用してみますと、それぞれ以下のような結果になるでしょう。

どれが望ましいかは明らかです。二番目の結果はユーザの意図と異なるものが検索されてしまう不具合、三番目の結果も不具合に近いでしょう。

しかし、どれも「サニタイズしている」ことには間違いありません。「サニタイズしてください」と求めた場合、一番目ではなく二番目、三番目の処理をされたとしても文句は言えません。ですので、「サニタイズ」という万能の言い方をするよりも、具体的にどうするのかを明確にして議論した方が良いと言えるでしょう。

……というようなお話なのかな、と理解しましたが、そんな感じで良いのでしょうか。

しかし SQL や HTML の出力はそうだとしても、パス名パラメータについてはエスケープ処理で無害化することができませんし、何が有害で何が無害なのかは状況によって異なりますので、純粋に「悪意ある入力を無害化」ということを意識してサニタイズ処理を入れておく必要があるはずです。もっとも、パス名パラメータを外部入力させるような設計自体を「サニタイズ」したほうが良いような気もしますが……。

関連する話題: セキュリティ / サニタイズ言うな

最近の日記

関わった本など