「OSコマンドインジェクションとはどのような攻撃なんだろう?」
「OSコマンドインジェクションの対策は、何から取り組むべき?」
OSコマンドインジェクションは、Webアプリケーションの脆弱性を突いた攻撃の1つで、OSコマンドを不正に実行させるものです。
OSコマンドインジェクションの脆弱性を放置しておくと、情報漏えいやWebサーバーの乗っ取りなど、大きな被害に発展する恐れがあります。
本記事では、OSコマンドインジェクションの脆弱性が発生するしくみから、効果的な対策方法まで解説します。セキュリティ対策を効率よく推進していきたい方は、ぜひご覧ください。
Webアプリケーションのセキュリティ対策にお悩みの方、必見!
OSコマンドインジェクションの対策は、何から取り組むべき?
Webシステムの脆弱性をチェックし、最適な対策を実施することが大切です。 まずは、サービス紹介資料をご覧ください。
OSコマンドインジェクションとは
OSコマンドインジェクションは、入力値の中に紛れ込ませたOSコマンドを、Webアプリケーションがシェルに渡してしまうことで成立する攻撃です。
シェルとは、OSの中核であるカーネルとユーザーとを仲介するプログラムのことで、OSコマンドを受け取り、変換したコマンドをカーネルに受け渡す役割を担っています。
OSコマンドを実行するWebアプリケーションの処理において、ユーザーの入力値がそのまま使われてしまう場合、OSコマンドインジェクションの脆弱性が生じる恐れがあります。
OSコマンドインジェクションは、以下のような仕組みで成立します。
- 攻撃者が入力値にOSコマンドを紛れ込ませる
- 受け取った入力値から、シェルに渡す文字列が組み立てられる
- 紛れ込んだOSコマンドがシェルに渡され、実行されてしまう
WebアプリケーションにOSコマンドインジェクションの脆弱性がある場合、開発者が意図しないOSコマンドをWebサーバー上で実行されてしまう恐れがあります。
OSコマンドインジェクションによる脅威
OSコマンドインジェクション攻撃を受けると、以下のような被害が発生する恐れがあります。
- 情報漏えい
- ファイルの改ざん・削除
- データベースの破壊
- マルウェア感染
- Webサーバーそのものの乗っ取り
- 他の攻撃の踏み台にされる
OSコマンドインジェクションの脆弱性がある場合、さまざまなOSコマンドが実行できてしまいます。なお、実行可能なOSコマンドは、Webアプリケーションで許可されている範囲内に限定されます。
例えば、ファイルの編集・削除権限がある場合は、ファイルの改ざんや削除が実行可能です。また、権限昇格が可能な場合は、ファイルの改ざん・削除に留まらず、より高い権限を必要とするOSコマンドの実行も可能となってしまいます。
OSコマンドインジェクション攻撃を受けてしまうと、Webサーバー内に保存されているファイルの窃取や改ざん・破壊はもちろん、Webサーバーそのものの乗っ取りや、他システムを攻撃する際の踏み台にされる、といった大きな被害が想定されます。
いずれも影響範囲が大きいため、OSコマンドインジェクションには入念な対策が必要です。
Webアプリケーションの脆弱性には適切な対策を
適切なセキュリティ対策が行われていないWebアプリケーションは、脆弱性が重大な脅威になります。
IPA発表の「2023年第1四半期の脆弱性対策情報データベースJVN iPediaの登録状況」によると、脆弱性を種類別に見たときに、クロスサイトスクリプティングが最も多く、次いでSQLインジェクションが多くなっています。
「クロスサイトスクリプティング(XSS)|影響と対策をわかりやすく解説」では、仕組みや想定される被害、また、効果的な対策方法を解説しているので、ご一読いただくことをおすすめします。
「SQLインジェクションの対策|被害事例と攻撃が起こる仕組みを解説」では、SQLインジェクションに対するセキュリティ対策を「根本的な対策」と「補完的な対策」にわけて解説しています。ぜひ参考にしてみてください。
OSコマンドインジェクションの対策
OSコマンドインジェクションの脆弱性は、以下の2つの条件を共に満たす場合に生じます。
- シェル呼び出し機能のある関数を使用している
- 外部からの入力値をそのままシェルに渡している
シェル呼び出し機能のある関数を使用しており、かつ、任意のOSコマンドの実行を引き起こすような入力値をそのままシェルに渡す実装となっていると、OSコマンドインジェクション攻撃を受ける可能性があります。
以下では、この2つの原因を踏まえたうえで、OSコマンドインジェクションの根本的な対策方法をご紹介します。
1. OSコマンドを呼び出せる関数・メソッドを使わない
OSコマンドインジェクションの根本的な対策として「OSコマンドを呼び出せる関数・メソッドを使わない」という対策が挙げられます。
先述の通りOSコマンドインジェクションは、「シェル呼び出し機能のある関数を使う」「外部からの入力値をそのままシェルに渡す」のいずれかを解消することが対策になります。
しかし前提として、そもそも「OSコマンドを呼び出さない」実装になっていれば、原理的にOSコマンドインジェクション攻撃を受けることはありません。そのため、OSコマンドを呼び出せる関数・メソッドを使わないことで、OSコマンドインジェクションの対策になります。
OSコマンドを呼び出すことができるすべての言語において、OSコマンドインジェクションの脆弱性対策が必要です。OSコマンドを呼び出せる関数・メソッドとして、以下のような例が挙げられます。
言語 | 関数・メソッド |
---|---|
PHP | exec(), system(), passthru(), shell_exec(), pcntl_exec() |
Perl | eval(), open(), system() |
Python | os.system(), os,popen(), subprocess.Popen, subprocess.call(), subprocess.run() |
Java | ProcessBuilder() |
Ruby | exec(), system(), IO.popen() |
OSコマンドを実行できる関数・メソッドの利用を避けるために、「使ってはいけない関数リスト」のような開発者向けのチートシートを作って共有しておくことをおすすめします。
2. シェルの呼び出し機能がある関数を使わない
機能要件上、どうしてもOSコマンドを呼び出さざるを得ない場合には、シェルの呼び出し機能がある関数を使わない実装が求められます。シェルの呼び出し機能がある関数以外を使うことで、OSコマンドインジェクションの根本的な対策になります。
シェルには複数のコマンドを1行で指定できる機能があります。そのため、元々用意されていたOSコマンドに任意のOSコマンドを追加する形で入力値を渡せば、OSコマンドインジェクション攻撃が成立します。
シェルの呼び出し機能がある関数の使用を避けることで、シェルの機能を悪用したOSコマンドインジェクション攻撃を防ぐことができます。
対策例として、open関数ではなくsysopen関数を使う方法があります。
Perlのopen関数を使って外部のファイルを開く場合、引数として与えられるファイルパスの前後に「|」を使うことで、任意のコマンドの追加が可能です。そのため、open関数を利用している場合はOSコマンドインジェクションの脆弱性が生じる恐れがあります。open関数ではなくsysopen関数を利用すれば、シェルを呼び出すことなくファイルを開くことができます。
何らかの理由でOSコマンドを呼び出す実装にしなければならず、根本的な対策が取れない場合の代替策についてご紹介します。
根本的な対策が取れない場合
1. 入力値をコマンドラインのパラメータとして渡さない
ユーザーの入力値をコマンドラインのパラメータに渡さない実装にすることで、OSコマンドインジェクションの対策になります。
OSコマンドインジェクションは、外部からの不正な入力値がシェルに渡されることで発生する攻撃です。そのため、外部からの入力値をコマンドラインのパラメータに渡さないような実装をすることで、脆弱性を解消することができます。
2. 入力値を検証する
保険的な対策として、外部からの入力値を検証する、という対策も挙げられます。例えば、ファイル名に利用可能な文字種を英数字に限定し、ファイル名を指定する際は英数字以外の入力を許可しないようにする、といった実装があります。
ただし、これは保険的な対策であり、根本的なOSコマンドインジェクションの対策にはならないということに注意してください。適用する場合は、エスケープ処理などの対策と組み合わせて実施することをおすすめします。
3. パラメータにエスケープ処理を施す
入力値をコマンドラインに渡さざるを得ない場合には、入力値にエスケープ処理を施しましょう。
「|」や「;」といった、メタ文字として機能し得る文字を無害な文字列にエスケープすることで、OSコマンドインジェクション攻撃を防ぐという方法もありますが、あまりお勧めできません。シェルのエスケープ処理は複雑で不備が生じやすいため、安全にエスケープ処理が行えるよう、ライブラリの利用を推奨します。
セキュリティをさらに高める3つの手段
OSコマンドインジェクションの脆弱性は、情報漏えいやWebサーバーの乗っ取りなど、大きな被害に発展する恐れがあるので、セキュリティインシデントを未然に防止するための対策検討をおすすめします。
セキュリティをさらに高めるには、脆弱性診断やWAFなど、セキュリティ専門のツールやサービスの導入が有効でしょう。これらは、OSコマンドインジェクションの脆弱性に非常に有効な対策です。ここでは、3つのセキュリティ強化手段を説明します。
1. 第三者による脆弱性診断の実施
セキュリティの専門知識がないまま、脆弱性を漏れなく把握し対応していくのは至難の業です。診断ベンダーなど第三者に脆弱性診断を依頼して、OSコマンドインジェクションの脆弱性を洗い出してもらいましょう。
第三者による脆弱性診断を受けると、検出された場合の該当箇所や対応策の提示をしてもらえるだけでなく、SQLインジェクションやクロスサイトスクリプティングなど他の脆弱性もチェックできるので、セキュアなWebアプリケーション運用に役立ちます。
「脆弱性診断(セキュリティ診断)とは|必要性からやり方まで、すべて解説」では、脆弱性診断の概要、種類やサービスを選ぶ際のポイントなどを最新の情報に基づいて説明しています。自社のニーズに合うセキュリティ対策を検討する上でのよい判断材料になりますので、ご一読いただくことをおすすめします。
2. 脆弱性診断ツールの導入
診断ベンダーに依頼せず、組織内で診断を実施したい場合には、脆弱性診断ツールを導入するという方法もおすすめです。ツールを導入することで、都度ベンダーに依頼するよりも工数やコストを抑えられ、好きなタイミングで迅速に診断できるというメリットがあります。
診断を内製化することで、 開発したアプリケーションのセキュリティをより手軽に強化したい方は、ツールの導入を検討してみると良いでしょう。
「脆弱性診断ツール(サービス)|有料・無料の違いと5つの選定ポイント」では、ツールを選ぶ時のポイントやツールの種類についてわかりやすく解説していますので、ぜひご覧ください。
3. WAFの導入
WAFとは、「Web Application Firewall」の略称で、攻撃性のある通信を検知・遮断してWebアプリケーションを保護する仕組みです。
OSコマンドインジェクションをはじめとする脆弱性の根本的な対策は、Webアプリケーションそのものを改修し、脆弱性をなくすことです。しかし、脆弱性の改修にはコストも時間もかかるため、改修中に攻撃を受けないとは限りません。改修中の対策として、また、万が一対策が漏れていた場合の保険的対策としてWAFを導入することもおすすめです。
「WAFとは|どこまで守れる?セキュリティ対策の効果をわかりやすく解説」では、WAFの効果や使い方のポイントをわかりやすく解説していますので、ぜひご覧ください。
まとめ|OSコマンドインジェクションは基本的な対策と脆弱性診断で防ごう
OSコマンドインジェクションは、攻撃者がWebサーバーにOSコマンドを不正に実行させる攻撃です。
攻撃を受けると、以下のような被害が発生する恐れがあります。
- 情報漏えい
- ファイルの改ざん・削除
- Webサーバーそのものの乗っ取り
OSコマンドインジェクションは、以下のいずれかを行うことで、防ぐことができます。
- OSコマンドの呼び出しを避ける
- シェルの呼び出し機能がある関数の使用を避ける
よりセキュリティを高めるには脆弱性診断がおすすめです。定期的に診断を実施し、脆弱性を修正することで、Webアプリケーション全体の安全性を維持できます。脆弱性診断ツールを利用すれば、第三者による診断よりコストをおさえつつ網羅的な診断ができるようになるでしょう。
また、脆弱性の修正には時間がかかるため、修正中の保険的対策としてWAFを導入することもおすすめします。
最適なセキュリティ対策を導入し、OSコマンドインジェクションの脅威から組織を守りましょう。