(2018/4/26 執筆、2019/11/6修正・加筆、2022/1/22修正・加筆)
Webアプリケーションへのサイバー攻撃としてよく知られる方法に、ブルートフォースアタックやSQLインジェクションがあります。その被害事例や手口、対策については広く知られるようになってきました。
これらの攻撃と並んで、Webアプリケーションへの直接的な攻撃方法として「OSコマンドインジェクション」があります。やはり他の攻撃と同様に、手口を知り対策を行う必要のある攻撃です。
本記事では、「OSコマンドインジェクション」の仕組みやプログラム上での対策、WAFを利用した対策についてわかりやすく紹介いたします。
OSコマンドインジェクションは、Webサイトに向けて不正な入力を行うことにより、Webサーバ側で想定していない動作をさせるサイバー攻撃です。入力を受け付けるWeb画面を主なターゲットとし、ユーザーからのデータや数値の入力に紛れ込ませて、プログラムに与えるパラメータ(入力値)にOSへの命令文(コマンド)を渡します。この命令文を受け取ったWebサーバが誤ってOSに対する命令を行ってしまうことで被害が発生する攻撃です。
Webシステムの作成者や管理者が想定していない命令文をサーバ上で強制的に実行されてしまいます。
主にWebアプリケーションが、Webサーバのシェルというプログラムを呼び出してコマンドを実行する動作が狙われます。
OSコマンドインジェクションを動作順序に沿って分解すると、下記のような流れとなります。
このように、OSコマンドインジェクションは攻撃者の意のままにサーバ上のデータベースなどを操ることができてしまいます。その結果として、情報漏えいや改ざん・削除、不正なシステム操作、ウイルス感染などが発生します。
IPA(独立行政法人情報処理推進機構)はIT施策に関する政府施策の実施機関です。情報セキュリティについても多くの注意喚起や対策の示唆を行っています。
OSコマンドインジェクションについても、IPAのサイト内に概要と対策についての記載があるため、こちらもご参照ください。
ここからは具体例として、実際にOSコマンドインジェクションが起こってしまうプログラムについて説明します。
以下は、OSコマンドインジェクションにより情報漏えいが発生してしまう例です。Webアプリケーションを、プログラミング言語PHPを使って構築した場合を想定しています。
Webアプリケーションの画面があり、メールアドレスを入力して実行すると、Webサーバ上でmailコマンドを利用してメールを送信する仕組みがあります。OSコマンドインジェクションへの対策が行われていない場合、この仕組みを脆弱性として悪用し情報漏えい、改ざん・削除が行われる可能性があります。なお、mailコマンドはLinuxやWindowsPowerShellで利用可能なメール送信を行うコマンドです。
その例が、以下のようなプログラムです。下記の例では、メールの本文となるメッセージは別ファイル(/var/data/aaa.txt)が準備されています。入力されたメールアドレスとともに、メール送信コマンドを実行することでメールが送信されます。
例:
$address = $_POST[‘address’]; //画面入力値からメールアドレスを取得
$message_file = “/var/data/aaa.txt”; //メールの本文をファイルより取得
$rtn = exec('mail -s “タイトル” ’.$address.’< ‘.$message_file); //mailコマンドの実行
ここで、入力値「address」に不正な文字列が入っていないかをチェックしていない場合には、以下のような入力をされてしまうことがありえます。
xxx@example.com < /etc/passwd #
すると、プログラム上のexec内は上の値が入力されて、以下のOSコマンドが実行されるようになります。
mail -s “タイトル” xxx@example.com < /etc/passwd #< /var/data/aaa.txt
OSコマンドとして上記の命令を行った場合、「#< /var/data/aaa.txt」の部分はコメントと解釈されるため、実際に実行されるコマンドは以下となります。
mail -s “タイトル” xxx@example.com < /etc/passwd
この結果、/etc/passwdの内容が入力されたメールアドレス宛に流出します。
※/etc/passwdはLinuxの一部でパスワードを格納するファイル
上記の情報漏えいの例と同様に、OSコマンドインジェクションによりサーバ上のデータの改ざん、削除が行われる場合もあります。脆弱性のあるWebアプリケーションにおいては、下記のようにサーバ上のデータが削除されることもありえるという例です。
情報漏えいの場合と同じWebアプリケーションでメールアドレスを画面の入力から取得している場合に、下記のような入力が行われた場合を想定します。
xxx@example.com; rm -rf /var/log/xxx.log #
すると、プログラム上のexec内は上の値が入力されて、以下のコマンドが実行されるようになります。
mail -s “タイトル” xxx@example.com; rm -rf /var/log/xxx.log # < /var/data/aaa.txt
しかし、#< /var/data/aaa.txtの部分はコメントと解釈され、「;」はコマンドの終端記号のため、実際に実行されるコマンドは以下の2文となります。
mail -s “タイトル” xxx@example.com;
rm -rf /var/log/xxx.log
この場合、mailコマンドでメール送信を実行し、その後/var/log/xxx.logが削除されるという操作になります。もし、xxx.logがアプリケーションの操作ログだった場合、ログが削除され、悪意ある操作の証拠がなくなる結果となります。
OSコマンドインジェクションの対策として一番よい方法は、アプリケーションでOSコマンドから外部ファイルを起動する実装を行わないことです。しかし、どうしてもOSコマンド経由で外部ファイルを実行するしか手段がない場合は、以下の点に注意して慎重な設計と実装を行う必要があります。
OSコマンドを実行する関数は、PHPでは「system()」や「exec()」等、
Perlでは、「eval()」や「open()」、「system()」等、
Pythonでは「os.system()」、「os.popen()」、「subprocess.Popen()」、「subprocess.call()」、「subprocess.run()」等が該当します。
これらの関数については、チートシートを作っておき、プログラムのチェックに利用することをおすすめします。
もしこれらの関数がプログラム内で利用されている場合は、関数の入力値に対してチェックを行います。
ユーザからの入力値がある場合は、入力値内に想定しない特殊文字(「;」や「<」など)が存在するかどうかをチェックします。これらの特殊文字が入力された場合は、特殊文字を無効化(エスケープ)したり、プログラムの処理を中断するようにします。
注意が必要な特殊文字として、下記の文字があげられます。
※プログラミング言語や環境により変わることがあります。
「;」 「|」 「&」 「`」 「(」「)」 「$」 「<」 「>」 「*」 「?」 「{」「}」 「[」 「]」 「!」
またユーザからの入力ではなく、HTMLコンテンツ上にhidden属性を使ってパラメータを引き渡す場合も注意が必要です。この場合、悪意あるユーザがhidden属性のパラメータを改ざんして、意図しないパラメータがWebアプリケーションに引き渡される可能性があります。
OSコマンドインジェクションで問題となるのは、プログラムの内部で特定の関数を利用することで、シェルを用いてOSコマンドの実行が可能であり、入力値に任意のコマンドを設定できてしまうことです。本来、Webアプリケーションの処理の多様性を実現するために用意されている仕組みなのですが、OSコマンドインジェクションへの対策を行っていない場合には脆弱性となってしまいます。
従ってWebアプリケーションから別プログラムを実行することが避けられない場合は、内部でシェルが用いられない関数を利用することも対策の一つとなります。シェルのように自由にコマンドを設定できなくなるため、OSコマンドインジェクションの問題を回避することが可能です。
このような関数としては、C言語におけるexecve等のexec系関数が、JavaのRuntimeクラスのexecメソッドが相当します。
Webアプリケーションの脆弱性を狙った攻撃への理想的な解決方法は、脆弱性が見つかり次第Webアプリケーションを修正することです。しかし、プログラム修正はその度にコストと時間が必要となってしまいます。アプリケーションの修正とテスト、そしてリリースの調整などの時間をかけて対応している間も、Webアプリケーションへの脅威は待ってはくれません。
そこでWebアプリケーションを修正する以外の対策として、WAF(Web Application Firewall)を導入する方法があります。WAFは外部からの攻撃から、Webアプリケーションを守るソフトウェアです。OSコマンドインジェクションなどのアプリケーションの脆弱性に対する攻撃が検知・防御できます。
WAFはWebアプリケーションに対する外部からの攻撃を防御します。この攻撃の中にはOSコマンドインジェクションなどのコマンド攻撃も対象として含んでおり、画面への入力値などをWAFによってチェックすることができます。不正な入力が発見された場合には、Webアプリケーションへ入力を渡さずに処理を遮断するなど、未然に被害を防ぐことが可能です。
OSコマンドインジェクションはWebアプリケーションの脆弱性を付き、Webサーバ上でのOSコマンド実行に際して、予期せぬ動作をさせるサイバー攻撃です。Webサーバ上のOSコマンドとして実行されるため、情報漏えいやデータの改ざん、削除などの直接的な被害に繋がりえる攻撃となります。
OSコマンドインジェクションの対策として、WebアプリケーションからのOSコマンドの実行を避ける、画面入力値のチェックなどの方法がありますが、Webアプリケーションの改修を伴います。また、未知の脆弱性が発見された場合にはさらなる修正が必要となる可能性があります。
この問題の解決方法の一つとなるのがWAFによる対策です。特にクラウド型のWAFを利用した場合には、最新の脆弱性への対応もサービス提供会社側で行うためWebアプリケーションの修正を伴わないというメリットが存在しています。
WAFを選定する際には、サポート体制や導入実績なども重視して、自社に最適なものを選びましょう。
クラウド型WAFも多数のサービスが提供されており選択肢は多くあります。その中でも、導入しやすいクラウド型WAFとしておすすめできるのが「攻撃遮断くん」です。
Webアプリケーション側のシステム変更不要のため、最短1営業日から導入でき、ユーザー側での運用は一切必要ありません。低価格で簡単にWebアプリケーションのセキュリティを高めることができます。
「攻撃遮断くん」の詳細資料は、こちらからダウンロード頂けます。
この記事と一緒に読まれています
HTTPヘッダインジェクションとOSコマンドインジェクションの違いと対策方法を徹底解説!
2020.01.06
セキュリティ対策
2020.02.25
セキュリティ対策
クラウド型WAFサービスを導入するメリットとデメリットをそれぞれまとめてみた
2020.02.16
セキュリティ対策
Webアプリケーションのセキュリティ対策を行うべき5つの理由
2020.03.29
セキュリティ対策
2020.02.19
セキュリティ対策