インジェクション攻撃(インジェクションこうげき、英: Injection attack、または Code injection)とは、コンピュータプログラムが無効なデータを処理した場合に出現するバグを、攻撃者が悪用し不正な命令を実行する攻撃手法である。攻撃者は脆弱性のあるプログラムにソースコードを注入(インジェクト)し、実行過程に変更を加える[1][2][3]。インジェクション攻撃が成功した場合、例えばワームの増殖のような、深刻な被害を受けることがある。
コードインジェクション脆弱性(インジェクションフロー)は、アプリケーションがインタプリタへ信頼できないデータを送信する場合に生じる。SQL、 LDAP、XPath、NoSQLの問い合わせ、 オペレーティングシステム (OS) のコマンド、XMLの構文解析、SMTPヘッダ、プログラム引数などで最も頻繁に見られる。インジェクションフローはソフトウェアテストよりもソースコード診断[訳語疑問点]の工程で見つけやすい傾向にある[4]。脆弱性検査ツールやファジングが脆弱性発見に役立つこともある[5]。
インジェクション攻撃により、データの損失や改変、責任追跡性の欠如、DoS攻撃などが生じる。時にホストの完全な乗っ取りが起こることもある。
特定の種類のインジェクション攻撃では、単なるユーザ入力に特別な意味を付与してしまい、入力データの解釈に失敗する。このような解釈ミスはWho's on First?のコメディーのように情報科学の世界以外でも見られる。Who's on First?では、固有名詞と一般名詞を区別することに失敗する。同様に、ある種のインジェクション攻撃では、ユーザ入力とシステム命令の区別に失敗する。
インジェクション攻撃の技術は、情報取得のためのハッキング(クラッキング)や特権昇格攻撃、システムへの不正アクセスにおいて広く用いられている。
インジェクション攻撃は悪意を伴う多くの目的に用いられ、次のような例が挙げられる。
2008年に報告された全ての脆弱性のうち5.66%がインジェクション攻撃に分類されており、記録上最も大きい割合であった。2015年にはこの割合は0.77%へと減少した[6]。
コードインジェクションは健全な目的にも用いられる。例えば、コードインジェクションによりプログラムやシステムの動作を変更したり微調整したりすることで、悪意のない特定の動作をするようにシステムを「だます」ことができる[7][8]。 具体例として
といったことが挙げられる[要出典]。
プログラムへの入力がシステム開発者の想定外であるために、ユーザが疑いなくコードインジェクションを行ってしまうことがある。 次のような具体例が挙げられる。
別の有益な利用法としては、脆弱性を修正する目的でのコードインジェクション脆弱性の発見が挙げられるだろう。 このような手法はホワイトハットペネトレーションテストとして知られる。
インジェクション攻撃を防ぐために、以下に挙げるような安全な入出力処理をする必要がある。
htmlspecialchars()
関数によりHTMLにおけるテキスト中の特別な文字を安全な出力にエスケープしたり、mysqli::real_escape_string()
関数によりSQLリクエストに含まれるであろうデータを分離しSQLインジェクションを防いだりする。HttpOnly
フラグを立てるとクライアントサイドのスクリプトはHTTP cookieの情報にアクセスできなくなり、ある種のXSS攻撃を防ぐことができる[10]。上述の解決策は主にウェブのHTMLやスクリプトからサーバサイドアプリケーションへのコードインジェクションについてのものである。 しかし、権限昇格攻撃を引き起こすような、計算機上におけるユーザのコードによるインジェクション攻撃を取り扱うには、別のアプローチが必要である。 管理されたあるいは管理されていない[訳語疑問点]インジェクション攻撃を検知・隔離するためのアプローチには次のようなものがある。