Coders Conquer Security:シェアして学ぼうシリーズ - コードインジェクション

2019年5月16日発行
ジャープ・カラン・シン著
ケーススタディ

Coders Conquer Security:シェアして学ぼうシリーズ - コードインジェクション

2019年5月16日発行
ジャープ・カラン・シン著
リソースを見る
リソースを見る

コードインジェクション攻撃は、多くのWebサイトやアプリケーションが遭遇する最も一般的な攻撃であり、また最も危険な攻撃でもあります。コードインジェクション攻撃は、その巧妙さと危険性の両面で様々な種類がありますが、ユーザーの入力を受け付けるサイトやアプリケーションであれば、ほぼすべてのものが脆弱になる可能性があります。実際、この種の攻撃は、ほとんどすべてのサイバーセキュリティ担当者がキャリアの中でいつかは対処しなければならないものであり、おそらく何度も対処することになるでしょう。

コードインジェクション攻撃は、アプリケーションやWebサイトがユーザーからの入力を受け付ける際に発生します。これは、検索機能を提供したり、ユーザーに識別情報の入力を求めたりするような単純なものです。この攻撃は、悪意のあるユーザーが、通常のテキスト入力ではなく、開いているフィールドにコードを入力することで起こります。攻撃者の目的は、サーバーに入力されたコードを有効なコードと勘違いさせ、攻撃者が望むあらゆる機能を実行させることです。

コード・インジェクション攻撃は非常に一般的なものですが、それを阻止するために利用可能な防御策もあります。このエピソードでは、以下のことを学びます。

  • 仕組み
  • なぜ彼らは危険なのか
  • それを阻止するためには、どのような防御策を講じるべきか。

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

コード・インジェクション攻撃の具体的な内容は、使用するプログラミング言語によって変わりますが、ユーザーにデータを入力させるアプリやWebサイトであれば、どのようなものでも脆弱になり得ます。コード・インジェクション攻撃は、SQL、HTML、XML、CSSなど、あらゆる一般的なプログラミング言語で引き起こされています。

まず、攻撃者はアプリケーション内で脆弱なコードを見つけなければなりません。通常、ユーザーが自分で入力することが許されている箇所です。例えば、このコードは、PHPのeval()関数を受け取り、それをユーザーに渡して変更させますが、その際、戻り値の文字列については何の検証も行いません。

$myvar = "varname";
$x = $_GET[arg];
eval("˶‾᷅˵‾᷄˵‾᷅˵")

巧妙な攻撃者は、独自の文字列をeval関数に簡単に追加でき、選択次第ではシステムコマンドを実行することも可能です。

/index.php?arg=1; system(id)

コード・インジェクション攻撃では、システム・コマンドを送信することもありますが、それだけに限定されないことに注意してください。実際、コード・インジェクション攻撃では、ハッカーは言語自体の機能によってのみ制限されます。今回の例では、攻撃者は対象となるシステムに、PHPフレームワークで許可されているほぼすべての機能をプログラムすることができます。

コードインジェクション攻撃はなぜ危険なのか?

コードインジェクション攻撃は、攻撃者の技量によっては非常に危険なものになる可能性があります。攻撃者は、プログラミング言語で許可されていることなら何でもできるため、アプリのプログラマーと同じ立場になることができます。攻撃者は事実上、自分自身のアプリを作成し、それをターゲット環境で実行させることができます。

熟練度の低い攻撃者であっても危険です。自分でアプリケーションやコードを書くのではなく、対象となるシステムにあらかじめプログラムされたマルウェアを受け入れさせ、インストールさせることができるのです。これは、サイトの改ざんやランサムウェアの攻撃につながるだけでなく、サイトのユーザーを狙ったフィッシングキャンペーンの根拠にもなります。

多くの場合、コードインジェクション攻撃は、ユーザーリストやパスワードなどを盗み出したり、システムをさらに危険にさらすために貴重な偵察を行ったりするために使用されます。しかし、注意していただきたいのは、熟練したコーダーはコードインジェクション攻撃でほとんど何でもできるということです。だからこそ、コードインジェクション攻撃の可能性があるものをすべて発見し、環境から取り除くことが重要なのです。

誰も信じない。少なくとも、ユーザーではない

コード・インジェクション攻撃の脆弱性を排除するために、まず最初に見るべき場所は、ユーザーの入力を要求したり、許可したりする場所です。ユーザーが入力したものは、どのような場合でも信用できません。フィルタリングや検査を行わずにユーザーの入力を許可することは、基本的に攻撃者がシステムやネットワークへの侵入を自由に行えるようにしていることになります。

常に可能とは限りませんが、コード・インジェクション攻撃を阻止する最善の方法は、関数がユーザーの入力を直接実行したり解釈したりしないようにすることです。例えば、ユーザーは自由にクエリを入力できる代わりに、静的な選択肢を与えられ、アプリケーションはそれらの限られた選択肢のみを有効なものとして受け入れるようにプログラムされています。必ずしも適切な方法ではないかもしれませんが、可能な限りこの方法を用いることで、コード・インジェクションが始まる前に排除することができます。

