(57)【要約】【課題】スタックスマッシング攻撃の準備行為の有無を正しく把握することができるプログラム、セキュリティ保護装置およびその方法を提供する。【解決手段】オーバーフロー検知部１０１においてスタックオーバーフローオーバーフローが検知された場合、データ取得部１０２において、このオーバーフローにより書き換えられた結果のデータが取得される。判定部１０３では、データ取得部１０２において取得されたデータに基づいて、スタックオーバーフローが不正データの入力により引き起こされたものであるか否かが判定される。例えば、書き換えを受けた一連のデータの周期性を評価した結果に基づいて、上記の判定が行なわれる。これにより、スタック構造の解析行為のような攻撃準備行為を抑止し、セキュリティ攻撃を未然に防止することができる。【選択図】図２
2005032185.tif 000002
【特許請求の範囲】
【請求項１】
不正なデータの入力によりスタックがオーバーフローを起こし得るコンピュータに、
上記スタックのオーバーフローを検知する第１のステップと、
上記第１のステップにおいて上記オーバーフローが検知された場合、上記オーバーフローによって書き換えられた結果のデータを取得する第２のステップと、
上記第２のステップにおいて取得されたデータに基づいて、上記オーバーフローが上記不正データの入力により引き起こされたものであるか否かを判定する第３のステップと、
を有する処理を実行させるプログラム。
【請求項２】
上記第３のステップにおいて、上記書き換えられた結果の一連のデータの周期性を評価し、当該評価結果に基づいて上記判定を行なう、
請求項１に記載のプログラム。
【請求項３】
上記第２のステップにおいて、上記書き換えを受けたメモリ領域から、アドレス順に並ぶ所定数のデータをデータ列として抽出し、
上記第３のステップは、
上記第２のステップにおいて抽出されたデータ列の相関値を算出する第４のステップと、
上記第４のステップにおいて算出された相関値に基づいて上記判定を行なう第５のステップと、を含む、
請求項２に記載のプログラム。
【請求項４】
上記第４のステップにおいて、上記第２のステップで共通のメモリ領域から抽出される２つのデータ列を複数の異なる位相で比較し、それぞれの位相において、上記２つのデータ列の対応するデータ同士が一致する数に応じて上記相関値を算出する、
請求項３に記載のプログラム。
【請求項５】
上記第５のステップにおいて、上記相関値が所定のしきい値を超える上記位相の数に基づいて上記判定を行なう、
請求項４に記載のプログラム。
【請求項６】
上記第５のステップにおいて、上記第４のステップで算出された複数の上記相関値のばらつきを示す所定の統計量を算出し、当該算出した統計量に基づいて上記判定を行なう、
請求項４に記載のプログラム。
【請求項７】
上記第５のステップは、
上記相関値が所定のしきい値を超える上記位相の数に基づいて、上記判定に関する第１の仮判定を行なう第６のステップと、
上記第６のステップで算出された複数の上記相関値のばらつきを示す所定の統計量を算出し、当該算出した統計量に基づいて、上記判定に関する第２の仮判定を行なう第７のステップと、
上記第１の仮判定および上記第２の仮判定の判定結果に基づいて、上記オーバーフローが上記不正データの入力により引き起こされたものであるか否かを最終判定する第８のステップと、を含む
請求項４に記載のプログラム。
【請求項８】
上記第５のステップは、上記第１の仮判定および上記第２の仮判定の何れか一方の判定結果において、上記オーバーフローが上記不正データの入力により引き起こされたものであると仮判定される回数をカウントする第９のステップを有し、
上記第８のステップにおいて、上記第１の仮判定および上記第２の仮判定の両方において上記オーバーフローが上記不正データの入力により引き起こされたものであると仮判定される場合、または、上記第９のステップにおけるカウント数が所定の回数に達する場合に、上記オーバーフローが上記不正データの入力により引き起こされたものであると最終判定する、
請求項７に記載のプログラム。
【請求項９】
上記第３のステップにおいて、少なくとも、上記オーバーフローを引き起こしたデータの供給元のネットワーク・アドレス、当該データの供給元のポート番号、当該データに含まれる特定のデータ・パターン、または、当該データを有するファイルの名前に基づいて、上記判定を行なう、
請求項１に記載のプログラム。
【請求項１０】
上記第３のステップにおいて、上記オーバーフローが上記不正データの入力により引き起こされたものであると判定された場合、上記オーバーフローが発生したプロセスを停止させる第１０のステップを有する、
請求項１に記載のプログラム。
【請求項１１】
上記第１０のステップにおいて、上記オーバーフローが発生したプロセスを、少なくとも所定期間または所定のコマンドが入力されるまでの間停止させる、
請求項１０に記載のプログラム。
【請求項１２】
上記第３のステップにおいて、上記オーバーフローが上記不正データの入力により引き起こされたものであると判定された場合、上記不正データの供給元からのアクセスを禁止する第１１のステップを有する、
請求項１に記載のプログラム。
【請求項１３】
上記第１１のステップにおいて、上記不正データの供給元からのアクセスを、少なくとも所定期間または所定のコマンドが入力されるまでの間禁止する、
請求項１２に記載のプログラム。
【請求項１４】
上記第３のステップにおいて、上記オーバーフローが上記不正データの入力により引き起こされたものであると判定された場合、上記不正データの供給元の機器において所定の警告情報を表示させるための表示データを生成する第１２のステップを有する、
請求項１に記載のプログラム。
【請求項１５】
上記第３のステップにおいて、上記オーバーフローが上記不正データの入力により引き起こされたものであると判定された場合、少なくとも、上記不正データの供給元、上記不正データの内容、または、上記不正データの供給方法に関する情報を取得する第１３のステップを有する、
請求項１に記載のプログラム。
【請求項１６】
不正なデータをコンピュータに入力することによりスタックにオーバーフローを引き起こす攻撃から、上記コンピュータを保護するセキュリティ保護装置であって、
上記スタックのオーバーフローを検知するオーバーフロー検知手段と、
上記オーバーフロー検知手段において上記オーバーフローが検知された場合、上記オーバーフローによって書き換えられた結果のデータを取得するデータ取得手段と、
上記データ取得手段において取得されたデータに基づいて、上記オーバーフローが上記不正データの入力により引き起こされたものであるか否かを判定する判定手段と、
上記判定手段において、上記オーバーフローが上記不正データの入力により引き起こされたものであると判定された場合、少なくとも、上記オーバーフローが発生したプロセスを停止させる処理、上記不正データの供給元からのアクセスを禁止する処理、上記不正データの供給元の機器において所定の警告情報を表示させるための表示データを生成する処理、または、上記不正データの供給元、上記不正データの内容、もしくは、上記不正データの供給方法の少なくとも何れか１つに関する情報を取得する処理を実行する処理手段と、
を有するセキュリティ保護装置。
【請求項１７】
上記判定手段は、上記書き換えられた結果の一連のデータの周期性を評価し、当該評価結果に基づいて上記判定を行なう、
請求項１６に記載のセキュリティ保護装置。
【請求項１８】
不正なデータをコンピュータに入力することによりスタックにオーバーフローを引き起こす攻撃から、上記コンピュータを保護するセキュリティ保護方法であって、
上記スタックのオーバーフローを検知する第１の工程と、
上記第１の工程において上記オーバーフローが検知された場合、上記オーバーフローによって書き換えられた結果のデータを取得する第２の工程と、
上記第２の工程において取得されたデータに基づいて、上記オーバーフローが上記不正データの入力により引き起こされたものであるか否かを判定する第３の工程と、
上記第３の工程において、上記オーバーフローが上記不正データの入力により引き起こされたものであると判定された場合、少なくとも、上記オーバーフローが発生したプロセスを停止させるか、上記不正データの供給元からのアクセスを禁止するか、上記不正データの供給元の機器において所定の警告情報を表示させるか、または、上記不正データの供給元、上記不正データの内容、もしくは、上記不正データの供給方法の少なくとも何れか１つに関する情報を取得する第４の工程と、
を有するセキュリティ保護方法。
【請求項１９】
上記第３の工程において、上記書き換えられた結果の一連のデータの周期性を評価し、当該評価結果に基づいて上記判定を行なう、
請求項１８に記載のセキュリティ保護方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はコンピュータのセキュリティ保護のためのプログラム、セキュリティ保護装置および方法に係り、特に、スタックオーバーフローを利用した攻撃からコンピュータを保護するプログラム、セキュリティ保護装置および方法に関するものである。
【背景技術】
【０００２】
現在、コンピュータのセキュリティに関する多くの問題が報告されている。最も多く報告されているものの一つに、バッファオーバーフローを利用した攻撃があり、その中でも特に、スタックのオーバーフローを利用するスタックスマッシング（stack smashing）と呼ばれる攻撃が数多く報告されている。
【０００３】
スタックオーバーフローは、次に述べるような、スタックの構造とＣ言語における配列の境界チェックの欠如とに起因して発生する。
【０００４】
スタックは、最後に置かれたオブジェクトが最初に取り除かれるＬＩＬＯ（last-in first-out）と呼ばれる性質を持つ抽象データ型である。Ｃ言語において関数の呼び出しに用いられるスタックは、一般に、スタック・ポインタ、スタック・フレーム、フレーム・ポインタ から構成される。
【０００５】
スタック・ポインタは、スタックの先頭を指す。
スタック・フレームは、関数の引数や、ローカル変数、以前に積まれたスタック・フレームを復元するために必要なデータ（関数呼び出し時の命令ポインタなど）が所定の順序で格納されるメモリ領域である。
フレーム・ポインタは、スタック・フレーム内において基準となるアドレス位置を指示す。主として、ローカル変数を参照するための相対値として利用される。
【０００６】
関数の呼び出し時および戻り時におけるスタックの動作について、図９および図１０を参照して説明する。
【０００７】
図９は、Ｃ言語のソース・コードの一例を示す図である。
図９のソース・コードにおける行番号Ｌ１の関数‘ｆｕｎｃｔｉｏｎ（）’には、３つの整数の変数‘ａ’，‘ｂ’，‘ｃ’が引数として渡されている。また、関数‘ｆｕｎｃｔｉｏｎ（）’の内部では、文字型の配列‘ｂｕｆ’がローカル変数として定義されている（行番号Ｌ２）。この関数‘ｆｕｎｃｔｉｏｎ（）’がｍａｉｎ関数において呼び出されている（行番号Ｌ４、Ｌ５）。
【０００８】
図１０は、このようなソース・コードが実行された場合におけるスタックの状態の一例を図解した図である。
【０００９】
関数の呼び出しは、以下の手順で実行される。
【００１０】
（１）関数‘ｆｕｎｃｔｉｏｎ（）’の引数（‘ａ’〜‘ｃ’）がスタックに積まれる。図１０に示すように、‘ｃ’、‘ｂ’、‘ａ’の順でスタックに引数が積まれる。
【００１１】
（２）次いで、現在の命令ポインタ（実行すべき命令コードが格納されるメモリのアドレス）が戻りアドレス‘ｒｅｔ’としてスタックに積まれる。
【００１２】
（３）更に、現在のフレーム・ポインタ‘ＦＰ’がスタックに積まれ、フレーム・ポインタ‘ｓｆｐ’（saved frame pointer）として保存される。
【００１３】
（４）現在のスタック・ポインタＳＰが、現在のフレーム・ポインタ‘ＦＰ’にコピーされる。これにより、新しいフレーム・ポインタ‘ＦＰ’は、上述した戻りアドレス‘ｒｅｔ’を指す。
【００１４】
（５）最後に、ローカル変数‘ｂｕｆ’のメモリ領域を確保するため、スタック・ポインタ‘ＳＰ’が更に上位へ進められる。図１０は、この時点におけるスタックの状態の一例を示している。
【００１５】
関数の戻り時には、以下の動作が実行される。
【００１６】
（１）現在のフレーム・ポインタ‘ＦＰ’がスタック・ポインタ‘ＳＰ’にコピーされる。これにより、新しいスタック・ポインタ‘ＳＰ’は、戻りアドレス‘ｒｅｔ’を指す。
【００１７】
（２）また、スタックに積まれていた以前のフレーム・ポインタ‘ＳＦＰ’がフレーム・ポインタ‘ＦＰ’にコピーされる。これにより、フレーム・ポインタ‘ＦＰ’が呼び出し元の関数のスタック・フレームに戻る。
【００１８】
（３）そして、スタック・ポインタ‘ＳＰ’によって指示されている戻りアドレス‘ｒｅｔ’がスタックから読み出され、命令ポインタにセットされる。これにより、呼び出し元の関数へ処理がジャンプする。以降、スタックに積まれていた引数（‘ａ’〜‘ｃ’）が順に読み出されることによって、スタック・ポインタ‘ＳＰ’は元の状態に戻る。
【００１９】
図１１は、このような構造のスタックにオーバーフローが発生した場合におけるスタックの状態の一例を図解した図である。
【００２０】
ローカル変数としての配列‘ｂｕｆ’に、割り当てを超えたデータ（図９の例では、終端文字を含めて１０個を超える文字型のデータ）が入力されると、図１１の矢印に示すように、配列‘ｂｕｆ’より上位のアドレスに格納されているスタック上のデータが入力データによって上書きされる。このように、割り当てを超えたデータが入力されることによって、スタック上の保持すべきデータが上書きされてしまうことを、スタックオーバーフローと呼んでいる。
【００２１】
図１２は、スタックオーバーフローを利用したスタックスマッシング攻撃によって、攻撃コードが実行される様子を図解した図である。
【００２２】
スタックスマッシング攻撃では、スタックオーバーフローを引き起こす入力データの中に、有害な攻撃コードが挿入される。すなわち、図１２に示すように、スタックオーバーフローによって上書きされたメモリ領域に、攻撃コードが書き込まれる。更に、この入力データの中には、攻撃コードを指示するアドレスが含まれており、このアドレスによって、スタックに格納されている戻りアドレス‘ｒｅｔ’が書き換えられる。そのため、関数の戻り時において、本来実行されるべき命令コードの代わりに、攻撃コードが実行されてしまう。
【００２３】
例えばＵＮＩＸ（登録商標）の場合、多くのデーモンプロセスはｒｏｏｔ権限で実行されている。そこで、例えば攻撃コードとして‘ｅｘｅｃ（／ｂｉｎ／ｓｈ）’を利用し、デーモンプロセスに対してスタックスマッシング攻撃を行なうことにより、攻撃者はそのホストでのｒｏｏｔ権限を獲得できる。
【００２４】
このようなスタックスマッシング攻撃に対抗するため、現在幾つかの技術の提案されており、これらは、大きく以下の３つに分類される。
【００２５】
（１）スタック上の情報が上書きされることを事前に検出する方法
（２）スタック上の情報が上書きされたことを検出する方法
（３）メモリ上のコードの実行可否を判定する方法
【００２６】
以下では、これらの従来技術について説明する。
【００２７】
（１）スタック上の情報が上書きされることを事前に検出する方法
【００２８】
［非特許文献１］には、ソース・コードのライブラリを置き換える方法として、ｌｉｂｓａｆｅと呼ばれる方法が提案されている。
【００２９】
ｌｉｂｓａｆｅでは、スタックオーバーフローを引き起こす可能性のあるライブラリ関数の呼び出しを横取り（intercept）し、関数の引数がスタックのメモリ範囲内に収まるか否かを検査する。そして、正常な場合には適当なライブラリ関数を呼び出し、異常な場合にはその旨を通知するメッセージを残してプログラムを終了することにより、スタックオーバーフローを防止する。
【００３０】
Ｃ言語における標準ライブラリ（ｌｉｂｃ）の関数‘ｓｔｒｃｐｙ（）’を例にして、ｌｉｂｓａｆｅの動作を説明する。
図１３は、ｌｉｂｓａｆｅのライブラリをリンクしたあるプロセスでのメモリの状態を示す図である。
【００３１】
プログラムが‘ｓｔｒｃｐｙ（）’を呼び出すと、標準ライブラリ（ｌｉｂｃ）ではなく、ｌｉｂｓａｆｅのライブラリに実装されている‘ｓｔｒｃｐｙ（）’が実行される（Ｆ１）。これはライブラリのロードの順番を工夫することにより実現される。
【００３２】
ｌｉｂｓａｆｅの‘ｓｔｒｃｐｙ（）’は、まず、コピー元の文字列（‘ｓｒｃ’）の長さとコピー先のバッファ長の上限（すなわちスタック・フレーム長）を計算し、コピー元の文字列がコピー先のバッファ長の上限を越えないかを検査する。
上限を越えない場合、ｌｉｂｓａｆｅの‘ｓｔｒｃｐｙ（）’は、標準ライブラリ（ｌｉｂｃ）の関数‘ｍｅｍｃｐｙ（）’を呼び出してこれを実行し（Ｆ２，Ｆ３）、メイン関数に戻る（Ｆ４）。
一方、上限を越えると判定された場合、ｌｉｂｓａｆｅの‘ｓｔｒｃｐｙ（）’はシステムのログ・ファイル（ｓｙｓｌｏｇ）にメッセージを残し、プログラムを終了させる。
このように、ｌｉｂｓａｆｅでは、スタックオーバーフローの発生を事前に検出することにより、スタックスマッシング攻撃を防いでいる。
【００３３】
（２）スタック上の情報が上書きされたことを検出する方法
【００３４】
［非特許文献２］には、コンパイラを拡張する方法として、ＳｔａｃｋＧｕａｒｄと呼ばれる方法が提案されている。
ＳｔａｃｋＧｕａｒｄでは、図１４に示されるように、戻りアドレス‘ｒｅｔ’とローカル変数‘ｂｕｆ’との間に‘Ｃａｎａｒｙ  Ｗｏｒｄ’と呼ばれる値を挿入する。そして、関数戻り時にこの値をチェックし、スタックオーバーフローの上書きによって値が変更されている場合、スタックスマッシング攻撃が行なわれたものとしてプロセスを終了させる（図１５）。
【００３５】
また、［特許文献１］においても、Ｓｔａｃｋ  Ｓｍａｓｈｉｎｇ  Ｐｒｏｔｅｃｔｏｒと呼ばれる、上述のＳｔａｃｋＧｕａｒｄと同様な技術が開示されている。［特許文献１］によれば、関数戻り時に、スタックのプレヴィアス・フレーム・ポインタ（図１０におけるフレーム・ポインタ‘ｓｆｐ’に相当する）と配列（図１０における配列‘ｂｕｆ’に相当する）との間にガード変数を格納し、その有効性を確認することにより、スタックスマッシング攻撃を防止する。
【００３６】
（３）メモリ上のコードの実行可否を判定する方法
【００３７】
オペレーティング・システムを拡張する方法として、インターネット＜ＵＲＬ：  http://www.openwall.com/linux/＞において開示されている、ｎｏｎ−ｅｘｅｃｕｔａｂｌｅ  ｓｔａｃｋと呼ばれる方法や、インターネット＜ＵＲＬ：  http://pageexec.virtualave.net/＞において開示されている、ＰａＸと呼ばれる方法が存在する。
【００３８】
ｎｏｎ−ｅｘｅｃｕｔａｂｌｅ  ｓｔａｃｋの方法では、スタックスマッシング攻撃において攻撃コードがスタック上に置かれることに着目し、メモリ上のスタックのページにおいて、ＣＰＵによる命令の実行が許可されないように、カーネルを変更している。スタックスマッシング攻撃によりスタック上に置かれた攻撃コードが実行された場合、ページ違反（page fault）としてプロセスを停止させる。
【００３９】
一方、ＰａＸの方法では、スタックだけでなく全てのデータページにおいてＣＰＵによる命令実行の許可／不許可をマークできるように、カーネルを変更している。
【００４０】
何れの方法においても、スタック上に置かれたコードを実行できなくすることにより、スタックスマッシング攻撃を防止している。
【非特許文献１】Arash Baratloo，他２名、‘Transparent Run-Time Defense Against Stack Smashing Attacks’、In Proceedings of 2000 USENIX Annual Technical Conference、（米国）、２０００年
【非特許文献２】Crispin Cowan，他８名、‘Automatic Adaptive Detection and Prevention of Buffer-Overflow Attacks’、In Proceedings of the 7th USENIX Security Symposium、（米国）、１９９８年
【特許文献１】特開２００１−２１６１６１号公報
【発明の開示】
【発明が解決しようとする課題】
【００４１】
ところで、上述したスタックスマッシング攻撃を仕掛けるためには、プログラムのセキュリティ・ホールに関する知識が必要である。言い換えると、スタックスマッシング攻撃が仕掛けられる時点では、既にセキュリティ・ホールが攻撃者によって解析されていることになる。そのため、上述の方法により特定の攻撃を防ぐことができたとしても、解析された情報に基づいて別の攻撃者が新たな攻撃を仕掛ける可能性がある。したがって、セキュリティに対する脅威が払拭されたとは言い難い。
【００４２】
仮に、プログラムのセキュリティ・ホールを探る行為のような、攻撃を仕掛けるための準備行為の有無を把握することができれば、その結果に基づいて、上記のような攻撃に対抗するより効果的な措置を事前に講ずることが可能になり、セキュリティの脅威を減らせることが期待される。
【００４３】
しかしながら、スタックスマッシング攻撃に対抗する上述した３つの方法は、何れもスタックオーバーフローの発生や、禁止されたアドレスの命令コードの実行を検出して、プロセスを停止または終了させるのみであり、スタックオーバーフローが攻撃を準備するための行為によって引き起こされたものであるのか、それとも、通常の処理において偶発的に発生したものであるのかを見分ける手立てが存在しない。そのため、攻撃準備行為の有無を正確に把握することができず、攻撃の未然の防止に役立てることができないという不利益がある。
【００４４】
本発明はかかる事情に鑑みてなされたものであり、その目的は、スタックのオーバーフローを利用した攻撃の準備行為の有無を正しく把握することができるプログラム、セキュリティ保護装置およびその方法を提供することにある。
【課題を解決するための手段】
【００４５】
上記の目的を達成するため、本発明の第１の観点のプログラムは、不正なデータの入力によりスタックがオーバーフローを起こし得るコンピュータに、上記スタックのオーバーフローを検知する第１のステップと、上記第１のステップにおいて上記オーバーフローが検知された場合、上記オーバーフローによって書き換えられた結果のデータを取得する第２のステップと、上記第２のステップにおいて取得されたデータに基づいて、上記オーバーフローが上記不正データの入力により引き起こされたものであるか否かを判定する第３のステップとを有する処理を実行させる。
好適には、上記第３のステップにおいて、上記書き換えられた結果の一連のデータの周期性を評価し、当該評価結果に基づいて上記判定を行なう。
【００４６】
本発明の第１の観点によると、上記第１のステップにおいて上記スタックのオーバーフローが検知された場合、上記第２のステップにおいて、上記オーバーフローにより書き換えられた結果のデータが取得される。上記第３のステップでは、上記第２のステップにおいて取得されたデータに基づいて、上記オーバーフローが上記不正データの入力により引き起こされたものであるか否かが判定される。上記判定は、例えば、上記書き換えられた結果の一連のデータの周期性を評価した結果に基づいてなされる。
【００４７】
上記第２のステップにおいて、上記書き換えを受けたメモリ領域から、アドレス順に並ぶ所定数のデータをデータ列として抽出し、上記第３のステップは、上記第２のステップにおいて抽出されたデータ列の相関値を算出する第４のステップと、上記第４のステップにおいて算出された相関値に基づいて上記判定を行なう第５のステップとを含んでも良い。
上記の処理によると、上記書き換えを受けたメモリ領域から、アドレス順に並ぶ所定数のデータがデータ列として抽出され、抽出されたデータ列の相関値が算出される。そして、この算出された相関値に基づいて上記判定が行なわれる。
【００４８】
また、本発明の第１の観点は、上記第３のステップにおいて、上記オーバーフローが上記不正データの入力により引き起こされたものであると判定された場合に、次に述べる処理を行なう、第１０ないし第１３のステップのうち少なくとも１つを有しても良い。
第１０のステップは、上記オーバーフローが発生したプロセスを停止させる。
第１１のステップは、上記不正データの供給元からのアクセスを禁止する。
第１２のステップは、上記不正データの供給元の機器において所定の警告情報を表示させるための表示データを生成する。
第１３のステップは、少なくとも、上記不正データの供給元、上記不正データの内容、または、上記不正データの供給方法に関する情報を取得する。
【００４９】
本発明の第２の観点は、不正なデータをコンピュータに入力することによりスタックにオーバーフローを引き起こす攻撃から、上記コンピュータを保護するセキュリティ保護装置であって、上記スタックのオーバーフローを検知するオーバーフロー検知手段と、上記オーバーフロー検知手段において上記オーバーフローが検知された場合、上記オーバーフローによって書き換えられた結果のデータを取得するデータ取得手段と、上記データ取得手段において取得されたデータに基づいて、上記オーバーフローが上記不正データの入力により引き起こされたものであるか否かを判定する判定手段と、上記判定手段において、上記オーバーフローが上記不正データの入力により引き起こされたものであると判定された場合、少なくとも、上記オーバーフローが発生したプロセスを停止させる処理、上記不正データの供給元からのアクセスを禁止する処理、上記不正データの供給元の機器において所定の警告情報を表示させるための表示データを生成する処理、または、上記不正データの供給元、上記不正データの内容、もしくは、上記不正データの供給方法の少なくとも何れか１つに関する情報を取得する処理を実行する処理手段とを有する。
好適には、上記判定手段は、上記書き換えられた結果の一連のデータの周期性を評価し、当該評価結果に基づいて上記判定を行なう。
【００５０】
本発明の第２の観点によると、上記オーバーフロー検知手段において上記オーバーフローが検知された場合、上記データ取得手段において、上記オーバーフローにより書き換えられた結果のデータが取得される。上記判定手段では、上記データ取得手段において取得されたデータに基づいて、上記オーバーフローが上記不正データの入力により引き起こされたものであるか否かが判定される。例えば、上記書き換えられた結果の一連のデータの周期性を評価した結果に基づいて、上記判定が行なわれる。
上記判定手段において、上記オーバーフローが上記不正データの入力により引き起こされたものであると判定された場合、少なくとも、上記オーバーフローが発生したプロセスを停止させる処理、上記不正データの供給元からのアクセスを禁止する処理、上記不正データの供給元の機器において所定の警告情報を表示させるための表示データを生成する処理、または、上記不正データの供給元、上記不正データの内容、もしくは、上記不正データの供給方法の少なくとも何れか１つに関する情報を取得する処理が、上記処理手段において実行される。
【００５１】
本発明の第３の観点は、不正なデータをコンピュータに入力することによりスタックにオーバーフローを引き起こす攻撃から、上記コンピュータを保護するセキュリティ保護方法であって、上記スタックのオーバーフローを検知する第１の工程と、上記第１の工程において上記オーバーフローが検知された場合、上記オーバーフローによって書き換えられた結果のデータを取得する第２の工程と、上記第２の工程において取得されたデータに基づいて、上記オーバーフローが上記不正データの入力により引き起こされたものであるか否かを判定する第３の工程と、上記第３の工程において、上記オーバーフローが上記不正データの入力により引き起こされたものであると判定された場合、少なくとも、上記オーバーフローが発生したプロセスを停止させるか、上記不正データの供給元からのアクセスを禁止するか、上記不正データの供給元の機器において所定の警告情報を表示させるか、または、上記不正データの供給元、上記不正データの内容、もしくは、上記不正データの供給方法の少なくとも何れか１つに関する情報を取得する第４の工程とを有する。
好適には、上記第３の工程において、上記書き換えられた結果の一連のデータの周期性を評価し、当該評価結果に基づいて上記判定を行なう。
【００５２】
本発明の第３の観点によると、上記第１の工程において上記オーバーフローが検知された場合、上記第２の工程において、上記オーバーフローにより書き換えられた結果のデータが取得される。上記第３の工程では、上記第２の工程において取得されたデータに基づいて、上記オーバーフローが上記不正データの入力により引き起こされたものであるか否かが判定される。例えば、上記書き換えられた結果の一連のデータの周期性を評価した結果に基づいて、上記判定が行なわれる。
上記第３の工程において、上記オーバーフローが上記不正データの入力により引き起こされたものであると判定された場合、上記第４の工程において、少なくとも、上記オーバーフローが発生したプロセスが停止されるか、上記不正データの供給元からのアクセスが禁止されるか、上記不正データの供給元の機器において所定の警告情報が表示されるか、または、上記不正データの供給元、上記不正データの内容、もしくは、上記不正データの供給方法の少なくとも何れか１つに関する情報が取得される。
【発明の効果】
【００５３】
本発明によれば、コンピュータのスタックにオーバーフローが生じた場合、そのオーバーフローが、不正なデータの入力により引き起こされたものであるか否かを判定することができる。また、この判定結果に基づいて、スタックのオーバーフローを利用した攻撃を仕掛けるための準備行為を防止できる。
【発明を実施するための最良の形態】
【００５４】
以下、本発明の４つの実施形態について、図面を参照して説明する。
【００５５】
＜第１の実施形態＞
図１は、本発明の実施形態に係るコンピュータの構成の一例を示すブロック図である。
【００５６】
図１に示すコンピュータは、ＣＰＵ１０と、記憶装置２０と、入出力部３０と、プログラムメモリ４０と、ＲＡＭ５０とを有する。
【００５７】
ＣＰＵ１０は、プログラムメモリ４０に格納される本実施形態に係るプログラムを読み出し、これに基づいて所定の処理を実行する。
【００５８】
記憶装置２０は、ＣＰＵ１０の処理過程において利用されるデータや、処理結果のデータを記憶する。
【００５９】
入出力部３０は、ＣＰＵ１０の処理過程において利用されるデータを入力する処理や、処理結果のデータを出力する処理を行なう。
入出力部３０には、例えば、ＬＡＮ（local area network）やインターネットなどのネットワークを介して他の機器との間でデータをやり取りするネットワーク・インターフェース装置や、磁気ディスク、光ディスク、ＩＣカードなどの可搬性を有する記録媒体に対してデータの書き込みや読み出しを行なう装置、キーボードやマウスなどのユーザ・インターフェース装置、ディスプレイ装置などが含まれる。
【００６０】
プログラムメモリ４０は、後述する本実施形態に係るプログラムを記憶する。
【００６１】
ＲＡＭ５０は、ＣＰＵ１０による処理の過程で利用するプログラム・コードやデータを一時的に記憶する。スタックを構成するデータは、このＲＡＭ５０における所定のスタック領域に格納される。
【００６２】
なお、これらのユニット（ＣＰＵ１０、記憶装置２０、入出力部３０、プログラムメモリ４０、ＲＡＭ５０）は、図１の例において、共通のバス６０に接続される。各ユニットの間におけるデータの受け渡しは、ＣＰＵ１０の制御の基に、このバス６０を介して行なわれる。
【００６３】
図２は、本実施形態に係るプログラムの機能的な構成の一例を示すブロック図である。
本実施形態に係るプログラムは、オーバーフロー検知部１０１と、データ取得部１０２と、判定部１０３と、セキュリティ処理部１０４とを有する。
【００６４】
［オーバーフロー検知部１０１］
オーバーフロー検知部１０１は、スタックのオーバーフローを検知する。
【００６５】
例えば、オーバーフロー検知部１０１は、プロセスの処理過程において新たな関数が呼び出された場合、スタック・フレーム中の所定のアドレス（フレーム・ポインタと戻りアドレスとの間や、ローカル変数とフレーム・ポインタとの間など）に、所定値の上書き検出用のデータを挿入する。この値は、例えば、図示しない乱数生成部において生成される乱数を用いて設定する。そして、呼び出し元の関数へ戻る際に、この所定のアドレスに格納されるデータと上記所定値とを比較し、上書き検出用のデータが変化しているか否かを調べる。この結果、上書き検出用のデータが変化している場合に、スタックオーバーフローが発生したと判定する。
【００６６】
また、オーバーフロー検知部１０１は、新たに呼び出すべき関数に引数として渡されるデータのサイズと、この関数において引数に割り当てられているデータサイズとを比較した結果に基づいて、この関数が呼び出された場合におけるスタックオーバーフローの発生の有無を事前に検知しても良い。上述した引数のチェックは、例えば、‘ｓｔｒｃｐｙ（）’などの境界チェックを欠いた関数について行なう。
【００６７】
［データ取得部１０２］
データ取得部１０２は、オーバーフロー検知部１０１においてスタックオーバーフローが検知された場合、このスタックオーバーフローによって書き換えられた結果のデータを取得する。
【００６８】
例えば、データ取得部１０２は、オーバーフロー検知部１０１においてスタックオーバーフローが検知された場合、そのプロセスを強制終了させて、オペレーティング・システムにコアダンプ（core-dump）・ファイルを出力させる。コアダンプ・ファイルには、強制終了時点におけるプロセスのメモリイメージが記録される。判定部１０２は、このコアダンプ・ファイルから、スタックオーバーフローによって書き換えられた結果のデータを取得する。
【００６９】
［判定部１０３］
判定部１０３は、データ取得部１０２において取得される、スタックオーバーフローによって書き換えられた結果のデータに基づいて、このスタックオーバーフローが、スタックスマッシングなどのセキュリティ攻撃やその準備のために行なわれた、不正なデータの入力により引き起こされたものであるか否かを判定する。
【００７０】
例えば、判定部１０３は、書き換えられた結果の一連のデータの周期性を評価し、この評価結果に基づいて、スタックオーバーフローが不正データの入力により引き起こされたものであるか否かを判定する。これは、セキュリティ攻撃の準備行為に用いられる不正なデータが、しばしば周期の短い単純なパターンを有していることを利用するものである。
【００７１】
また、判定部１０３は、上記のようなデータの周期性の他にも、例えば、スタックオーバーフローを引き起こしたデータの供給元のネットワーク・アドレスや、当該データの供給元のポート番号、当該データに含まれる特定のデータ・パターン、当該データを有するファイルの名前など、不正データの入力を特徴付けるさまざまな情報に基づいて、上記の判定を行なっても良い。
【００７２】
［セキュリティ処理部１０４］
セキュリティ処理部１０４は、判定部１０３において、スタックオーバーフローが不正データの入力により引き起こされたものであると判定された場合、そのような不正データの入力からコンピュータのセキュリティを保護するための所定の処理を行なう。
【００７３】
例えば、セキュリティ処理部１０４は、スタックオーバーフローが発生したプロセスを停止させる。これにより、スタックオーバーフローが攻撃準備行為によるものである場合には、これを阻止して、攻撃を未然に防止することができる。また、スタックオーバーフローが攻撃によるものである場合には、不正データに含まれる有害な攻撃コードの実行を阻止することができる。
この場合、セキュリティ処理部１０４は、判定部１０３の判定結果を受けて、プロセスを所定期間停止させても良いし、停止の解除を指示する所定のコマンドが入力されるまでの間停止させても良い。
【００７４】
また、セキュリティ処理部１０４は、不正データの供給元からのアクセスを禁止しても良い。例えば、不正データの供給元がネットワーク上の機器である場合には、そのネットワーク・アドレスからのアクセスを禁止する。あるいは特定のプロセスが不正データの供給元である場合には、そのプロセス番号からのアクセスを禁止する。このような処理によっても、攻撃準備行為を阻止して、攻撃を未然に防止することができるとともに、攻撃コードの実行を阻止することができる。
この場合、上述と同様に、セキュリティ処理部１０４は、プロセスを所定期間停止させても良いし、停止の解除を指示する所定のコマンドが入力されるまでの間停止させても良い。
【００７５】
また、セキュリティ処理部１０４は、不正データの供給元の機器において所定の警告情報を表示させるための表示データを生成しても良い。例えば、
「不正な入力が行なわれました。
入力データ：＊＊＊＊」
といった内容を、不正データの供給元の機器に装備されたディスプレイ装置に表示させる。これにより、セキュリティ攻撃やその準備行為を仕掛けた者に警告を与えて、そうした行為の抑止を図ることができる。
【００７６】
また、セキュリティ処理部１０４は、不正データの供給元に関する情報として、例えば、そのネットワーク・アドレスや、プロセス番号、ポート番号を取得しても良い。
あるいは、不正データの内容に関する情報として、入力されたデータや、その中に含まれる攻撃コードを取得しても良い。
更には、不正データの供給方法に関する情報として、不正アクセスによるものか、それとも、コンピュータ・ウィルスによるものか、といった情報を取得しても良い。
このように、不正データの入力に関する種々の情報を取得することによって、攻撃準備行為に対する詳しい知識が得られるため、攻撃の防御に関する効果的な措置を事前に講ずることが可能になる。
【００７７】
ここで、上述したプログラムによる処理を説明する前に、まず、スタックスマッシング攻撃の準備行為について、その一般的な手順を説明する。
【００７８】
（１）攻撃対象のプロセスに適当な長さのデータを入力して、プロセスが強制終了するか否かを調べる。強制終了する場合には、スタックオーバーフローが発生していると推定される。
【００７９】
（２）スタックオーバーフローの発生が推定されたならば、次に、スタックの構造を解析するための細工が施されたデータをプログラムに入力し、プロセスを強制終了させて、オペレーティング・システムにコアダンプ・ファイルを出力させる。
【００８０】
（３）取得したコアダンプ・ファイルから、各ポインタ（スタック・ポインタ、フレーム・ポインタ、命令ポインタなど）やメモリの内容を解析し、スタック上において呼び出し元関数への戻りアドレスが格納されている位置を推定する。
【００８１】
（４）上述した（２）および（３）の工程を繰り返し、スタック上の戻りアドレスの位置を特定する。
【００８２】
（５）特定した戻りアドレスの位置に基づいて、攻撃コードとその指示アドレスとが適切な位置に挿入された不正データを作成する。
【００８３】
（６）作成した不正データを攻撃対象のプロセスに入力し、所望の動作が実行されるか否かを確認する。
【００８４】
（７）上述した（５）および（６）の工程を繰り返し、攻撃コードを含む不正データを完成させる。
【００８５】
このような攻撃準備行為の手順によると、（１）、（２）および（６）の工程において、スタックオーバーフローが発生する。本実施形態のプログラムでは、スタックオーバーフローの発生が検知された場合に、それがセキュリティ攻撃や上述した攻撃準備行為における不正データの入力によるものであるか否かの判定が行なわる。
【００８６】
図３は、本実施形態に係るプログラムによる処理の流れの一例を図解したフローチャートである。
【００８７】
ステップＳＴ１０：
図２には示されていない他のプロセスによる通常の処理が進められる。
【００８８】
ステップＳＴ２０：
オーバーフロー検知部１０１は、このプロセスの処理過程において、スタックオーバーフローの発生の有無を監視する。スタックオーバーフローが検知されない場合は、プロセスの処理（ステップＳＴ１０）を通常通り進行させ、スタックオーバーフローが検知された場合は、データ取得部１０２へオーバーフローの発生を通知する。
【００８９】
ステップＳＴ３０：
オーバーフロー検知部１０１からスタックオーバーフローの発生を通知されると、データ取得部１０２は、このスタックオーバーフローによって書き換えられた結果のデータを取得する。例えば、スタックオーバーフローが検知されたプロセスを強制終了させて、オペレーティング・システムにコアダンプ・ファイルを出力させる。そして、このコアダンプ・ファイルから、スタックオーバーフローによって書き換えられた結果のデータを取得する。
【００９０】
ステップＳＴ４０：
データ取得部１０２において、スタックオーバーフローにより書き換えられた結果のデータが取得されると、判定部１０３は、この取得されたデータに基づいて、スタックオーバーフローが、セキュリティ攻撃やそれを準備するための不正データの入力により引き起こされたものであるか否かを判定する。例えば、書き換えを受けた一連のデータの周期性を評価し、その評価結果に基づいて、上記の判定を行なう。
判定の結果、不正なデータの入力によるものではないと判定された場合には、プロセスの処理（ステップＳＴ１０）を通常通り進行させ、不正なデータの入力によるものと判定された場合には、セキュリティ処理部１０４へその旨を通知する。
【００９１】
ステップＳＴ５０：
不正データの入力によるオーバーフローの発生が判定部１０３より通知されると、セキュリティ処理部１０４は、不正データの入力からコンピュータのセキュリティを保護するための所定の処理を行なう。
例えば、スタックオーバーフローが発生したプロセスを停止させる処理や、不正データの供給元からのアクセスを禁止する処理、不正データの供給元の機器において所定の警告情報を表示させるための処理、不正データの入力に関する種々の情報を取得する処理を行なう。
【００９２】
以上説明したように、本実施形態に係るプログラムによれば、スタックオーバーフローが検知された場合に、このスタックオーバーフローが、セキュリティ攻撃やその準備行為における不正データの入力により引き起こされたものであるのか否かを判定することができる。すなわち、コンピュータの通常の使用により発生したスタックオーバーフローと、セキュリティ攻撃やその準備行為により発生したスタックオーバーフローとを見分けることができる。したがって、攻撃準備行為の実態を正確に把握することが可能になり、把握した内容を、セキュリティ攻撃に対する事前の対抗措置を講ずるために役立てることができる。
【００９３】
また、本実施形態に係るプログラムによれば、不正データの入力によりスタックオーバーフローが発生したと判定された場合に、コンピュータのセキュリティ保護に係る処理（プロセスの停止、不正アクセスの禁止、警告表示、情報の収集など）を実行することにより、スタック構造の解析行為のような攻撃準備行為を抑止し、セキュリティ攻撃を未然に防止することができるため、セキュリティの脅威を一層減少させることができる。
【００９４】
＜第２の実施形態＞
次に、本発明の第２の実施形態について述べる。
【００９５】
第２の実施形態では、スタックオーバーフローにより書き換えられた結果のデータの相関値に基づいて、不正データの入力の有無が判定される。
【００９６】
例として以下に説明する本実施形態に係るプログラムは、図２に示すプログラムにおいて、データ取得部１０２および判定部１０３を、次に述べるデータ取得部１０２Ａおよび判定部１０３Ａへ置き換えたものである。このプログラムは、例えば図１に示すコンピュータにおいて実行される。
【００９７】
まず、図２に示すプログラムに対して異なる構成である、データ取得部１０２Ａおよび判定部１０３Ａについて説明する。
【００９８】
［データ取得部１０２Ａ］
データ取得部１０２Ａは、オーバーフロー検知部１０１においてスタックオーバーフローが検知された場合、このスタックオーバーフローによって書き換えられたメモリ領域から、アドレス順に並ぶ所定数のデータをデータ列として抽出する。
【００９９】
例えば、データ取得部１０２Ａは、オーバーフロー検知部１０１においてスタックオーバーフローが検知された場合、そのプロセスの強制終了時に出力されるコアダンプ・ファイルから、メモリ上のスタックを含む領域においてアドレス順に並ぶ所定数のデータをデータ列として抽出する。
【０１００】
［判定部１０３Ａ］
判定部１０３Ａは、データ取得部１０２Ａにおいて抽出されたデータ列の相関値を算出し、算出した相関値に基づいて、スタックオーバーフローが不正なデータの入力により引き起こされたものであるか否かを判定する。
【０１０１】
例えば、判定部１０３Ａは、データ取得部１０２Ａにおいて２つの同一のデータ列を複数の異なる位相で比較し、それぞれの位相において、この２つの同一データ列の対応するデータ同士が一致する数に応じて、自己相関値を算出する。
【０１０２】
仮に、データ取得部１０２Ａにおいて、データ長Ｎ（Ｎは２以上の正の整数を示す）のデータ列Ｄが抽出されるものとし、このデータ列Ｄの先頭からｉ番目（ｉは‘０’から‘Ｎ−１’までの正の整数を示す）のデータを‘Ｄ［ｉ］’と表すことにする。
このような条件の元で、判定部１０３Ａは、例えば、‘０’から‘Ｎ−１’までの整数ｉについて、等式
Ｄ［ｉ］＝Ｄ［ｉ＋Ｐ］…（１）  
が成立する数をカウントし、これを位相Ｐにおける相関値Ｒ［Ｐ］とする。
ただし、‘ｉ＋Ｐ’が‘Ｎ−１’を超える場合や‘０’より小さい場合、式（１）は不成立と見なす。したがって、位相Ｐが‘０’から‘Ｎ−１’までの整数の場合に、相関値Ｒ［Ｐ］は‘１’以上の有意味な値を持ち得る。
【０１０３】
図４は、判定部１０３Ａにおける自己相関値の算出方法の一例を説明するための図である。
【０１０４】
図４の例では、データ取得部１０２Ａにおいてデータ長Ｎ＝１８のデータ列Ｄとして、
‘ａｂｃｄｅｆａｂｃｄｅｆａｂｃｄｅｆ’
というデータ列が抽出される。また、データＤ［０］，Ｄ［１］，Ｄ［２］，…，Ｄ［１７］は、それぞれ‘ａ’，‘ｂ’，‘ｃ’，…，‘ｆ’である。
【０１０５】
図４（Ａ）は、位相Ｐ＝０の場合における各データの対応関係を示す。この場合、‘０’から‘１７’までの整数ｉについて式（１）が全て成立するため、相関値Ｒ［０］は‘１８’となる。
また、図４（Ｂ）および（Ｃ）は、位相Ｐ＝１および位相Ｐ＝２の場合における各データの対応関係を示す。この場合は、‘０’から‘１７’までの整数ｉについて式（１）が何れも成り立たないため、相関値Ｒ［０］は‘０’となる。
図４（Ｄ）は、位相Ｐ＝６の場合における各データの対応関係を示す。この場合、‘６’から‘１７’までの整数ｉについて式（１）が成立するため、相関値Ｒ［０］は‘１２’となる。
【０１０６】
このように、図４の例に示すデータが抽出された場合、相関値Ｒ［Ｐ］は、位相Ｐが‘０’，‘６’，‘１２’の場合において、それぞれ‘１８’、‘１２’、‘６’となり、他の場合において‘０’となる。
【０１０７】
また、データ列の自己相関値は、次のような方法によって算出することもできる。
【０１０８】
データ列Ｄを２つ並べたデータ長２Ｎのデータ列Ｄ２について、等式
Ｄ［ｉ］＝Ｄ２［ｉ＋Ｐ］…（２）
が成立する数を‘０’から‘Ｎ−１’までの整数ｉについてカウントし、これを位相Ｐにおける相関値Ｒ２［Ｐ］とする。ただし、‘ｉ＋Ｐ’が‘２Ｎ−１’を超える場合や‘０’より小さい場合、式（２）は不成立と見なす。
【０１０９】
例えば、図４と同様に、データ取得部１０２Ａにおいてデータ長Ｎ＝１８のデータ列Ｄとして、
‘ａｂｃｄｅｆａｂｃｄｅｆａｂｃｄｅｆ’
が抽出されるものとすると、これを２つ並べたデータ列Ｄ２は、
‘ａｂｃｄｅｆａｂｃｄｅｆａｂｃｄｅｆａｂｃｄｅｆａｂｃｄｅｆａｂｃｄｅｆ’
となる。
この場合、相関値Ｒ２［Ｐ］は、位相Ｐが‘０’，‘６’，‘１２’の場合において何れも‘１８’となり、他の場合において‘０’となる。
【０１１０】
なお、上述した例における判定部１０３Ａは、２つの同一データ列に関する自己相関値を算出するが、これに限らず、データ取得部１０２Ａによって共通のメモリ領域から抽出される異なる２つのデータ列に関して、上述と同様な方法により、相互相関値を算出しても良い。
【０１１１】
このようにして各位相における相関値を算出すると、判定部１０３Ａは、算出した相関値が所定のしきい値を超えるか否かを、各位相について調べる。そして、相関値が所定のしきい値を超える位相の数をカウントし、このカウント値が所定数に達する場合、スタックオーバーフローが不正なデータの入力により引き起こされたものであると判定する。
【０１１２】
次に、上述した構成を有するプログラムの処理について、図５に示すフローチャートを参照して説明する。
【０１１３】
ステップＳＴ１０〜ＳＴ３０：
ステップＳＴ１０〜ＳＴ３０の処理は、図３のフローチャートと同様である。
すなわち、通常処理（ステップＳＴ１０）の過程においてスタックオーバーフローの発生の有無が監視され（ステップＳＴ２０）、スタックオーバーフローの発生が検知された場合、書き換えられた結果のデータが抽出される（ステップＳＴ３０）。
【０１１４】
ステップＳＴ４１０：
データ取得部１０２Ａにおいて、スタックオーバーフローにより書き換えられたメモリ上の領域から所定データ長のデータ列が抽出されると、判定部１０３Ａは、抽出されたデータ列の各位相の相関値を算出する。
【０１１５】
ステップＳＴ４２０：
次に、判定部１０３Ａは、算出した各位相の相関値と、所定のしきい値とを比較し、相関値がしきい値を超える位相の数をカウントする。
【０１１６】
ステップＳＴ４４０：
そして、判定部１０３Ａは、このカウント値が所定数に達するか否かを判定し、所定数に達する場合、スタックオーバーフローが不正なデータの入力により引き起こされたものであると判定して、ステップＳＴ５０に移る。また、カウント値が所定数に達しない場合は、ステップＳＴ１０の通常処理に戻る。
【０１１７】
ステップＳＴ５０：
ステップＳＴ５０の処理は、図３のフローチャートと同様である。
すなわち、セキュリティ処理部１０４が、不正データの入力からコンピュータのセキュリティを保護するために、プロセスの停止や、不正アクセスの禁止といった、所定の処理を実行する。
【０１１８】
以上説明したように、本実施形態に係るプログラムによれば、スタックオーバーフローが検知された場合に、スタックオーバーフローにより書き換えられたメモリ上の領域よりデータ列が抽出され、その相関値に基づいて、スタックオーバーフローが不正なデータの入力により引き起こされたものであるか否かの判定が行なわれる。一般に攻撃準備行為に用いられるデータは、解析を容易にするため、周期性を持つ比較的単純なパターンを有することが多いため、書き換えられた結果のデータの相関値を調べることにより、それが攻撃を準備するために入力されたデータであるか否かを推定することが可能になる。したがって、攻撃準備行為の実態を正確に把握することが可能になり、把握した内容を、セキュリティ攻撃に対する事前の対抗措置を講ずるために役立てることができる。
また、図２に示すプログラムと同様に、セキュリティ処理部１０４においてコンピュータのセキュリティ保護処理が実行されるため、攻撃準備行為を抑止して、セキュリティ攻撃を未然に防止することができる。
【０１１９】
＜第３の実施形態＞
次に、本発明の第３の実施形態について述べる。
【０１２０】
上述した第２の実施形態と第３の実施形態との違いは、第２の実施形態において、相関値が所定のしきい値を超える位相の数に基づいて不正データの入力に関する判定が行なわれるところを、第３の実施形態においては、相関値のばらつきを示す所定の統計量に基づいて上記の判定が行なわれる点にある。
【０１２１】
例として以下に説明する本実施形態に係るプログラムは、図２に示すプログラムにおいて、データ取得部１０２および判定部１０３を、上述したデータ取得部１０２Ａおよび後述する判定部１０３Ｂへ置き換えたものである。このプログラムは、例えば、図１に示すコンピュータにおいて実行される。
【０１２２】
まず、第２の実施形態のプログラムに対して異なる構成である、判定部１０３Ｂについて説明する。
【０１２３】
［判定部１０３Ｂ］
判定部１０３Ｂは、データ取得部１０２Ａにおいて抽出されたデータ列の相関値を各位相において算出し、算出した複数の相関値のばらつきを示す所定の統計量（例えば標準偏差）を算出する。そして、この算出した統計量に基づいて、スタックオーバーフローが不正なデータの入力により引き起こされたものであるか否かを判定する。
【０１２４】
次に、上述した構成を有するプログラムの処理について、図６に示すフローチャートを参照して説明する。
【０１２５】
ステップＳＴ１０〜ＳＴ３０，ＳＴ４１０：
ステップＳＴ１０〜ＳＴ３０，ＳＴ４１０の処理は、図５のフローチャートと同様である。
すなわち、通常処理（ステップＳＴ１０）の過程においてスタックオーバーフローの発生の有無が監視され（ステップＳＴ２０）、スタックオーバーフローの発生が検知された場合、書き換えられた結果のデータが抽出され（ステップＳＴ３０）、その相関値が算出される（ステップＳＴ４１０）。
【０１２６】
ステップＳＴ４３０：
判定部１０３Ｂは、各位相の相関値を算出すると、算出した複数の相関値のばらつきを示す統計量として、例えば標準偏差を算出する。
【０１２７】
ステップＳＴ４５０：
そして、判定部１０３Ｂは、算出した標準偏差と所定のしきい値とを比較し、標準偏差が所定のしきい値より大きい場合、すなわち、相関値のばらつき度合いが大きい場合に、スタックオーバーフローが不正なデータの入力により引き起こされたものであると判定して、ステップＳＴ５０に移る。また、標準偏差がこのしきい値に達しない場合は、ステップＳＴ１０の通常処理に戻る。
【０１２８】
ステップＳＴ５０：
ステップＳＴ５０の処理は、図３のフローチャートと同様であり、プロセスの停止や、不正アクセスの禁止といった、所定のセキュリティ保護処理が実行される。
【０１２９】
以上説明したように、本実施形態に係るプログラムによれば、スタックオーバーフローが検知された場合に、スタックオーバーフローにより書き換えられたメモリ上の領域において抽出されたデータ列の相関値のばらつき度合いに基づいて、スタックオーバーフローが不正なデータの入力により引き起こされたものであるか否かの判定が行なわれる。したがって、本実施形態においても、第２の実施形態と同様に、攻撃準備行為の実態を正確に把握することが可能になる。
また、第１、第２の実施形態と同様にして、適切なセキュリティ保護処理が実行されるため、攻撃準備行為の抑止と、セキュリティ攻撃の未然の防止を図ることができる。
【０１３０】
＜第４の実施形態＞
次に、本発明の第４の実施形態について述べる。
【０１３１】
第４の実施形態では、上述した第２および第３の実施形態における相関値に基づいた判定方法を組み合わせて、スタックオーバーフローが不正データの入力により引き起こされたものであるか否かの判定が行なわれる。
【０１３２】
例として以下に説明する本実施形態に係るプログラムは、図２に示すプログラムにおいて、データ取得部１０２および判定部１０３を、上述したデータ取得部１０２Ａおよび後述する判定部１０３Ｃへ置き換えたものである。このプログラムは、例えば、図１に示すコンピュータにおいて実行される。
【０１３３】
まず、第２の実施形態のプログラムに対して異なる構成である、判定部１０３Ｃについて説明する。
【０１３４】
［判定部１０３Ｃ］
判定部１０３Ｃは、データ取得部１０２Ａにおいて抽出されたデータ列の相関値を算出し、算出した相関値が所定のしきい値を超えるか否かを、各位相について調べる。そして、相関値が所定のしきい値を超える位相の数をカウントし、このカウント値に基づいて、スタックオーバーフローが不正なデータの入力により引き起こされたものであるか否かに関する第１の仮判定を行なう。
さらに、判定部１０３Ｃは、この算出した複数の相関値のばらつきを示す所定の統計量（例えば標準偏差）を算出し、算出した統計量に基づいて、スタックオーバーフローが不正なデータの入力により引き起こされたものであるか否かに関する第２の仮判定を行なう。
そして、判定部１０３Ｃは、第１の仮判定および第２の仮判定の判定結果に基づいて、スタックオーバーフローが不正なデータの入力により引き起こされたものであるか否かを最終判定する。
【０１３５】
例えば、判定部１０３Ｃは、第１の仮判定および第２の仮判定の何れか一方の判定結果において、スタックオーバーフローが不正データの入力により引き起こされたものであると仮判定される回数をカウントする。
そして、第１の仮判定および第２の仮判定の両方においてスタックオーバーフローが不正データの入力により引き起こされたものであると仮判定される場合、または、上述したカウント数が所定の回数に達する場合に、スタックオーバーフローが不正データの入力により引き起こされたものであると最終判定する。
【０１３６】
次に、上述した構成を有するプログラムの処理について、図７および図８に示すフローチャートを参照して説明する。
【０１３７】
ステップＳＴ２：
まず、後述の判定処理において用いるカウンタ変数Ｃの値が‘０’にクリアされる。
【０１３８】
ステップＳＴ４：
次いで、後述の判定処理において用いるフラグ変数Ｆ１およびＦ２の値が‘０’にクリアされる。
【０１３９】
ステップＳＴ１０〜ＳＴ３０，ＳＴ４１０〜ＳＴ４３０：
ステップＳＴ１０〜ＳＴ３０，ＳＴ４１０〜ＳＴ４３０の処理は、図５および図６のフローチャートにおける同一符号の処理と同様である。
すなわち、通常処理（ステップＳＴ１０）の過程においてスタックオーバーフローの発生の有無が監視され（ステップＳＴ２０）、スタックオーバーフローの発生が検知された場合、書き換えられた結果のデータが抽出され（ステップＳＴ３０）、その相関値が算出される（ステップＳＴ４１０）。そして、相関値がしきい値を超える位相の数がカウントされるとともに（ステップＳＴ４２０）、相関値のばらつきを示す標準偏差が算出される（ステップＳＴ４３０）。
【０１４０】
ステップＳＴ４４０、ＳＴ４４５：
判定部１０３Ｃは、ステップＳＴ４２０においてカウントされた位相の数が、所定のしきい値を超えるか否かの判定を行なう（ステップＳＴ４４０）。所定のしきい値を超える場合は、フラグ変数Ｆ１を‘１’に変更し（ステップＳＴ４４５）、所定のしきい値を超えない場合は、フラグ変数Ｆ１を‘０’のままにして、ステップＳＴ４５０に移行する。値‘１’のフラグ変数Ｆ１は、上述した第１の仮判定において、スタックオーバーフローが不正データの入力によるとの判定結果を示す。
【０１４１】
ステップＳＴ４５０、ＳＴ４５５：
さらに、判定部１０３Ｃは、ステップＳＴ４３０において算出された標準偏差が、所定のしきい値を超えるか否かの判定を行なう。（ステップＳＴ４５０）。所定のしきい値を超える場合は、フラグ変数Ｆ２を‘１’に変更し（ステップＳＴ４５５）、所定のしきい値を超えない場合は、フラグ変数Ｆ２を‘０’のままにして、ステップＳＴ４６０に移行する。値‘１’のフラグ変数Ｆ２は、上述した第２の仮判定において、スタックオーバーフローが不正データの入力によるとの判定結果を示す。
【０１４２】
ステップＳＴ４６０：
次いで、判定部１０３Ｃは、フラグ変数Ｆ１およびＦ２が共に‘１’であるか否かを調べる（ステップＳＴ４６０）。フラグ変数Ｆ１およびＦ２が共に‘１’である場合は、スタックオーバーフローが不正データの入力によるとの最終判定を下し、ステップＳＴ５０へ移行する。フラグ変数Ｆ１およびＦ２が共に‘１’でない場合は、ステップＳＴ４６２へ移行する。
【０１４３】
ステップＳＴ４６２〜ＳＴ４６６：
ステップＳＴ４６２において、判定部１０３Ｃは、フラグ変数Ｆ１またはＦ２が‘１’であるか否かを調べる（ステップＳＴ４６２）。フラグ変数Ｆ１またはＦ２が‘１’である場合は、カウンタ変数Ｃに‘１’を加算した後、カウンタ変数Ｃが所定のしきい値を越えるか否かを調べる（ステップＳＴ４６６）。カウンタ変数Ｃがしきい値を超える場合、判定部１０３Ｃは、スタックオーバーフローが不正データの入力によるとの最終判定を下し、ステップＳＴ５０へ移行する。
ステップＳＴ４６２の判定においてフラグ変数Ｆ１およびＦ２が両方‘０’である場合や、ステップＳＴ４６６の判定においてカウンタ変数Ｃがしきい値を超えない場合、判定部１０３Ｃは、処理をステップＳＴ４へ戻す。これにより、フラグ変数Ｆ１およびＦ２が‘０’にクリアされ、ステップＳＴ１０以降の処理が繰り返される。
【０１４４】
ステップＳＴ５０：
ステップＳＴ５０の処理は、図３のフローチャートと同様であり、プロセスの停止や、不正アクセスの禁止といった、所定のセキュリティ保護処理が実行される。
【０１４５】
以上説明したように、本実施形態に係るプログラムによれば、スタックオーバーフローが検知された場合に、スタックオーバーフローにより書き換えられたメモリ上の領域よりデータ列が抽出され、その相関値が算出される。そして、一定のデータ長において相関値が極大となる位相の数や、一定のデータ長における相関値のばらつきの度合いに基づいて、スタックオーバーフローが不正なデータの入力により引き起こされたものであるか否かの判定が行なわれる。したがって、本実施形態においても、上述した第２および第３の実施形態と同様に、攻撃準備行為の実態を正確に把握することが可能になる。
【０１４６】
加えて、本実施形態によれば、相関値の異なる判定方法の組み合わせに基づいて判定が行なわれるため、攻撃準備行為によるスタックオーバーフローの発生をより正確に把握することが可能になる。
また、一方の判定方法においてのみ不正データ入力の仮判定が下される回数をカウントし、それが所定回数に達する場合に不正データ入力の最終判定を下すことから、スタックオーバーフローが頻発する場合において、それが攻撃準備行為によるものか否かを的確に判定することができる。
さらに、第１ないし第３の実施形態と同様にして、適切なセキュリティ保護処理が実行されるため、攻撃準備行為の抑止と、セキュリティ攻撃の未然の防止を図ることができる。
【０１４７】
なお、本発明は上述した実施形態に限定されない。
例えば、本発明のプログラムは、上述した実施形態のようにＲＯＭ４０に予め書き込まれたものでも良いし、記憶装置２０から読み出したものでも良い。あるいは、入出力部３０において光ディスクなどの記録媒体から読み出したものや、ネットワークを介して他の機器から入力したものでも良い。あるいは、上述のような幾つかの方法によって取得されたプログラムの部分データを組み合わせたものでも良い。
【０１４８】
また、本発明は、上述した実施形態のように、プログラムによって実現することも可能であるが、その一部または全部の処理を、専用のハードウェアによって実行させることも可能である。例えば、図２に示すブロック図において、機能ブロックの一部または全部をハードウェアの回路に置き換えることも可能である。その場合の回路は、ＣＰＵと同一の半導体チップ上に形成しても良いし、別のチップ上に形成しても良い。
【図面の簡単な説明】
【０１４９】
【図１】本発明の実施形態に係るコンピュータの構成の一例を示すブロック図である。
【図２】本発明の第１の実施形態に係るプログラムの機能的な構成の一例を示すブロック図である。
【図３】第１の実施形態に係るプログラムによる処理の流れの一例を図解したフローチャートである。
【図４】判定部における自己相関値の算出方法の一例を説明するための図である。
【図５】第２の実施形態に係るプログラムによる処理の流れの一例を図解したフローチャートである。
【図６】第３の実施形態に係るプログラムによる処理の流れの一例を図解したフローチャートである。
【図７】第４の実施形態に係るプログラムによる処理の流れの一例を図解した第１のフローチャートである。
【図８】第４の実施形態に係るプログラムによる処理の流れの一例を図解した第２のフローチャートである。
【図９】Ｃ言語のソース・コードの一例を示す図である。
【図１０】図９に示すソース・コードが実行された場合におけるスタックの状態の一例を図解した図である。
【図１１】スタックオーバーフローが発生した場合におけるスタックの状態の一例を図解した図である。
【図１２】スタックスマッシング攻撃によって攻撃コードが実行される様子を図解した図である。
【図１３】非特許文献１の方法によるスタックスマッシング攻撃の防御方法を説明するための図である。
【図１４】非特許文献２の方法によるスタックスマッシング攻撃の防御方法を説明するための第１の図である。
【図１５】非特許文献２の方法によるスタックスマッシング攻撃の防御方法を説明するための第２の図である。
【符号の説明】
【０１５０】
１０…ＣＰＵ、２０…記憶装置、３０…入出力部、４０…プログラムメモリ、５０…ＲＡＭ、１０１…オーバーフロー検知部、１０２，１０２Ａ…データ取得部、１０３，１０３Ａ，１０３Ｂ，１０３Ｃ…判定部、セキュリティ処理部１０４
【図１】
2005032185.tif 000003
【図２】
2005032185.tif 000004
【図３】
2005032185.tif 000005
【図４】
2005032185.tif 000006
【図５】
2005032185.tif 000007
【図６】
2005032185.tif 000008
【図７】
2005032185.tif 000009
【図８】
2005032185.tif 000010
【図９】
2005032185.tif 000011
【図１０】
2005032185.tif 000012
【図１１】
2005032185.tif 000013
【図１２】
2005032185.tif 000014
【図１３】
2005032185.tif 000015
【図１４】
2005032185.tif 000016
【図１５】
2005032185.tif 000017