概要
ウェブアプリケーションによっては、外部からの攻撃により、ウェブサーバのOSコマンドを不正に実行されてしまう問題を持つものがあります。このような問題を「OSコマンド・インジェクションの脆弱性」と呼び、問題を悪用した攻撃手法を、「OSコマンド・インジェクション攻撃」と呼びます。
発生しうる脅威
OS コマンド・インジェクション攻撃により、発生しうる脅威は次のとおりです。
- サーバ内ファイルの閲覧、改ざん、削除
重要情報の漏えい、設定ファイルの改ざん 等
- 不正なシステム操作
意図しないOS のシャットダウン、ユーザアカウントの追加、変更 等
- 不正なプログラムのダウンロード、実行
ウイルス、ワーム、ボット等への感染、バックドアの設置 等
- 他のシステムへの攻撃の踏み台
サービス不能攻撃、システム攻略のための調査、迷惑メールの送信 等
注意が必要なウェブサイトの特徴
運営主体やウェブサイトの性質を問わず、外部プログラムを呼び出し可能な関数等(*1)を使用しているウェブアプリケーションに注意が必要な問題です。
届出状況
OSコマンド・インジェクションの脆弱性は、Perlで開発されたウェブアプリケーションや、組み込み製品の管理画面で使用されるCGIプログラム等のソフトウェア製品に発見され、届出を受けています。下記は、IPAが届出を受け、同脆弱性の対策が施されたソフトウェア製品の例です。
- 複数の ASUS 製無線 LAN ルータにおける OS コマンド・インジェクションの脆弱性
https://jvndb.jvn.jp/jvndb/JVNDB-2015-000011 - 「Usermin」における OS コマンド・インジェクションの脆弱性
https://jvndb.jvn.jp/jvndb/JVNDB-2014-000057 - 「Movable Type」における OS コマンド・インジェクションの脆弱性
https://jvndb.jvn.jp/jvndb/JVNDB-2012-000017
根本的解決
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() 等
CWE
- CWE-78: OSコマンドインジェクション
https://jvndb.jvn.jp/ja/cwe/CWE-78.html - CWE-78: Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection')
https://cwe.mitre.org/data/definitions/78.html
参考URL
- IPA: 知っていますか?脆弱性 (ぜいじゃくせい) 「5. OS コマンド・インジェクション」
https://www.ipa.go.jp/security/vuln/vuln_contents/oscmd.html