インジェクション攻撃

インジェクション攻撃とは



インジェクション攻撃(Injection attack)は、コンピュータプログラムの脆弱性を悪用するサイバー攻撃の一種です。攻撃者は、プログラムが無効なデータを処理する際に生じるバグを利用し、不正な命令を実行します。この攻撃手法では、脆弱性のあるプログラムに悪意のあるコードを注入(インジェクト)し、プログラムの実行過程を改変します。

インジェクション攻撃が成功した場合、ワームの増殖やマルウェア感染など、システムに深刻な被害をもたらす可能性があります。

インジェクション攻撃の仕組み



インジェクション攻撃は、アプリケーションが信頼できないデータをインタープリタに送信する際に発生します。特に、SQL、LDAP、XPath、NoSQLクエリ、OSコマンド、XML解析、SMTPヘッダ、プログラム引数など、様々な場面で発生する可能性があります。

この脆弱性は、ソフトウェアテストよりもソースコード診断の段階で見つけやすい傾向があります。脆弱性検査ツールやファジングも、脆弱性の発見に役立ちます。

インジェクション攻撃は、データの損失や改ざん、責任追跡性の欠如、DoS攻撃、さらにはホストの完全な乗っ取りに繋がる可能性もあります。

インジェクション攻撃の多様な手法



インジェクション攻撃には、様々な種類があります。

SQLインジェクションデータベース内の任意の値を書き換え、Webサイト改ざんや機密情報漏洩を引き起こします。
スクリプトインジェクション:サーバーにPHPやASPなどのスクリプトを注入し、マルウェアのインストールや悪意のあるコードの実行を可能にします。
特権昇格攻撃:UNIXのSetuidバイナリやWindowsサービスを悪用し、スーパーユーザー権限を奪取します。
クロスサイトスクリプティング(XSS):HTMLやスクリプトを注入し、Webサイトのユーザーを攻撃します。

2008年には、報告された脆弱性のうち5.66%がインジェクション攻撃によるものでしたが、2015年には0.77%に減少しています。これは、セキュリティ対策の進歩によるものと考えられます。

インジェクション攻撃の悪用例



インジェクション攻撃は、ハッキングや特権昇格、システムへの不正アクセスなど、様々な悪意のある目的に利用されます。

データベースの改ざんSQLインジェクションによってデータベース内の情報を不正に変更します。
マルウェアのインストール:スクリプトを注入し、サーバーにマルウェアをインストールします。
システム権限の奪取:特権昇格攻撃により、システムを完全に制御します。
ユーザーへの攻撃:クロスサイトスクリプティングにより、Webサイトの訪問者を攻撃します。

有益な利用例



インジェクション攻撃は、必ずしも悪意のある目的でのみ利用されるわけではありません。例えば、コードインジェクションによって、プログラムやシステムの動作を調整したり、本来の設計にはない機能を追加したりできます。

具体例としては、以下のようなものが挙げられます。

検索結果ページに新しいカラムを追加する。
標準機能では公開されていないデータフィールドを利用して、データのフィルタリングや並べ替えを行う。
オフラインプログラムに、ネットワーク上のリソースへのアクセス機能を追加する。
Linuxの動的リンカを利用して、既存のlibc関数を上書きする。

また、ユーザーが意図せずコードインジェクションを行ってしまうケースもあります。例えば、ユーザーが入力した文字列に、プログラムにとって特別な意味を持つ文字が含まれている場合などが挙げられます。

インジェクション攻撃の予防



インジェクション攻撃を防ぐためには、安全な入出力処理が不可欠です。以下に、具体的な対策を挙げます。

パラメータ化クエリの利用:プリペアドステートメントやバインド変数を使用し、ユーザーデータが解釈・実行されるのを防ぎます。
型システムによる分離:言語間の分離を強制し、不正なデータの混入を防ぎます。
入力バリデーション:既知の適切な値のみをホワイトリスト化し、不正な入力を排除します。
入力のエンコーディング:危険な文字をエスケープし、HTMLやSQLにおける特殊文字を安全に処理します。
出力のエンコーディング:クロスサイトスクリプティング攻撃を防ぐため、出力を適切にエンコードします。
HttpOnlyフラグ:クライアントサイドのスクリプトがHTTP Cookieにアクセスできないようにし、XSS攻撃を抑制します。
シェルのモジュール分離カーネルからシェルを分離し、不正なコマンド実行を防ぎます。

これらの対策は、WebアプリケーションにおけるHTMLやスクリプトからのインジェクション攻撃に対して有効です。しかし、権限昇格攻撃のような、ユーザーのコードによるインジェクション攻撃には、別のアプローチが必要です。

インジェクション攻撃の検知と隔離



管理された、または管理されていないインジェクション攻撃を検知し、隔離するためには、以下のような方法が用いられます。

ランタイムイメージのハッシュ検査:メモリに読み込まれた実行可能イメージのハッシュ値を事前に記憶された値と比較し、改ざんを検知します。
NXビット:ユーザーデータが実行されないように、特別なメモリ領域に保存します。これにより、不正なコードの実行を防ぎます。
カナリア:スタックにランダムな値を配置し、関数が値を返す際に、値が変更されていないかを確認します。スタックオーバーフロー攻撃を検出するのに役立ちます。
Code Pointer Masking(CPM):コードポインタにマスクをかけることで、ポインタが指し示すアドレスを隠蔽し、コードの改ざんを防ぎます。

まとめ



インジェクション攻撃は、様々な手法でシステムに深刻な被害をもたらす可能性があります。これらの攻撃を防ぐためには、安全な入出力処理を徹底することが重要です。この記事で紹介した対策を参考に、システムのセキュリティを強化してください。

参考文献



CWE-74 インジェクション - JVN iPedia 脆弱性対策データベース
CWE-89 SQLインジェクション - JVN iPedia 脆弱性対策データベース
CWE-94 コード・インジェクション - JVN iPedia 脆弱性対策データベース

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。