サニタイズ言うなキャンペーン このエントリをはてなブックマークに>追加

書きかけだけどとりあえず公開。

要約版:「サニタイズいうなキャンペーン」とは from 高木浩光@自宅の日記

クエリ文字列を変換すれば「サニタイズ済み」つまり安全、と思ってる人、多いんですかね。便利な言葉はしばしば人を思考停止に陥れる。

脆弱性を突く文字列の汚染源としては、

  • クエリ文字列
  • DB問合せの結果や、ログファイルなどからの取得文字列
  • HTTPヘッダ(RefererやCookieを含む)
  • セッションに格納されたデータ
  • URLの一部

などなど色んなものがある。汚染を利用した攻撃の対象となる処理系も

  • SQL処理系(e.g. SQLインジェクション)
  • Webクライアント(Webブラウザ)(e.g. XSS)
  • shell
  • 処理言語自身(evalなど)

と様々なケースが考えられる。3番目や4番目は普通やらないだろうと思うところだが、巷のスクリプトの脆弱性を見てると案外多い。こういうものに頼る傾向はあまり宜しくないと思う。

汚染源は前述の通りクエリ文字列だけではない。また、汚染源はエンコードが施されてあったり、プログラム側で処理されたりするので汚染源を直接変換したからといって安全にはならない。高木氏も触れているが、変換や削除が新たな汚染を生むこともある。また、攻撃対象の処理系によって「何が危険なのか」が異なってくる(危険なのはメタ文字だけではない)ので個別に対応する必要がある。「クエリ文字列をエスケープしただけ」で安全になるわけがないし、「サニタイズ」という一定かつ確実な方法があるわけでもない。

汚染源が何であろうと、安全でない文字列は攻撃対象となり得る処理系に渡される「直前」に「的確な」検証を行わないと確実な対策とはならない。

これも高木氏も触れられているが、汚染された文字列が、処理系に使われる直前に検証される様子が簡単に見渡せるコードを書くように努めることは脆弱性を埋め込む可能性を下げる。値が何に対して安全であるかを示す変数名を使うのも手だ。HTML出力用に変換した文字列をそのままSQL問合せに突っ込んでセキュリティ・ホールを作っている例を見たことがあるが、こういった事態は起こりにくくなるだろう。

$form = new myForm;
$sql_safe = $form->getSqlSafe();
$sql = "select name from user where uid = '{$sql_safe['uid']}'";

この場合、$sql_safeの安全性はmyFormクラスの設計に依存するのでコードを見渡しやすくなる。もちろん次のようなコードは論外だ。

funciton make_sql($sql_safe){
    return "select name from user where uid = '{$sql_safe['uid']}'";
}

誰がどのようにmake_sql()を呼ぶか全く分からないので、$sql_safeが安全だという保証はどこにもない。眉間にマジックで「ハンサム」と書いてハンサムになった気でいるのと同じくらい間抜けだ。また、

  • 処理系に渡される文字列(SQL問合せ文など)に、得体の知れない変数がボコボコ埋められている
  • あるいは文字列置換関数などでぐちゃぐちゃにいじっている
  • shell渡しやeval系の処理(perl-regexの’e'オプションを含む)に依存する

なんて状況は絶対に避けたいところだが、残念なことにこういったコードは結構多い。

6 件のコメント - “サニタイズ言うなキャンペーン”

  1. Anonymous のコメント

    要するに英語ならデムパコメントし放題なのね、ここのコメント。
    これまで生真面目に日本語でコメント書いて、損したw

  2. 金床 のコメント

    >危険なのはメタ文字だけではない

    についてもっと詳しく知りたいです。どんな例がありますでしょうか。

  3. かなだ のコメント

    思いっきりコメントが遅れました。すみません。MLの方でも議論があるようですが(まだちゃんと
    読んでないので重複があるかも知れません)、今思いつく範囲で、ちゃんとチェックしないとセキュリティ上の問題が発生するものを書いて見ます。
    一言でいうと「予期しないデータ」です。

    *異常な数値

    渡された数値を、素直にwhile(a–)みたいな処理に渡してしまうと、異常に大きな数値を渡された場合にシステムに異常な負荷が掛かり得ます。マイナス値を渡されたら(ほぼ)無限ループに。

    *異常に大きなデータ

    同じくちゃんとサイズをチェックしないと色んな問題が起こりえます。バッファ・オーバーフローを起こして任意の実行ファイルを実行させるとか。

    *予期しないフォーマット

    画像をアップロードさせるような場合とか。

    *その時はメタ文字じゃない

    これ結構あると思います。単純な例だと、DBに値を突っ込んで後で表示に使うような場合、HTMLのメタ文字が含まれていないかどうかのチェックもしないとXSSが起きるとか。

    *知らないセッションID

    Session Fixation。

    要は「メタ文字をエスケープすればよい」のではなく「予期している値・データ以外は全てエラーとする(あるいは予期している値・データに修正する)」べきだということです。

  4. SideSiteNote のコメント

    PHPセキュリティー対策

    PHPセキュリティー対策のメモ※注:php超初心者のメモです

    文字や文字列長を制限する

    使う予定の無い文字の存在は?配列の数が多くないか?
    数字を扱う場合は、その数字…

  5. Yahoouj のコメント

    Really good work about this website was done. Keep trying more - thanks!

  6. attic treasures for home and garden のコメント

    New [i]downloadable games download free solitare[/i] youlikelyabsolutely has revealed that there are over 24 million shorts who are dri.

コメントをどうぞ。

使用できる XHTML タグ : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>