実演動画あり!コード・インジェクションとは?

コード・インジェクションとは?

プログラム⾔語は⼤きく分けてコンパイル型プログラム⾔語とインタプリタ型プログラム⾔語の2種類に⼤別できます。前者のコンパイル型⾔語はC⾔語やJava⾔語などに代表されるようにプログラムのソースコードをコンパイルして実⾏可能ファイルに変換しておくのに対して、後者のインタプリタ型⾔語はPHPやPythonなどに代表されるように、プログラムを実⾏する場合に実⾏可能ファイルに変換せずに、ソースコードを1⾏1⾏、実⾏時に解釈して処理していきます。

ここで解説するコード・インジェクション脆弱性は、主にインタプリタ⾔語を⽤いてWebアプリケーションを開発している場合に発⽣する問題で、本脆弱性が存在した場合、任意のプログラムコードが実⾏できるため、Webアプリケーションを経由して基盤であるWebサーバーの制御が奪われる危険性があります。

また、このコード・インジェクション脆弱性をつく攻撃は能動的攻撃に分類されるため、攻撃者に気づかれた場合にダイレクトに攻撃を受ける恐れがあります。その上で前述したように問題のあるWebアプリケーションがインストールされている Webサーバーの制御を奪われる恐れがあるため、⾮常にリスクの⾼い脆弱性と⾔えます。

コード・インジェクション攻撃の仕組み

コード・インジェクション攻撃は以下の条件のように、外部⼊⼒の値をプログラムとして評価していることが原因で発⽣します。

【コード・インジェクションが発⽣する条件】

  • 外部⼊⼒に基づいてサーバーサイドのプログラムコードを作成している
  • evalなどのメソッドを使って外部⼊⼒をサーバーサイドプログラムとして評価している
  • 外部⼊⼒をもとにサーバーサイドのテンプレートエンジンなどで値を評価している

以下は外部⼊⼒の値をPHPプログラムコードとして評価している場合の攻撃の概要です。

コード・インジェクション攻撃の概要

  1. 攻撃者はPHPプログラムコードとして成⽴する⽂字列を含んだHTTPリクエストを送信する
  2. 問題のあるWebアプリケーションでは、攻撃者が指定した⽂字列をPHPプログラムコードとして評価して実⾏してしまう
  3. 2.の処理の結果、攻撃者が指定したプログラムが実⾏された結果の応答がされる

なお、応答については攻撃者の指定したプログラムコードの内容によってさまざまに変化します。

被害事例

コード・インジェクションが原因で実例に⾄ったという報告はあまりありませんが、下記のように世界的に著名なWebサービス上に問題が存在したことが報告されています。

Uber Eatsでの事例

2016年にUber Eatsの配送を確認する処理において、テンプレートエンジンを介してコードを実⾏できるコード・インジェクションの脆弱性が発⾒されました。この問題はインシデントが発⽣する前に発⾒されたため、被害は出ませんでしたが、問題を検出してUber Eatsに報告した⼈物は、同社から報奨⾦を受けとっています。

脆弱性の解説動画

コード・インジェクションが起こる原因

インタプリタ型のプログラム⾔語は1⾏1⾏を都度、コンピューターに対する命令データに置き換えて実⾏していきます。この過程で外部⼊⼒のデータを同じように命令データに置き換えてしまうと、コード・インジェクションの問題になります。

また、ネイティブコードとして評価される問題のだけではなく、近年ではMVCモデルを採⽤したフレームワークに含まれるテンプレートエンジンにおいて、プログラムとして評価されるような攻撃が増えてきています。別名、サーバーサイド・テンプレート・インジェクションなどとも呼ばれており、単純な置換処理を⾏うテンプレートエンジンではなく、複雑なロジックを処理できるリッチなテンプレートエンジンが標的になっています。

サーバーサイド・テンプレート・インジェクションの概要

コード・インジェクション攻撃への対策⼿法

必須対策1(外部⼊⼒に依存したプログラム評価をしない)

外部⼊⼒をもとにプログラムを組み⽴てる実装はコード・インジェクション脆弱性を招く恐れがあります。そのため、外部パラメータの値からプログラムを実⾏する処理が本当に必要か検討の上、他の処理⽅法で代価できる場合は、そちらの実装⽅法を採⽤することが望ましいと⾔えます。

必須対策2(バリデーション処理)

必須対策1が実施できない場合に⾏います。Webサイトの仕様上、どうしても外部パラメータからプログラムコードを評価する必要がある場合には、規定のコード以外の⼊⼒の場合に処理を停⽌するようにチェック処理を⾏います。また、チェック処理に合わせてプログラムコード実⾏時にはchrootなどのコマンドを⽤いてルートディレクトリを変更して影響度を下げた上で実⾏することが望ましいと⾔えます。

推奨対策1(テンプレートエンジン)

置換機能のみのシンプルなテンプレートエンジンを使⽤します。複雑なロジックを記述できるテンプレートエンジンを⽤いた場合と⽐べてコード・インジェクション脆弱性が混⼊する確率を下げることができます。

オプショナルな対策1(WAFの導⼊)

Webアプリケーションファイアーウォール(WAF)を導⼊して、Webサイトを保護する⽅法です。この⽅法は⼀定の防御効果が⾒込めますが、製品を導⼊・運⽤していくのに費⽤が掛かることに加えて、他の脆弱性と同様にすべてのコード・インジェクション攻撃を防御することができません。そのため、あくまで前述した対策が実施できない場合などに代価案として実施することが望ましい対策と⾔えます。

まずは手軽にツールで脆弱性診断

上述の対策⼿法が重要となる⼀⽅で、脆弱性が混⼊されていないかを検知する事も重要となります。そのためには脆弱性診断を受診する必要があり、コード・インジェクションの脆弱性についても脆弱性診断を通じて発⾒する事が出来ます。

脆弱性診断とは何かについて詳しく知りたい⽅は脆弱性診断とは(エンジニア向け)脆弱性診断とは(⾮エンジニア向け)もぜひご参照ください。

脆弱性診断ツール「Securify Scan」では、コード・インジェクションの脆弱性検知も対応しております。脆弱性検知やセキュリティレベルを強化したい企業様はぜひ弊社の脆弱性診断ツール「Securify Scan」を活⽤ください。

無償でのトライアル実施も⾏っておりますので、お気軽にお問い合わせください。

Webアプリケーションの
継続的セキュリティを簡単に実現
Securify

ブログ一覧へ戻る

サービスに関するご質問・ご相談など
お気軽にお問い合わせください