ブログ

コーダーのためのセキュリティ攻略:共有&学習シリーズ - OSコマンドインジェクション

February 7, 2019
Jaap Karan Singh

OSコマンドインジェクション攻撃は、アプリケーションがユーザーからの入力をシェルに渡す際、その入力文字列が妥当であるかを確認する措置を講じていない場合に発生します。これにより、攻撃者はアプリケーションをホストしているオペレーティングシステムに対して直接コマンドを送り込むことが可能となり、そのアプリケーションに設定された権限レベルで任意の操作を実行できてしまいます。  

OSコマンドインジェクション攻撃は、初心者やスキルの低いハッカーでも実行可能なため、セキュリティチームが直面する最も一般的な脆弱性の1つとなっています。幸いなことに、こうした攻撃を効果的に防ぐ方法はいくつも存在します。本エピソードでは、以下の内容を学びます。

       攻撃の仕組み

       なぜ危険なのか

       攻撃を阻止するための防御策

攻撃者はどのようにOSコマンドインジェクションを利用するのか?

攻撃者がOSコマンドインジェクション攻撃を開始するために最初に行うことは、アプリケーション内のユーザー入力箇所を特定することです。ユーザーが記入するフォームは、攻撃の足がかりとして格好の標的となります。さらに巧妙な攻撃者は、ほぼすべてのアプリケーションやウェブサイトで使用されているCookieやHTTPヘッダーなどを攻撃の起点として利用することもあります。

次に、攻撃者はアプリケーションをホストしているオペレーティングシステムを特定する必要があります。選択肢は限られているため、この段階では試行錯誤で十分対応可能です。ほとんどのアプリケーションサーバーは、Windowsベース(Windowsの種類は通常問いません)、Linux、あるいはUnixのいずれかです。

その時点で、ハッカーは入力を改ざんし、一見無害な入力の中にオペレーティングシステムのコマンドを注入します。これにより、ホストOSを騙し、アプリケーションが持つ権限レベルで意図しないコマンドを実行させることが可能になります。

例えば、アプリケーション内の正規ユーザーがファイルの内容(この場合は月例役員会議の議事録)を確認するために、以下のコマンドを使用するとします。

exec("cat " + filename)

この例では、以下のコマンドが実行され、会議の議事録がユーザーに返されます。

$ ./cat MeetingNotes.txt
7月の会議には執行委員会のメンバー3名が出席しました。新しい予算プロジェクトについて議論されましたが、決定事項や投票は行われませんでした。

攻撃者が入力の末尾にLinuxのディレクトリ内容を表示するコマンドなどを追加すると、以下のような事態が発生します。この場合、本来のコマンドである議事録の表示は行われますが、同時に悪意のあるユーザーに対してディレクトリ内のすべてのファイルがさらされ、次のOSコマンドインジェクション攻撃でどのようなコマンドが使用可能かまで知られてしまいます。攻撃者は次のように入力します。

$ ./cat MeetingNotes.txt && ls

代わりにこちらをご覧ください:

7月の会議には執行委員会のメンバー3名が出席しました。新しい予算プロジェクトについて議論されましたが、決定事項や投票は行われませんでした。

MeetingNotes.txt
JuneMeetingNotes.txt
MayMeetingNotes.txt
format.c
misnull.c
notefault.c
trunc.c
writewhatwhere.c

ご覧の通り、このケースではハッカーにディレクトリの内容が表示されただけでなく、ホストOS上で実行可能な他のコマンドメニューまで提供されてしまいました。

OSコマンドインジェクション攻撃が危険な理由

ユーザーがアプリケーションの本来の目的を回避し、OSコマンドを実行できるようにすることは極めて危険です。攻撃者は、機密データの窃取やサーバードライブの全フォーマットといった壊滅的な操作を容易に行うことができます。攻撃者が利用できる選択肢は、OSで許可されているコマンドと、それを悪用する攻撃者の創意工夫次第です。

OSコマンドは、アプリケーションと同じ権限レベルで実行されます。管理者権限で実行されているアプリケーションが侵害されると、ハッカーはあらゆるOSコマンドを実行できてしまいます。

OSコマンドインジェクションの攻撃パターンは広く知られており、文書化されています。脆弱なアプリケーションは、プロのハッカーだけでなく、スクリプトキディ(知識の浅い攻撃者)の標的にもなり得ます。スキルが低い攻撃者でも、OSコマンドをコピー&ペーストしてアプリケーションに入力し、何が起こるか試すことができてしまいます。

