HOME情報セキュリティ情報セキュリティ対策脆弱性対策安全なウェブサイトの作り方 - 1.2 OSコマンド・インジェクション

本文を印刷する

情報セキュリティ

安全なウェブサイトの作り方 - 1.2 OSコマンド・インジェクション

概要

ウェブアプリケーションによっては、外部からの攻撃により、ウェブサーバのOSコマンドを不正に実行されてしまう問題を持つものがあります。このような問題を「OSコマンド・インジェクションの脆弱性」と呼び、問題を悪用した攻撃手法を、「OSコマンド・インジェクション攻撃」と呼びます。


発生しうる脅威

OS コマンド・インジェクション攻撃により、発生しうる脅威は次のとおりです。

- サーバ内ファイルの閲覧、改ざん、削除
   重要情報の漏えい、設定ファイルの改ざん 等

- 不正なシステム操作
   意図しないOS のシャットダウン、ユーザアカウントの追加、変更 等

- 不正なプログラムのダウンロード、実行
   ウイルス、ワーム、ボット等への感染、バックドアの設置 等

- 他のシステムへの攻撃の踏み台
   サービス不能攻撃、システム攻略のための調査、迷惑メールの送信 等


注意が必要なウェブサイトの特徴

運営主体やウェブサイトの性質を問わず、外部プログラムを呼び出し可能な関数等(*1)を使用しているウェブアプリケーションに注意が必要な問題です。


届出状況

OSコマンド・インジェクションの脆弱性は、Perlで開発されたウェブアプリケーションや、組み込み製品の管理画面で使用されるCGIプログラム等のソフトウェア製品に発見され、届出を受けています。下記は、IPAが届出を受け、同脆弱性の対策が施されたソフトウェア製品の例です。


根本的解決

2-(i)
シェルを起動できる言語機能の利用を避ける。

ウェブアプリケーションに利用されている言語によっては、シェルを起動できる機能を持つものがあります。たとえば、Perlのopen関数等です。Perlのopen関数は、引数として与えるファイルパスに「|」(パイプ)を使うことでOSコマンドを実行できるため、外部からの入力値を引数として利用する実装は危険です。シェルを起動できる言語機能の利用は避けて(*2)、他の関数等で代替してください。Perlでファイルを開く場合、sysopen関数を利用すればシェルを起動することはありません。


保険的対策

2-(ii)
シェルを起動できる言語機能を利用する場合は、その引数を構成する全ての変数に対してチェックを行い、あらかじめ許可した処理のみを実行する。

シェルを起動できる言語機能の引数を構成する変数に対し、引数に埋め込む前にチェックをかけ、本来想定する動作のみを実行するように実装してください。チェック方法には、その引数に許可する文字の組み合わせを洗い出し、その組み合わせ以外は許可しない「ホワイトリスト方式」をお勧めします。数値を示すはずのパラメータであれば、数字のみからなる文字列であることをチェックします。チェックの結果、許可しない文字の組み合わせが確認された場合は、引数へ渡さず、処理を中止します。

なお、チェック方法には、OSコマンド・インジェクション攻撃に悪用される記号文字(「|」、「<」、「>」等)等、問題となりうる文字を洗い出し、これを許可しない「ブラックリスト方式」もありますが、この方法はチェックに漏れが生じる可能性があるため、お勧めできません。

以上の対策により、OSコマンド・インジェクション攻撃に対する安全性の向上が期待できます。OSコマンド・インジェクションの脆弱性に関する情報については、次の資料も参考にしてください。

脚注

(*1) 外部プログラムを呼び出し可能な関数の例:
   Perl: open(), system(), eval() 等
   PHP : exec(), passthru(), shell_exec(), system(), popen() 等

(*2) 3.2の修正例1~3を参照

CWE

参考URL