OSコマンドインジェクションの仕組みとその対策

2019.03.06

Webセキュリティ

OS-command-injection-Measures

ブルートフォースアタックやSQLインジェクションは比較的耳にしやすいサイバー攻撃ですが、そういったサイバー攻撃の中に「OSコマンドインジェクション攻撃」というものも存在しています。
「OSコマンドインジェクション」とは一体どういうサイバー攻撃なのでしょうか。
今回は「OSコマンドインジェクション」の仕組みとその対策方法についてご紹介します。

目次

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

OSコマンドインジェクションは、ユーザーからデータや数値の入力を受け付けるようなWebサイトなどにおいて、プログラムに与えるパラメータにOSへの命令文を紛れ込ませて不正に操作する攻撃です。
本来想定されていない命令文を強制的に実行させてしまいます。

主にWebアプリケーションがWebサーバのシェルを呼び出してコマンドを実行する動作が狙われます。


OSコマンドインジェクションの仕組みを噛み砕くと、

① 攻撃者がWebアプリケーションに攻撃パターンを入力
② Webアプリケーション内で入力値とともにコマンド文字列が組み立てられる
③ コマンド文字列がWebサーバのシェルにおいて解釈されて実行される
④ 開発者が意図しないコマンドが実行される

といった流れになっています。
このように、OSコマンドインジェクションが実行されることによって、攻撃者の意のままにデータベースを操ることができるようになるため、情報漏えいや改ざん・削除、不正なシステム操作、ウイルス感染などが発生します。
具体例として、メールアドレスを入力して実行すると、mailコマンドを利用してメールを送信するWebアプリケーションを例として、脆弱性を悪用した情報漏えい、改ざん・削除がどのようになされるかを説明します。

OSコマンドインジェクションによる情報漏えい

WebアプリケーションはPHPで作成したとします。
この場合、以下のようなプログラムとなります。
なお、メッセージは別ファイルが準備されており、入力されたメールアドレスとともに、メール送信コマンドを実行することでメール送信されるとします。

$address  = $_POST[‘address’]; 
$message_file = “/var/data/aaa.txt”;
$rtn = exec('mail -s “タイトル” ’.$address.’< ‘.$message_file);

ここで、入力値「address」をチェックしていない場合、入力値が以下のように入力されて実行されたとします。

xxx@example.com

すると、プログラム上のexec内は上の値が入力されて、以下のコマンドが実行されるようになります。

mail -s “タイトル” xxx@example.com 

しかし、#< /var/data/aaa.txtの部分はコメントと解釈されるため、実際に実行されるコマンドは以下となります。

mail -s “タイトル” xxx@example.com 

この結果、/etc/passwdの内容が入力されたメールアドレス宛に流出します。

OSコマンドインジェクションによる改ざん・削除

同じく、例の脆弱性のあるWebアプリケーションにおいて、以下が入力されたとします。

xxx@example.com; rm -rf /var/log/xxx.log #

すると、プログラム上のexec内は上の値が入力されて、以下のコマンドが実行されるようになります。

mail -s “タイトル” ; rm -rf /var/log/xxx.log # < /var/data/aaa.txt

しかし、#< /var/data/aaa.txtの部分はコメントと解釈されるため、実際に実行されるコマンドは以下となります。

mail -s “タイトル” ;xxx@example.com; rm -rf /var/log/xxx.log

この場合、メールコマンドでメール送信された後、/var/log/xxx.logが削除されるという操作になります。
もし、xxx.logがアプリケーションの操作ログだった場合、悪意ある操作の証拠がなくなることになります。

OSコマンドインジェクションを発生させないためには

対策としては、外部ファイルを起動する作りとしないことが一番の対策です。しかし、どうしても外部ファイルを実行するしか手段がない場合は、以下のように、慎重な設計と実装が求められます。

①別ブログラムを実行する関数を実装する場合は要注意

PHPでは「system()」や「exec()」等、Perlでは、「eval()」や「open()」、「system()」等が該当します。
もしこれらのような関数が必要な場合、次のチェックをします。

②①に渡す引数をユーザからの入力値使って構成しているか、またはコンテンツ上にパラメータを引き渡す形となっている場合

ユーザからの入力値がある場合は想定しない特殊文字(「;」や「<」など)が入力された場合はこれを無効化(エスケープ)や処理中断するようにします。
注意が必要な特殊文字には以下のものがあります。

「;」 「|」 「&」 「`」 「(」「)」 
「$」 「<」 「>」 「*」 「?」 「{」「}」 「[」 「]」 「!」
また、ユーザからの入力という場合でなくても、コンテンツ上にhidden属性を使ってパラメータを引き渡す場合も要注意です。この場合、悪意あるユーザがhidden属性のパラメータを改ざんして、意図しないパラメータがWebアプリケーションに引き渡される可能性があります。

③内部でシェルが用いられない関数を利用する

OSコマンドインジェクションの問題は内部でシェルが用いられることから、入力値に任意のコマンドを設定することが可能なことです。
従って、別ブログラムを実行することが避けられない場合は、内部でシェルが用いられない関数を利用することでOSコマンドインジェクションの問題を回避することができます。
これは、C言語においてはexecve等のexec系関数が、JavaではRuntimeクラスのexecメソッドが相当します。

④WAFの導入

Webアプリケーションの脆弱性を狙った攻撃への理想的な解決方法は、Webアプリケーションを即座に修正することですが、プログラム修正はその度にコストと時間がかかることから、すぐに解決することは困難です。しかし、Webアプリケーションへの脅威は待ってくれません。
そこで、Webアプリケーションでの対策以外に、WAF(ウェブアプリケーションファイアウォール)を導入し対策する方法があります。WAFでは、OSコマンドインジェクションなどのアプリケーションの脆弱性が検知・防御できるため有効な対策方法です。

いかがでしたでしょうか。
SQLインジェクションやクロスサイト・スクリプティングといったサイバー攻撃に比べて、あまり知られていない攻撃ではありますが、対策をしないままでいると非常に大きな被害を生みかねません。
OSコマンドインジェクション攻撃への対策も十分に行いましょう。

おススメのクラウド型WAF

WAFを選定する時には、サポート体制や導入実績なども重視して、自社に最適なものを選びましょう。

クラウド型WAFも選択肢が多いですが、導入しやすいものとしておすすめするものに「攻撃遮断くん」があります。

システム変更不要のため最短翌営業日で導入でき、ユーザー側での運用は一切必要ないため低価格かつ簡単に高セキュリティを実現できます。

「攻撃遮断くん」の詳細資料は、こちらからダウンロード頂けます。

 

(2018/4/26 執筆、2019/3/6修正・加筆)