My Photo

« 意図しないファイル公開 | Main | アップロード機能に対するDoS攻撃 »

February 09, 2014

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

発生箇所 シェルを呼び出す機能のある関数を実行している箇所
影響を受けるページ すべてのページが脆弱性の影響を受ける
影響の種類 秘密情報の漏洩、データの改ざん・削除、外部への攻撃(踏み台)、システムの停止など
利用者の関与の度合い 不要

概要

Webアプリケーションの開発に用いる言語の多くはシェル経由でOSコマンドを呼び出す機能を提供している。この機能の使い方に問題があると、意図しないOSコマンドが実行可能となる場合がある。これをOSコマンド・インジェクション脆弱性と呼ぶ。
OSコマンド・インジェクション脆弱性は影響が大きく非常に危険な脆弱性である。以下は典型的な攻撃シナリオである。

  1. 攻撃用ツールを外部からダウンロードする。
  2. ダウンロードしたツールに実行権限を与える。
  3. OSの脆弱性を内部から攻撃による権限昇格で管理者権限を得る。(Local Exploit)
  4. Webサーバは攻撃者の自由になる。

攻撃手法

例として下記の問い合わせフォームを用いる。

問い合わせフォーム
<form action="inquiry.php" method="post">
お問い合わせをどうぞ<br>
メールアドレス<input type="text" name="mail><br>
お問い合わせ<textarea name="inqu" cols="20" rows="3">
</textarea><br>
<input type="submit" value="送信">
</form>
受付画面のスクリプト
<?php
$mail = $_POST['mail'];
system("/user/sbin/sendmail -i <template.txt $mail");
//以下略
?>
<body>
お問い合わせを受け付けました。
</body>

template.txt はメールのヘッダ(From、MIMEエンコードされたSubject、Content-Type)と本文である。
正常系ではフォームのメールアドレス欄にメールアドレスを入力すれば、template.txtの内容のメールがそのメールアドレスに送られる。

攻撃では例えばメールアドレス欄に以下を入力する。

bob@example; cat /etc/passwd

送信ボタンを押すと /etc/passwd が表示される。
この例では表示するだけであるが、OSコマンド・インジェクション攻撃によりWebアプリケーションが稼動するユーザ権限で実行できるコマンドはすべて悪用が可能である。具体的にはファイルの削除、変更、外部からのファイルのダウンロード、ダウンロードしたツールの悪用などである。
攻撃の例として、概要で述べたような手順によるサーバの管理者権限奪取があげられる。

脆弱性の原因

シェルはコマンドラインによりOSを利用するためのインタフェースプログラムであり、Windowsでは cmd.exe、Unix系では sh などがある。
シェルには複数のコマンドを起動するための構文があるため、外部からパラメータを操作することにより元のコマンドに加えて別のコマンドを起動させられる場合がある。これがOSコマンド・インジェクションである。
また、開発者がOSコマンドを呼び出す意図がなくても、無意識にシェル起動のできる関数を使っている場合もある。
すなわち、OSコマンド・インジェクション脆弱性が発生するケースは以下の2通りある。

  • シェル経由でOSコマンドを呼び出す際に、シェルのメタ文字がエスケープされていない。
  • シェル機能を呼び出せる関数を使用している。

Unix系のシェルにおいて1行で複数のプログラムを起動する場合は以下の記法が使用できる。

$ echo aaa; echo bbb
aaa
bbb
$

この複数のプログラムを起動できるシェルの機能の悪用がOSコマンド・インジェクション攻撃である。
OSコマンドのパラメータとして指定する文字列にシェルのメタ文字を混入させることで、開発者の意図とは異なるOSコマンドが実行可能となることOSコマンド・インジェクション脆弱性の原因である。

OSコマンド・インジェクション脆弱性が生まれる条件は、以下の3つのすべてを満たすことである。

  • シェルを呼び出す機能のある関数を利用している。
  • シェル呼び出しの機能のある関数にパラメータを渡している。
  • パラメータ内に含まれるシェルのメタ文字をエスケープしていない。

対策

対策は、採用すべき順に以下がある。

  • OSコマンド呼び出しを使わない実装方法を選択する。
  • シェル呼び出し機能のある関数の利用を避ける。
  • 外部から入力された文字列をコマンドラインのパラメータに渡さない。
  • OSコマンドに渡すパラメータを安全な関数によりエスケープする。

