OSコマンドインジェクション

|
Webアプリケーションからの入力により、サーバ上のOSコマンドを実行できてしまう脆弱性です。
概要
    「Webページからメールの本文を入力し、その内容をメールで送信するプログラム」や「Webページからサーバにあるファイルを開く」場合などに起こる可能性があります。

以下のような例1、例2のような場合を例として説明します。

例1)
     Webページからメールの宛先を入力し、メールマガジンの登録を行い、登録完了メールを送るページがあった場合を考えます。
     「登録する」ボタンを押すと、入力したメールアドレスに登録完了メールが送信されます。

command02.jpg
 ここでは、以下のようなPerlのプログラムが動作するとします。

        1. open(MAIL,"| /usr/sbin/sendmail $to");

    • |/usr/sbin/sendmail
       「usr」ディレクトリにある「sbin」ディレクトリの中にある「sendmail」コマンドを実行します。
       「sendmail」は「$to」で指定された宛先に、メールを送信する「OSのコマンド」です。
    • $to
       ここでは入力された「test@example.com」が入ります。
    つまり「| /usr/sbin/sendmail test@example.com」というコマンドが実行されます。
    「test@example.com」に指定された内容のメールを送信します。

 ところが、このように入力された値をそのまま「sendmail」コマンドに引き渡してしまうと、例2のような入力があったときに大変なことになります。


例2)command03.jpg    先ほどと同じPerlのプログラムが動作するとします。

        2. open(MAIL,"| /usr/sbin/sendmail $to");

    • |/usr/sbin/sendmail
       「usr」ディレクトリにある「sbin」ディレクトリの中にある「sendmail」コマンドを実行します。
       「sendmail」は「$to」で指定された宛先に、メールを送信する「OSのコマンド」です。
    • $to
      ここでは入力された「test@example.com;rm -rf /」が入ります。
      「test@example.com」は先ほどと同じです。
      続いて入力されている「;」ですが、これはOSコマンド区切るコマンドになります。つまり「;」までの入力で1.と
      同じプログラムが動作
      します。
    • rm -rf /
      次に入力されている「rm」はディレクトリやファイルを削除するコマンドになります。
      「rm」コマンドは「rm -x y」のようにオプションを指定し、「-x」という条件で「y」にあるディレクトリやファイルを削除するというコマンドです。
      ここで入力されている「-rf」は「警告メッセージを表示せずに、ディレクトリ内を再帰的に削除する」という条件で、
      「/」はサーバにある全てのファイルを指定することになります。
    つまり、「|/usr/sbin/sendmail test@example.com;」コマンドでメールを送信してから、「rm -rf /」コマンドを実行して、
    サーバにある全てのファイルを削除
されてしまいます。


 この脆弱性を悪用すると、ディレクトリやファイルを削除されるだけでなく、パスワードの盗聴なども行うことができてしまいます。
 例に挙げたのはPerlのプログラムでしたが、JAVAPHPにもOSコマンドを実行する関数はありますが、それを用いる際には十分注意が必要です。


対策:
    対策としては次のものが挙げられます。
  • OSコマンドにユーザからの入力を極力含めないこと。
    • ユーザからの入力に対して、OSコマンドで実行しても大丈夫な形にエスケープ処理を行う。
    • Webサーバのユーザ権限を限定し、実行できるコマンドを制限する。


参考文献:
「ウェブアプリケーションセキュリティ」金床 著 / 発行所:株式会社データハウス」2007年8月20日発行
「知っていますか?脆弱性/5. OS コマンド・インジェクション」(情報処理推進機構:セキュリティセンター)
Webアプリケーションに潜むセキュリティホール 「第13回 OSコマンドインジェクションを防ぐルールを作成する」(中村隆之 著)

関連する用語:
SQLインジェクション
サニタイジング

このブログ記事について

このページは、fukuiが2008年6月16日 17:20に書いたブログ記事です。

ひとつ前のブログ記事は「ARPスプーフィング(ARP Spoofing)」です。

次のブログ記事は「キーロガー(Key Logger)」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。