ユーザーが自分で入力する必要がある分野では、そのデータを厳重に管理する必要があります。すべてのものが攻撃の対象になると考えるのは、良いスタート地点です。クライアント側とサーバー側の両方で、ユーザーのアクセスを読み取り専用にするなど、最小権限のポリシーを実施することで、ほとんどのコードの実行を防ぐことができます。

もうひとつの有効な防御策は、アプリケーション全体でフィルターを実装し、ユーザーが入力するものすべてをサニタイズすることです。開発者は何年も前からコード・インジェクション攻撃に気付いており、実績のあるフィルタのライブラリがあらゆるフレームワークや言語に対応しています。これらのフィルタを適用する際には、明らかなユーザ入力領域や、GetやPostコマンドのような一般的なパラメータに対してだけでなく、CookieやHTTPヘッダに対してもフィルタを適用するようにしてください。

コードインジェクションの修正の適用

不必要なユーザー入力領域を環境から削除し、最小権限主義を徹底し、最新のフィルタリング・サニタイズツールを使用して潜在的な攻撃を検査・検出することで、この危険な脆弱性の扉を閉めることができます。また、ユーザーの入力を決して信用しないという考え方を持つことも、今後の活動に役立ちます。このようにして、この危険なタイプの攻撃の一歩先を行くことができるのです。

さらに詳しく知りたい方は、コードインジェクションに関するOWASPの記事をご参照ください。また、サイバーセキュリティチームを究極のサイバー戦士に育成するSecure Code Warrior プラットフォームの無料デモで、新たに得た防御の知識を試すこともできます。この脆弱性やその他の脅威の対策についての詳細は、Secure Code Warrior ブログをご覧ください。

今すぐコードインジェクションに真正面から向き合う。ゲーム化されたトレーニングプラットフォームでチャレンジしてみましょう。 [Start Here] (ここからスタート)

リソースを見る
リソースを見る

著者

Jaap Karan Singh

もっと知りたい?

セキュアコーディングに関する最新の知見をブログでご紹介しています。

当社の豊富なリソースライブラリは、安全なコーディングアップスキルに対する人間的なアプローチを強化することを目的としています。

ブログを見る
もっと知りたい?

開発者主導のセキュリティに関する最新の研究成果を入手する

ホワイトペーパーからウェビナーまで、開発者主導のセキュアコーディングを始めるために役立つリソースが満載のリソースライブラリです。今すぐご覧ください。

リソース・ハブ

Coders Conquer Security:シェアして学ぼうシリーズ - コードインジェクション

2019年5月16日発行
Jaap Karan Singh著

コードインジェクション攻撃は、多くのWebサイトやアプリケーションが遭遇する最も一般的な攻撃であり、また最も危険な攻撃でもあります。コードインジェクション攻撃は、その巧妙さと危険性の両面で様々な種類がありますが、ユーザーの入力を受け付けるサイトやアプリケーションであれば、ほぼすべてのものが脆弱になる可能性があります。実際、この種の攻撃は、ほとんどすべてのサイバーセキュリティ担当者がキャリアの中でいつかは対処しなければならないものであり、おそらく何度も対処することになるでしょう。

コードインジェクション攻撃は、アプリケーションやWebサイトがユーザーからの入力を受け付ける際に発生します。これは、検索機能を提供したり、ユーザーに識別情報の入力を求めたりするような単純なものです。この攻撃は、悪意のあるユーザーが、通常のテキスト入力ではなく、開いているフィールドにコードを入力することで起こります。攻撃者の目的は、サーバーに入力されたコードを有効なコードと勘違いさせ、攻撃者が望むあらゆる機能を実行させることです。

コード・インジェクション攻撃は非常に一般的なものですが、それを阻止するために利用可能な防御策もあります。このエピソードでは、以下のことを学びます。

  • 仕組み
  • なぜ彼らは危険なのか
  • それを阻止するためには、どのような防御策を講じるべきか。

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

コード・インジェクション攻撃の具体的な内容は、使用するプログラミング言語によって変わりますが、ユーザーにデータを入力させるアプリやWebサイトであれば、どのようなものでも脆弱になり得ます。コード・インジェクション攻撃は、SQL、HTML、XML、CSSなど、あらゆる一般的なプログラミング言語で引き起こされています。

まず、攻撃者はアプリケーション内で脆弱なコードを見つけなければなりません。通常、ユーザーが自分で入力することが許されている箇所です。例えば、このコードは、PHPのeval()関数を受け取り、それをユーザーに渡して変更させますが、その際、戻り値の文字列については何の検証も行いません。

$myvar = "varname";
$x = $_GET[arg];
eval("˶‾᷅˵‾᷄˵‾᷅˵")