どの対策を選択するかは設計段階で決めておくべきである。設計の各フェーズでは以下の検討を推奨する。

基本設計フェーズ
  実装方式設計として以下を検討する。
・主要な機能の実装方針を決定する。
・その際に極力ライブラリを利用するが、やむを得ない場合はOSコマンドを利用する。

以下、具体的な実装方法について説明する。

●OSコマンド呼び出しを使わない実装方法を選択する

OSコマンドを呼び出さない(シェルを呼び出せる機能を利用しない)ことにより、OSコマンド・インジェクション脆弱性が混入する可能性がなくなり、またOSコマンド呼び出しのオーバーヘッドがないことから多くの場合に性能も向上する。
先の問い合わせに対してメールを送信する受付スクリプトをライブラリを使用して書き換えた例を示す。

<?php
$mail = $_POST['mail'];
mb_language('Japanese');
mb_send_mail($mail, "受け付けました",
             "お問い合わせを受け付けました。",
             "From: webmaster@example.jp");
?>
<body>
お問い合わせを受け付けました
</body>

ただし、メール送信機能についてはメールヘッダ・インジェクション脆弱性が混入する可能性がある(メールヘッダ・インジェクション脆弱性)。

●外部から入力された文字列をコマンドラインのパラメータに渡さない

例として、sendmailコマンドには -t というオプションを指定すると、宛先のメールアドレスをコマンドラインで指定する代わりに、メール内容のTo、CC、Bccの各ヘッダから読み取る。この機能を使うと、外部から入力された文字列をコマンドラインに指定せずに済むのでOSコマンド・インジェクション脆弱性の混入する可能性がなくなる。
サンプルコードは以下。

<?php
$mail = $_POST['mail'];
$h = popen('/usr/sbin/sendmail -t -i', 'w');
if ($h === FALSE) {
	die('ただいま混みあっています。しばらくたってから...');
}
fwrite($h, <<< EndOfMail
To: $mail
From: webmaster@example.jp
Subject: =?UTF-8?B?5Y+X44GR5LuY44GR44G+44GX44Gf?=
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 8bit

お問い合わせを受け付けました。
EndOfMail;
);
pclose($h);
?>
<body>
お問い合わせを受け付けました。
</body>

ただし、メール送信機能についてはメールヘッダ・インジェクション脆弱性が混入する可能性がある(メールヘッダ・インジェクション脆弱性)。

●OSコマンドに渡すパラメータを安全な関数によりエスケープする

今までのパターンでOSコマンド・インジェクション脆弱性を解消できない場合にはシェル経由でOSコマンドを呼ぶことになる。
OSコマンドに渡すパラメータをエスケープする必要があるがシェルのエスケープルールは複雑なので、安全なエスケープが行えるライブラリ関数を用いるべきである。PHPの場合は excapeshellarg() が該当する。
system() でsendmailコマンドを呼ぶ場合は以下のようになる。

system('/usr/sbin/sendmail <template.txt' . escapeshellarg($mail));

PHPには同種の関数として escapeshellcmd() があるが、使い方によっては脆弱性の原因となるので推奨しない。
また、シェルエスケープルールの複雑さと環境依存性から escapeshellarg() を使っても脆弱性が混入する可能性はありえる。よって、保険的対策としてパラメータの検証を行うことを推奨する。

●保険的な対策

対策に漏れがあった場合のために、いかの保険的対策を推奨する。

  • パラメータを検証する。
  • アプリケーションの稼動する権限を最小限にする。
  • WebサーバのOSやミドルウェアのパッチ適用

OSコマンド・インジェクション攻撃でもっと被害が大きくなるのは、サーバ内部からOSの脆弱性を突いた攻撃(Local Exploit)を受ける場合である。このためにパッチ適用を推奨する。

参考文献:体系的に学ぶWebアプリケーションの作り方 4.11.1 OSコマンド・インジェクション

体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践
徳丸 浩

ソフトバンククリエイティブ 2011-03-03
売り上げランキング : 4070

Amazonで詳しく見る
by G-Tools

« 意図しないファイル公開 | Main | アップロード機能に対するDoS攻撃 »

PHP」カテゴリの記事

セキュリティ」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/59101016

Listed below are links to weblogs that reference OSコマンド・インジェクション:

« 意図しないファイル公開 | Main | アップロード機能に対するDoS攻撃 »

September 2017
Sun Mon Tue Wed Thu Fri Sat
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof