Webサービスは、検索機能、問い合わせフォーム、管理画面での各種設定など、ユーザの操作に応じて動的な処理を行うことで、その利便性を高めています。しかし、この「ユーザからの入力を受け付ける」という仕組みそのものに、深刻なセキュリティ脅威が潜んでいる可能性があります。
その中でも特に深刻な脅威の一つが「OSコマンドインジェクション」です。
本記事では、OSコマンドインジェクションがどのようなサイバー攻撃であり、どのような仕組みであるかを解説しつつ、混同しがちな「SQLインジェクション」との違いから対策方法を説明していきます。
【資料配布】OSコマンドインジェクションを防ぐWAFとは?
OSコマンドインジェクションを始めとしたWebサイトを狙った攻撃を防ぐセキュリティツールがWAF(Web Application Firewall:ワフ)です。
WAFは不正アクセスやSQL インジェクションなど、HTTPリクエストを悪用した攻撃を検知し、遮断します。
本記事をご覧の方向けに、
・WAFとはなにか?
・ファイアウォールとの違いは何か
・WAFにはどのような種類があるか
などを図解でまとめた資料をご用意しました。ぜひご活用ください!
【無料】3分でわかるWAF 資料をダウンロードする
OSコマンドインジェクションとは?
OSコマンドインジェクションの定義や仕組み、SQLインジェクションとの違い、そしてどのような被害が想定されるのかを解説していきます。
OSコマンドインジェクションとは、Webアプリケーションの脆弱性を悪用し、攻撃者がサーバのOSに対し、意図しない不正な命令(コマンド)を注入し、それを実行させるサイバー攻撃です。
通常、Webアプリケーションはユーザからの入力を受け取り、その情報をもとにサーバ側で処理を行います。しかし、入力値の検証が不十分な場合、攻撃者は入力フォームやURLパラメータに悪意あるOSコマンドを含む文字列を注入することができます。
これにより、本来実行されるはずのない危険なコマンドがサーバ上で実行され、ファイルの閲覧・改ざん・削除、さらには攻撃されたサーバが他のシステムへの侵入の足がかりとして利用されるなどの被害を引き起こす攻撃がOSコマンドインジェクションです。
SQLインジェクションとの違い
OSコマンドインジェクションとよく混同される攻撃手法に「SQLインジェクション」があります。両者は名前が似ているため同じものと誤解されがちですが、攻撃対象と被害範囲が異なります。
SQLインジェクションは、データベースに対する攻撃です。不正なSQL文を注入することで、データベース内の情報を不正に取得・改ざん・削除します。被害はデータベースに保存された情報(顧客情報、認証情報など)に限定されることが一般的です。
一方、OSコマンドインジェクションは、サーバのOS自体に対する攻撃です。
OSコマンドを実行できるため、データベースだけでなく、サーバ上のあらゆるファイルやシステム設定にアクセスできます。つまり、被害範囲はサーバ全体に及びます。
| 比較項目 |
OSコマンドインジェクション |
SQLインジェクション |
| 攻撃対象 |
WebサーバのOS(オペレーティングシステム) |
データベース (DB) |
| 実行される命令 |
OSコマンド(ls, rm, cat, wget 等) |
SQL文(SELECT, UPDATE, DELETE 等) |
| 主な目的・被害 |
サーバの完全な乗っ取り、全データの破壊、バックドア設置、踏み台化 |
データベース内のデータの窃取、改ざん、削除(個人情報、決済情報など) |
被害①:機密情報漏えいとファイルの改ざん・削除
攻撃者は「ls」「cat」などのコマンドを使い、サーバ内部のファイルを狙います。
機密情報の漏えい
「/etc/passwd」や、データベースのパスワードが記載された「config.php」のような設定ファイルが盗まれます。
これにより、システム情報やデータベースの全情報が危険にさらされます。
ファイルの改ざん・削除の被害
「echo」コマンドでWebサイトのトップページを不正に書き換えられたり、「rm」コマンドでユーザのアップロードファイルを削除されたりします。
もし「rm -rf /」のようなコマンドが管理者権限で実行されると、サーバ上の全データが消去され、復旧が極めて困難になるなど、壊滅的な被害につながります。
被害②:サーバの乗っ取りと「バックドア」の設置
攻撃者は、OSコマンドを実行できる脆弱性を発見すると、自由にアクセスできる「バックドア」を設置します。
バックドアとは、正規の認証プロセス(IDやパスワードの入力)を経由せず、攻撃者だけが不正にアクセスできる侵入経路のことです。
例えば、「wget」や「curl」といったコマンドを不正に実行され、攻撃者が用意したサーバから「Webシェル」と呼ばれる不正なプログラムをダウンロード・設置されることがあります。
一度Webシェルが設置されると、攻撃者はブラウザ経由でいつでもそのサーバに不正アクセスし、OSコマンドを自由に実行できる状態になってしまいます。
被害③:別システムへの攻撃「踏み台」
乗っ取られたサーバは、別のシステムへの攻撃の「踏み台」として悪用されます。
攻撃者は、自らの身元を隠蔽するために、乗っ取ったサーバを中継地点として悪用します。
具体的には、DDoS攻撃の発信源、迷惑メールやフィッシングメールの送信元として使われるケースが多く見られます。
このように、自社が「被害者」であると同時に、意図せず他者への攻撃の「加害者」になってしまう可能性があります。
OSコマンドインジェクションの仕組みと発生原因
OSコマンドインジェクション攻撃がどのような仕組みで成立するのか、その根本的な原因を掘り下げます。
攻撃が成立する仕組みと流れ
OSコマンドインジェクションは、単純な仕組みで成立します。
それは、「ユーザからの入力値を、そのままシェルに渡してOSコマンドを実行してしまう実装」に起因します。
アプリケーション側が「アプリが本来実行したいコマンド」と「ユーザ入力として扱うべき文字列」を分離せず、ひとつのシェルコマンドとして組み立ててしまうことが根本原因です。
攻撃が実行される流れ
- 攻撃者は、Webサイトの入力フォーム(検索窓、問い合わせフォーム、管理画面の機能など)に、OSコマンドを含む不正な文字列(攻撃パターンを含む文字列)を入力し、リクエストを送信します。
- Webアプリケーションは、リクエストされた文字列をユーザ入力として受け取り、
その値を含めたOSコマンド用の文字列(コマンドライン)を組み立てます。
- Webアプリケーションは、その文字列が「不正かもしれない」という検証(サニタイジングやエスケープ処理)を行わずに、そのままシェルに渡します。
- OSへ指示依頼を伝達するシェルは、アプリケーションから渡されたコマンド文字列を「シェルコマンド」として解釈します。
- その結果、攻撃パターンを含むコマンドを受け取ったOSはそれを実行します。
攻撃が成功する鍵は、セミコロン「;」やパイプ「|」などのメタ文字の悪用にあります。シェル(OSのコマンドインタプリタ)において、「;」は複数のコマンドを順次実行、「|」は前のコマンドの出力を次のコマンドの入力として渡す、「&」はコマンドをバックグラウンドで実行する、といった特別な意味を持ちます。
攻撃者はこれらのメタ文字を巧妙に利用して、本来の処理に不正なコマンドを追加実行させるのです。
発生原因①:危険な関数の使用
根本的な原因の一つは、Webアプリケーションの設計段階で、OSのシェルを呼び出す機能を持つ関数を安易に使用している点にあります。
例えば、以下のようにプログラミング言語にはOSコマンドを直接実行できる関数が用意されています。
- PHP: system(), exec(), passthru(), shell_exec()
- Perl: open() (特定の記述法), system(), exec()
- Python: os.system()
これらの関数を使用すること自体が即座に脆弱性となるわけではありません。
しかし、これらの関数はシェルを介してコマンドを実行するものが多く、シェルがメタ文字を解釈してしまうため、OSコマンドインジェクションの温床となります。
発生原因②:入力値の検証不足
もう一つの重大な原因は、ユーザからの入力値を検証せず「そのまま」OSコマンドの引数として受け渡してしまうことです。
ここでは以下のようなPHPのコードを例にします。
$keyword = $_GET[‘keyword’];
> system(”grep ” . $keyword . ” /var/log/access.log”)
このコードでは、keywordパラメータの値が何も検証されずに、grepコマンドの引数として使用されています。
攻撃者がメタ文字「;」を悪用し、keywordに「test; rm -rf /」と入力するとアプリケーションが組み立てるコマンドは「grep test; rm -rf / /var/log/access.log」 のようになります。
シェルは「;」を区切りとして解釈するため、「rm -rf /」が独立したコマンドとして実行されます。
そして、ルートディレクトリ(/)から再帰的に削除する危険なコマンドが実行され、システム全体が破壊される危険につながります。
これが「入力値の検証不足」が引き起こすOSコマンドインジェクションの仕組みです。
OSコマンドインジェクションの国内被害事例
ここでは、過去に日本国内で発生した深刻な被害事例を紹介します。
OSコマンドインジェクションのリスクは、自社で開発したプログラムだけに存在するわけではありません。広く普及しているCMSや、そのプラグインの脆弱性が原因となる事例も多発しています。
2016年、多くの企業が使用していたCMS「Movable Type」の特定プラグイン(XML-RPC API関連)に、OSコマンドインジェクションの脆弱性が存在することが発覚しました。
OSコマンドインジェクションを含む複数の重大な脆弱性が存在し、複数の企業サイトで個人情報の漏えいが発生し、データベース認証情報の窃取による二次被害も発生しました。Movable Typeは日本国内で多くの企業や自治体が採用していたため、潜在的な被害対象が非常に多く、深刻な影響を及ぼしました。
CMSプラグイン(Movable Type)からの大規模情報漏えい
OSコマンドインジェクションのリスクは、自社で開発したプログラムだけに存在するわけではありません。広く普及しているCMSや、そのプラグインの脆弱性が原因となる事例も多発しています。
2016年、多くの企業が使用していたCMS「Movable Type」の特定プラグイン(XML-RPC API関連)に、OSコマンドインジェクションの脆弱性が存在することが発覚しました。
OSコマンドインジェクションを含む複数の重大な脆弱性が存在し、複数の企業サイトで個人情報の漏えいが発生し、データベース認証情報の窃取による二次被害も発生しました。Movable Typeは日本国内で多くの企業や自治体が採用していたため、潜在的な被害対象が非常に多く、深刻な影響を及ぼしました。
ネットワーク機器(無線LANルータ)の乗っ取り
OSコマンドインジェクションのリスクは、Webサイトだけに限りません。Webブラウザで設定を行う管理画面を持つすべての機器が攻撃対象となり得ます。
2017年には、国内メーカー製の複数の家庭用・法人用無線LANルーターの管理画面に、OSコマンドインジェクションの脆弱性が存在することが相次いで公表されました。
これらの事例の多くは、管理画面のログイン後の特定の機能(ネットワーク診断機能など)において、ユーザの入力値の検証や適切なエスケープ処理が不十分だったことが原因でした。
OSコマンドインジェクションへの網羅的な4つの対策
先ほどの事例のように、使用しているサードパーティ製のソフトウェアに脆弱性が潜んでいる場合、自社でコードを修正することは困難です。そのため、安全なWebアプリケーションを運用するために重要なのは、多層的な対策です。
対策①:危険な関数の使用を避ける
OSコマンドインジェクションの発生自体を防ぐ最も確実な防御策は、そもそもOSコマンドを実行する危険な関数を使用しないことです。これは脆弱性を発生させない設計レベルの対策です。
OSコマンドを呼び出している処理は、そのプログラミング言語が提供する標準の「ライブラリ」や「代替関数」で、より安全に実装できることがほとんどです。
対策②:エスケープ処理の徹底
業務要件(例えば、特定のコマンドラインツールをどうしても実行する必要がある)などで、やむを得ずOSコマンドを呼び出す関数を使用する場合は、入力値のエスケープ処理を徹底することが重要です。
エスケープ処理とは、「”」「;」「 | 」 といったシェルにとって特別な意味を持つメタ文字を、単なる文字列として扱われるように無害化する処理です。
対策③:WAFによる不正な「リクエスト」の遮断
対策①②は、アプリケーション開発者による「実装」レベルの対策です。
しかし、人間が開発する以上、対策漏れやミスは起こり得ます。また、Movable Typeの事例のように、使用しているサードパーティ製のソフトウェアに脆弱性が潜んでいる場合、自社でコードを修正することは困難です。
そこで非常に有効な防御対策となるのが、「WAF(Web Application Firewall:ワフ)」の導入です。
WAFは、WebアプリケーションとWebサーバの間に設置され、サーバに到達するすべてのhttp / https通信を監視し、不正なリクエストを遮断します。
例えば、OSコマンドインジェクション特有の攻撃パターン( 「;」「 |」「 &」「/etc/passwd」 といった不正な記号文字)を検知すると、そのリクエストを「攻撃である」と判断し、アプリケーションに到達する前に自動的に遮断します。
これにより、万が一アプリケーション自体に脆弱性が残っていたとしても、攻撃を防ぐことが可能になります。
WAFのメリットは、アプリケーション側の実装ミスをカバーする多層防御の実現、アプリケーションのソースコード変更なしに導入可能であることです。
また、未知の脆弱性(ゼロデイ脆弱性)への一定の防御、攻撃の可視化などが挙げられます。特に、クラウド型WAF(SaaS)は、DNS設定を変更するだけで導入でき、運用負荷が低いため中小企業に最適です。
月額1万円から始める、クラウド型WAF「攻撃遮断くん」
攻撃遮断くんはレンタルサーバ、クラウド、オンプレミス環境などあらゆる環境に導入できるクラウド型WAFです。20,000サイト以上の導入実績をもち、サイト種別を問わずに導入されています。
攻撃遮断くんはOSコマンドインジェクションを始めとしたWebサイトを狙ったサイバー攻撃を防ぐことが可能です。
セキュリティ対策を検討されている方向けに、攻撃遮断くんについてコンパクトにまとめた資料をご用意しました。
情報収集にお役立ちできる資料となっておりますので、ぜひご活用ください!
【無料】クラウド型WAF「攻撃遮断くん」 資料をダウンロードする
対策④:定期的な診断の実施
対策①②による実装に不備がないか、WAFで守れていない想定外の脆弱性はないか、などを開発者自身が完璧に把握し続けることは困難です。
そこで重要なのが、第三者による定期的な脆弱性診断です。
株式会社サイバーセキュリティクラウドは脆弱性診断も提供しています。
年に1回など、定期的な脆弱性診断の実施がサイバー攻撃のつけ入る隙を見逃さない対策になります。
まとめ
本記事では、OSコマンドインジェクションの深刻なリスク(情報漏えい、改ざん、乗っ取り、踏み台化)、その仕組みと原因(危険な関数の使用、エスケープ処理不足)、そして国内事例と網羅的な対策について解説しました。
この攻撃を防ぐには、単一の対策に頼るのではなく、
- 【実装】 危険な関数を避け、エスケープ処理を徹底する
- 【防御】 WAFを導入し、不正なリクエストを遮断する
- 【検知】 定期的な脆弱性診断で、潜在的なリスクを発見する
といった多層的な取り組みが揃って初めて、安全な状態を保つことが可能となります。
そこで、多くの企業が運用やセキュリティ強化の目的で導入しているツールが記事でも登場したWAFです。
クラウド型WAFの攻撃遮断くんは月額1万円から導入でき、リソースの少ない中小企業様をはじめ、20,000サイト以上に導入されております。
OSコマンドインジェクションをはじめとして、Webサイトへのサイバー攻撃を広範囲に対策可能です。
攻撃遮断くんのサービス概要をコンパクトにまとめた資料をご用意しましたので、ぜひご活用ください。