巧妙な攻撃者は、独自の文字列をeval関数に簡単に追加でき、選択次第ではシステムコマンドを実行することも可能です。

/index.php?arg=1; system(id)

コード・インジェクション攻撃では、システム・コマンドを送信することもありますが、それだけに限定されないことに注意してください。実際、コード・インジェクション攻撃では、ハッカーは言語自体の機能によってのみ制限されます。今回の例では、攻撃者は対象となるシステムに、PHPフレームワークで許可されているほぼすべての機能をプログラムすることができます。

コードインジェクション攻撃はなぜ危険なのか?

コードインジェクション攻撃は、攻撃者の技量によっては非常に危険なものになる可能性があります。攻撃者は、プログラミング言語で許可されていることなら何でもできるため、アプリのプログラマーと同じ立場になることができます。攻撃者は事実上、自分自身のアプリを作成し、それをターゲット環境で実行させることができます。

熟練度の低い攻撃者であっても危険です。自分でアプリケーションやコードを書くのではなく、対象となるシステムにあらかじめプログラムされたマルウェアを受け入れさせ、インストールさせることができるのです。これは、サイトの改ざんやランサムウェアの攻撃につながるだけでなく、サイトのユーザーを狙ったフィッシングキャンペーンの根拠にもなります。

多くの場合、コードインジェクション攻撃は、ユーザーリストやパスワードなどを盗み出したり、システムをさらに危険にさらすために貴重な偵察を行ったりするために使用されます。しかし、注意していただきたいのは、熟練したコーダーはコードインジェクション攻撃でほとんど何でもできるということです。だからこそ、コードインジェクション攻撃の可能性があるものをすべて発見し、環境から取り除くことが重要なのです。

誰も信じない。少なくとも、ユーザーではない

コード・インジェクション攻撃の脆弱性を排除するために、まず最初に見るべき場所は、ユーザーの入力を要求したり、許可したりする場所です。ユーザーが入力したものは、どのような場合でも信用できません。フィルタリングや検査を行わずにユーザーの入力を許可することは、基本的に攻撃者がシステムやネットワークへの侵入を自由に行えるようにしていることになります。

常に可能とは限りませんが、コード・インジェクション攻撃を阻止する最善の方法は、関数がユーザーの入力を直接実行したり解釈したりしないようにすることです。例えば、ユーザーは自由にクエリを入力できる代わりに、静的な選択肢を与えられ、アプリケーションはそれらの限られた選択肢のみを有効なものとして受け入れるようにプログラムされています。必ずしも適切な方法ではないかもしれませんが、可能な限りこの方法を用いることで、コード・インジェクションが始まる前に排除することができます。

ユーザーが自分で入力する必要がある分野では、そのデータを厳重に管理する必要があります。すべてのものが攻撃の対象になると考えるのは、良いスタート地点です。クライアント側とサーバー側の両方で、ユーザーのアクセスを読み取り専用にするなど、最小権限のポリシーを実施することで、ほとんどのコードの実行を防ぐことができます。

もうひとつの有効な防御策は、アプリケーション全体でフィルターを実装し、ユーザーが入力するものすべてをサニタイズすることです。開発者は何年も前からコード・インジェクション攻撃に気付いており、実績のあるフィルタのライブラリがあらゆるフレームワークや言語に対応しています。これらのフィルタを適用する際には、明らかなユーザ入力領域や、GetやPostコマンドのような一般的なパラメータに対してだけでなく、CookieやHTTPヘッダに対してもフィルタを適用するようにしてください。

コードインジェクションの修正の適用

不必要なユーザー入力領域を環境から削除し、最小権限主義を徹底し、最新のフィルタリング・サニタイズツールを使用して潜在的な攻撃を検査・検出することで、この危険な脆弱性の扉を閉めることができます。また、ユーザーの入力を決して信用しないという考え方を持つことも、今後の活動に役立ちます。このようにして、この危険なタイプの攻撃の一歩先を行くことができるのです。

さらに詳しく知りたい方は、コードインジェクションに関するOWASPの記事をご参照ください。また、サイバーセキュリティチームを究極のサイバー戦士に育成するSecure Code Warrior プラットフォームの無料デモで、新たに得た防御の知識を試すこともできます。この脆弱性やその他の脅威の対策についての詳細は、Secure Code Warrior ブログをご覧ください。

今すぐコードインジェクションに真正面から向き合う。ゲーム化されたトレーニングプラットフォームでチャレンジしてみましょう。 [Start Here] (ここからスタート)

弊社製品や関連するセキュアコーディングのトピックに関する情報をお送りする許可をお願いします。当社は、お客様の個人情報を細心の注意を払って取り扱い、マーケティング目的で他社に販売することは決してありません。

送信
フォームを送信するには、「Analytics」のCookieを有効にしてください。完了したら、再度無効にしてください。