OSコマンドインジェクションに対するセキュリティ対策

OSコマンドインジェクションを防ぐための優れた手法はいくつかあります。第一歩として、アプリケーションは機能を実行するために必要な最小限の権限で実行してください。これは攻撃そのものを防ぐわけではありませんが、万が一侵害された場合の被害を最小限に抑えることができます。

ほとんどのプログラミング言語やフレームワークには、ディレクトリ内容のリスト表示やハードディスク上のファイルの作成・読み取りといった一般的なOS操作のためのAPIが用意されています。OSコマンドインジェクションを排除する最善の方法は、OSコマンドを直接呼び出すのではなく、これらのAPIを使用することです。

それが不可能な場合は、OSコマンドで使用する前にユーザー入力を検証してください。ホワイトリストを使用すれば、信頼できる少数の値のみを許可できます。ブラックリストを使用することも技術的には可能ですが、許可されるコマンドの方が圧倒的に少ないため、ホワイトリストの方がはるかに簡単です。POSTやGETパラメータだけでなく、見落とされがちなCookieなどの入力ベクトルもホワイトリストに含めることを忘れないでください。

最後に、プログラミングAPIが利用できず、ホワイトリストも使用できない場合は、サニタイズライブラリを使用して、OSコマンドで使用する前にユーザー入力内の特殊文字をエスケープしてください。

OSコマンドインジェクション攻撃に関する詳細情報

詳細については、OWASPによるOSコマンドインジェクション攻撃の解説をご覧ください。また、サイバーセキュリティチームを育成するSecure Code Warriorプラットフォームの無料デモで、学んだ防御知識を試すこともできます。この脆弱性やその他の脅威への対策については、をご覧ください。

タグライン

AI主導の開発をリリース前にガバナンスする

AIを活用したリスク測定、コミット時のセキュアコーディングポリシーの強制、そしてSDLC全体を通じたセキュアなデリバリーの加速を実現します。

デモを予約する
リソースライブラリ

他のブログ記事を見る

セキュアコーディング、AIガバナンス、ソフトウェアリスク管理に関する専門的なコンテンツをご覧ください。

すべて表示
導入事例
フィルターラベル
これはdivブロック内のテキストです。

Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

詳細はこちら
導入事例
フィルターラベル
これはdivブロック内のテキストです。

Security as culture: How Blue Prism cultivates world-class secure developers

Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed

詳細はこちら
導入事例
フィルターラベル
これはdivブロック内のテキストです。

セキュリティ文化の統一:Sageはいかにしてチャンピオンプログラムを構築したか

Sageがどのようにして柔軟かつ関係性を重視したアプローチでセキュリティを強化し、200名以上のセキュリティチャンピオンを育成して、目に見えるリスク低減を実現したのかをご紹介します。

詳細はこちら
ブログ
フィルターラベル
これはdivブロック内のテキストです。

2026年サイバーセキュリティ意識向上月間:企業防衛に不可欠なAIセキュリティの理解

主要なAI企業の多くが、安全対策が追いつくまでの間、AI開発を世界的に減速させるよう公に呼びかける事態となっています。しかし現実には、深刻なセキュリティ問題はすでに顕在化しています。AI導入に伴う金銭的コストやリスクが増大し続ける中、多くのセキュリティリーダーや経営陣は差し迫った状況に追い込まれています。

詳細はこちら
ブログ
フィルターラベル
これはdivブロック内のテキストです。

イネーブラー8:プログラムのブランディング

セキュアコーディングプログラムを成功させるには、優れたコンテンツ以上のものが必要です。イネーブラー8では、ブランディングによって参加を「憧れのステータスを得る体験」へと変える方法を解説します。

詳細はこちら
ブログ
フィルターラベル
これはdivブロック内のテキストです。

すべての従業員が今、AIサイバーセキュリティの最前線に立っている

エンタープライズテクノロジーの状況は、手遅れになるまで誰も予測できなかったほどの速さで変化しています。私たちは今、人間が書いたコードと基本的なコパイロット支援の時代から、エージェント型開発ライフサイクル(ADLC)の時代へと正式に足を踏み入れました。自律型AIエージェントは、複数の機能にわたってかつてない効率性をもたらす一方で、全く新しい種類のセキュリティリスクや規制リスクも引き起こしています。

詳細はこちら

AIを活用した開発をリリース前にセキュアに

開発者のリスクを可視化し、ポリシーを適用することで、ソフトウェア開発ライフサイクル全体における脆弱性を未然に防ぎます。

デモを予約する
該当する項目が見つかりません。