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

OSコマンドインジェクションについて

OSコマンドインジェクション(command injection)とは

OSコマンドインジェクションとは、文字列を組み立ててOSコマンドを実行している処理に対して、攻撃者がパラメータにOSコマンドを挿入することで、プログラムに不正なコマンドを実行させる攻撃手法です。

コマンド注入(Command injection)とも呼ばれます。


WebサイトでのOSコマンドインジェクション

閲覧者からのデータの入力や操作を受け付けるようなWebサイト(WebアプリケーションプログラムやCGIスクリプト)において、リクエストパラメータ(HTMLフォーム)にOSコマンドを含めることで、Webサーバ上でOSコマンドを実行することができます。

不正にコマンドを実行させることでシステム破壊や個人情報の収集、他WEBサイトへの攻撃の踏み台とすることができます。


攻撃対象について

既に広く知られた攻撃手法であり、対策されていることがほとんどです。

しかし、パラメータテストが実施不足であるシステムや、このような攻撃手法を知らない個人WEBサイトで不正実行が可能な場合があります。


OSコマンドインジェクションの仕組み

コマンドライン引数を受け取って、OSコマンドを実行するRubyスクリプトを用意します。


#!/usr/bin/ruby

result = system("ls -l #{ARGV[0]}")
print(result)

まずは、このスクリプトを正常実行(システムにとって想定していた値)させます。


./cmd_injection "/home/user01"

これにより、スクリプトによって実行されるコマンドは下記の形となります。


ls -l /home/user01

スクリプトが実行されるとホームディレクトリ配下のファイル一覧情報が表示されます。


では、スクリプトを不正実行させます。


./cmd_injection "/home/user01; rm -rf /home/user01"

これにより、スクリプトによって実行されるコマンドは下記の形となります。


ls -l /home/user01; rm -rf /home/user01

UNIX系シェルは「;」文字が指定された場合には、複数のコマンドを一行で実行します。

なので、以下のコマンドが実行されたこととなります。


$ ls -l /home/user01
$ rm -rf /home/user01

スクリプトが実行されると/home/user01配下のデータファイルが全て削除されることとなります。


以上がOSコマンドインジェクションの基本動作です。

WebアプリケーションプログラムやCGIスクリプトにおいてHTMLフォームから入力を受け付けてサーバ上でコマンドを実行している場合には、HTMLフォームに「;コマンド」文字列を入力することで、サーバ上で任意のコマンドを実行することができます。


OSコマンドインジェクションでは攻撃者が任意のOSコマンドを実行できるため、システム破壊だけでなく情報収集や不正ログインまで行える致命的なセキュリティホールといえます。


OSコマンドインジェクションへの対策

関数の使用禁止

CGIスクリプトで以下のような外部プログラムを呼び出す関数を利用しないようにします。

スクリプト言語で下記の関数を用いないようにコーディングするように注意します。

Ruby exec(), system(), open("|{command}", mode, perm)
Perl exec(), system(), open()
PHP exec(), passthru(), proc_open(), shell_exec(), system()

サニタイジング

WEBサイトでユーザからの入力を受け付ける場合、サニタイジングを実施することは必須です。

サニタイジングとは、Webサイトの入力フォームへの入力データから、HTMLタグ、JavaScript、SQL文などを検出し、それらを他の文字列に置き換える操作のことです。

サニタイジングは「無害化」とも呼ばれ、入力データ中に含まれる悪意のある文字列が実行されることを防ぐことができます。



関連ページ