情報セキュリティ

安全なウェブサイトの作り方 - 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. (脚注1)
    外部プログラムを呼び出し可能な関数の例:
    • Perl: open(), system(), eval() 等
    • PHP : exec(), passthru(), shell_exec(), system(), popen() 等
  2. (脚注2)
    3.2の修正例1~3を参照

CWE