安全なウェブサイトの作り方 - 1.2 OSコマンド・インジェクション
概要
ウェブアプリケーションによっては、外部からの攻撃により、ウェブサーバのOSコマンドを不正に実行されてしまう問題を持つものがあります。このような問題を「OSコマンド・インジェクションの脆弱性」と呼び、問題を悪用した攻撃手法を、「OSコマンド・インジェクション攻撃」と呼びます。
発生しうる脅威
OS コマンド・インジェクション攻撃により、発生しうる脅威は次のとおりです。
- サーバ内ファイルの閲覧、改ざん、削除
-
重要情報の漏えい、設定ファイルの改ざん 等
- 不正なシステム操作
-
意図しないOS のシャットダウン、ユーザアカウントの追加、変更 等
- 不正なプログラムのダウンロード、実行
-
ウイルス、ワーム、ボット等への感染、バックドアの設置 等
- 他のシステムへの攻撃の踏み台
-
サービス不能攻撃、システム攻略のための調査、迷惑メールの送信 等
注意が必要なウェブサイトの特徴
運営主体やウェブサイトの性質を問わず、外部プログラムを呼び出し可能な関数等(脚注1)を使用しているウェブアプリケーションに注意が必要な問題です。
届出状況
OSコマンド・インジェクションの脆弱性は、Perlで開発されたウェブアプリケーションや、組み込み製品の管理画面で使用されるCGIプログラム等のソフトウェア製品に発見され、届出を受けています。下記は、IPAが届出を受け、同脆弱性の対策が施されたソフトウェア製品の例です。
- 複数の ASUS 製無線 LAN ルータにおける OS コマンド・インジェクションの脆弱性
- 「Usermin」における OS コマンド・インジェクションの脆弱性
- 「Movable Type」における OS コマンド・インジェクションの脆弱性
根本的解決
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を参照