特許第5777843号(P5777843)IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 株式会社 エーティーティーコンサルティングの特許一覧

特許5777843プロセッサ、処理装置、プログラム作成方法
<>
  • 特許5777843-プロセッサ、処理装置、プログラム作成方法 図000002
  • 特許5777843-プロセッサ、処理装置、プログラム作成方法 図000003
  • 特許5777843-プロセッサ、処理装置、プログラム作成方法 図000004
  • 特許5777843-プロセッサ、処理装置、プログラム作成方法 図000005
  • 特許5777843-プロセッサ、処理装置、プログラム作成方法 図000006
  • 特許5777843-プロセッサ、処理装置、プログラム作成方法 図000007
  • 特許5777843-プロセッサ、処理装置、プログラム作成方法 図000008
  • 特許5777843-プロセッサ、処理装置、プログラム作成方法 図000009
  • 特許5777843-プロセッサ、処理装置、プログラム作成方法 図000010
  • 特許5777843-プロセッサ、処理装置、プログラム作成方法 図000011
  • 特許5777843-プロセッサ、処理装置、プログラム作成方法 図000012
  • 特許5777843-プロセッサ、処理装置、プログラム作成方法 図000013
  • 特許5777843-プロセッサ、処理装置、プログラム作成方法 図000014
  • 特許5777843-プロセッサ、処理装置、プログラム作成方法 図000015
  • 特許5777843-プロセッサ、処理装置、プログラム作成方法 図000016
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B1)
(11)【特許番号】5777843
(24)【登録日】2015年7月17日
(45)【発行日】2015年9月9日
(54)【発明の名称】プロセッサ、処理装置、プログラム作成方法
(51)【国際特許分類】
   G06F 21/52 20130101AFI20150820BHJP
   G06F 21/12 20130101ALI20150820BHJP
【FI】
   G06F21/52
   G06F21/12
【請求項の数】7
【全頁数】16
(21)【出願番号】特願2015-517519(P2015-517519)
(86)(22)【出願日】2013年9月24日
(86)【国際出願番号】JP2013075601
【審査請求日】2015年4月2日
【早期審査対象出願】
(73)【特許権者】
【識別番号】515090640
【氏名又は名称】株式会社 エーティーティーコンサルティング
(74)【代理人】
【識別番号】100183988
【弁理士】
【氏名又は名称】渡邉 泰帥
(72)【発明者】
【氏名】田代 芳樹
(72)【発明者】
【氏名】池田 成宏
【審査官】 岸野 徹
(56)【参考文献】
【文献】 特開2013−131157(JP,A)
【文献】 特開平11−161548(JP,A)
【文献】 国際公開第2005/024630(WO,A1)
【文献】 米国特許出願公開第2011/0277035(US,A1)
【文献】 江藤博明,依田邦和,propolice:スタックスマッシング攻撃検出手法の改良,情報処理学会論文誌,日本,社団法人情報処理学会,2002年12月15日,第43巻,第12号,p.4034-p.4041
(58)【調査した分野】(Int.Cl.,DB名)
G06F 21/52
G06F 21/12
(57)【特許請求の範囲】
【請求項1】
主処理実行の前にメモリにプロセス空間を割り当てる機能を有し、戻り先が前記プロセス空間の任意の領域に戻ることができるリターン命令を含む処理を行うプロセッサにおいて、
前記プロセス空間内の第1の領域を特定する第1特定情報を取得する手段と、
前記第1特定情報を記憶する第1記憶手段と、
前記処理からリターン命令を予め検出するリターン命令検出手段と、
前記リターン命令によって戻される所を特定するアドレス情報を取得する手段と、
前記第1特定情報に基づき、前記アドレス情報により特定される所が前記第の領域内にあるか否かを判定する手段と、
前記判定する手段が、前記特定される所が前記第の領域内にあると判定した場合に、前記処理を中断する手段と、
を備えるプロセッサ。
【請求項2】
前記第記憶手段は、レジスタを含むこと
を特徴とする請求項1に記載のプロセッサ。
【請求項3】
前記第の領域は、プロセス空間内であって、テキスト領域又は共有ライブラリ以外の領域であること
を特徴とする請求項1又は請求項2に記載のプロセッサ。
【請求項4】
前記第の領域は、プロセス空間内であって、スタック領域であること
を特徴とする請求項1又は請求項2に記載のプロセッサ。
【請求項5】
請求項1から請求項4のいずれか項に記載のプロセッサと、
前記メモリと、
前記プロセッサ及び前記メモリの間を通信可能にする通信手段と、
を備える処理装置。
【請求項6】
主処理実行の前にメモリにプロセス空間を割り当てる機能を有し、戻り先が前記プロセス空間の任意の領域に戻ることができるリターン命令を含む処理を行うプロセッサに行わせる方法が実行可能なプログラムを、コンピュータを用いて作成する方法において、
前記プロセス空間内の第の領域を特定する第1特定情報を取得するステップと、
前記第特定情報を記憶するステップと、
前記処理からリターン命令を予め検出するステップと、
前記リターン命令によって戻される所を特定するアドレス情報を取得するステップと、
前記第1特定情報に基づき、前記アドレス情報により特定される所が前記第1の領域内にあるか否かを判定するステップと、
前記判定する手段が、前記特定される所が前記第の領域内にあると判定した場合に、前記プロセッサが前記処理を中断するステップと、
を前記プロセッサに行わせるように、前記コンピュータが前記リターン命令を書き換えるステップを含む、
プログラム作成方法。
【請求項7】
前記書き換えるステップの前に、前記実行可能なプログラムを前記コンピュータがアセンブリ言語に変換するステップと、
前記書き換えるステップにおいて、前記リターン命令を書き換えるステップは、アセンブリ言語において行われ、
前記書き換えるステップの後に、変換された前記実行可能なプログラムを実行形式に変換するステップと、
を含むことを特徴とする請求項6に記載のプログラム作成方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、バッファオーバーフローによる不正なプログラムの実行を防止する技術に関するものである。
【背景技術】
【0002】
コンピュータ上でアプリケーションプログラムの主処理が実行される前に、スタートアップルーチンが動作してメモリ上にスタック領域が割り付けられる。スタック領域は関数の戻り値など一時的に使用される変数を格納するためのメモリ領域であるが、スタック領域に割り当てられたバッファ領域の上限をこえてデータが書き込まれることにより、バッファ領域以外のスタック領域のデータが上書きされることがある。これを、バッファオーバーフローという。
また意図的にバッファオーバーフローを生じさせることによりスタック領域に記憶されたリターンアドレスを書き換えることで、書き換えられたリターンアドレスで指示される不正なプログラムを実行させることをバッファオーバーフロー攻撃という。
バッファオーバーフローやバッファオーバーフロー攻撃に対処する技術として次のような技術が開示されている。
【0003】
特許文献1には、バッファオーバーフローするプログラムの修正に必要となる分析情報を収集してプログラム開発者に提供するための分析方法が記載されている。
【0004】
特許文献2には、バッファメモリ領域に隣接する前後のアドレスにダミーメモリ領域を割り当てることによりバッファオーバーフローを検出する方法が記載されている。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開2006−053760号公報
【特許文献2】特開2009−259078号公報
【発明の概要】
【発明が解決しようとする課題】
【0006】
しかしながら、特許文献1のようなバッファオーバーフローするプログラムを修正に必要となる分析情報を収集してプログラムの修正を行う対処方法では、既知の攻撃への対処しか行うことができず未知の攻撃には対処できないことから確実性に課題がある。
加えて、プログラム開発者によるプログラムの修正作業が適宜必要であるとの課題がある。
【0007】
また、特許文献2に記載のバッファメモリ領域に隣接する前後のアドレスにダミーメモリ領域を割り当てることによりバッファオーバーフローを検出する方法では、連続的にメモリ領域を改変する攻撃には有効だが、ピンポイントでリターンアドレスを書き換えるような巧妙な攻撃には対処できないことから確実性に課題がある。
加えて、コンパイルの前にソースプログラムを解析して処理をプログラムに追加するが、このような方法はプログラムの作成に使用される高級言語に依存するために高級言語ごと個別に対応が必要であるとともに高級言語の改変にも追従する必要があるとの課題がある。
【0008】
本発明は、このような事情を鑑みてなされたものであり、対処のためのプログラム開発者によるプログラム修正作業を行うことなく、プログラムに使用される高級言語に依存することなく、バッファオーバーフローによる不正なプログラムの実行を確実に防止する技術を提供することを目的とする。
【課題を解決するための手段】
【0009】
上記課題を解決するために、本発明は、主処理実行の前にメモリにプロセス空間を割り当てる機能を有し、戻り先が前記プロセス空間の任意の領域に戻ることができるリターン命令を含む処理を行うプロセッサにおいて、前記プロセス空間内の第1の領域を特定する第1特定情報を取得する手段と、前記第1特定情報を記憶する第1記憶手段と、前記処理からリターン命令を予め検出するリターン命令検出手段と、前記リターン命令によって戻される所を特定するアドレス情報を取得する手段と、前記第1特定情報に基づき、前記アドレス情報により特定される所が前記第1の領域内にあるか否かを判定する手段と、前記判定する手段が、前記特定される所が前記第1の領域内にあると判定した場合に、前記処理を中断する手段と、を備えることを特徴とする。
【0010】
また、本発明は、前記第1記憶手段は、レジスタを含むことを特徴とする。
【0011】
また、本発明は、前記第1の領域は、プロセス空間内であって、テキスト領域又は共有ライブラリ以外の領域であることを特徴とする。
【0012】
また、本発明は、前記第1の領域は、プロセス空間内であって、スタック領域であることを特徴とする。
【0013】
上記課題を解決するために、本発明は、前記特徴を有するプロセッサと、前記メモリと、前記プロセッサ及び前記メモリの間を通信可能にする通信手段と、を備える処理装置である。
【0014】
上記課題を解決するために、本発明は、主処理実行の前にメモリにプロセス空間を割り当てる機能を有し、戻り先が前記プロセス空間の任意の領域に戻ることができるリターン命令を含む処理を行うプロセッサに行わせる方法が実行可能なプログラムを、コンピュータを用いて作成する方法において、前記プロセス空間内の第1の領域を特定する第1特定情報を取得するステップと、前記第1特定情報を記憶するステップと、前記処理からリターン命令を予め検出するステップと、前記リターン命令によって戻される所を特定するアドレス情報を取得するステップと、前記第1特定情報に基づき、前記アドレス情報により特定される所が前記第1の領域内にあるか否かを判定するステップと、前記判定する手段が、前記特定される所が前記第1の領域内にあると判定した場合に、前記プロセッサが前記処理を中断するステップと、を前記プロセッサに行わせるように、前記コンピュータが前記リターン命令を書き換えるステップを含む、プログラム作成方法である。
【0015】
また、本発明は、前記書き換えるステップの前に、前記実行可能なプログラムを前記コンピュータがアセンブリ言語に変換するステップと、前記書き換えるステップにおいて、前記リターン命令を書き換えるステップは、アセンブリ言語において行われ、前記書き換えるステップの後に、変換された前記実行可能なプログラムを実行形式に変換するステップと、を含むことを特徴とする。
【発明の効果】
【0016】
本発明によれば、対処のためのプログラム開発者によるプログラム修正作業を行うことなく、プログラムに使用される高級言語に依存することなく、バッファオーバーフローによる不正なプログラムの実行を確実に防止することができる。
【図面の簡単な説明】
【0017】
図1図1は、C言語により記述されたプログラムがコンピュータ上で動作する場合のプロセス空間の論理的な模式図である。
図2図2は、バッファオーバーフローによってリターンアドレスが不正なプログラムのコードのアドレスに書き換えられる例を示したスタック領域の模式図である。
図3図3は、Linux(登録商標)を例としたメモリマップの例である。
図4図4は、処理装置の構成を示すブロック図である。(実施例1、実施例2)
図5図5は、一般的なコンピュータにおいてハードウェアとアプリケーションプログラムを結び付けるカーネルの概念図である。
図6図6は、スタートアップルーチンでのテキスト領域と共有ライブラリの開始アドレスと終了アドレスを取得する手順を示すフローチャートである。(実施例1)
図7図7は、演算ユニットが行う処理の手順を示すフローチャートである。(実施例1)
図8図8は、スタートアップルーチンでのスタック領域の開始アドレスと終了アドレスを取得する手順を示すフローチャートである。(実施例2)
図9図9は、演算ユニットが行う処理の手順を示すフローチャートである。(実施例2)
図10図10は、処理装置の構成を示すブロック図である。(実施例3、実施例4)
図11図11は、メモリマップ取得部がテキスト領域と共有ライブラリの開始アドレスと終了アドレスを取得する手順を示すフローチャートである。(実施例3)
図12図12は、逆アセンブラ、命令挿入部、アセンブラが行う処理の手順を示すフローチャートである。(実施例3)
図13図13は、逆アセンブラ、命令挿入部、アセンブラが行う処理の手順を示すフローチャートである。(実施例3)
図14図14は、メモリマップ取得部がスタック領域の開始アドレスと終了アドレスを取得する手順を示すフローチャートである。(実施例4)
図15図15は、逆アセンブラ、命令挿入部、アセンブラが行う処理の手順を示すフローチャートである。(実施例4)
【発明を実施するための形態】
【0018】
本発明の実施形態について、図面を参照して説明する。
【0019】
まず、バッファオーバーフローとバッファオーバーフロー攻撃について説明する。
図1は、C言語により記述されたプログラムがコンピュータ上で動作する場合のプロセス空間の論理的な模式図である。プロセス空間とは、アドレス空間のうちプロセッサ内でのオペレーションシステムの処理によってプロセスに割り当てられた仮想的なアドレス空間をいう。また、アドレス空間とは、一連のメモリアドレスによってアクセス可能なメモリ空間をいう。図1に示すように、プロセス空間は低位アドレスから高位アドレスへ、テキスト領域、静的領域、ヒープ領域、共有ライブラリ、スタック領域が確保される。テキスト領域には、機械語で翻訳されたプログラムが格納される。静的領域には、グローバル変数などの静的変数が格納される。ヒープ領域は、メモリの動的管理で用いられる。共有ライブラリには、複数のプログラムが共通して利用するライブラリが格納される。スタック領域には、関数の戻り値やローカル変数などの関数で一時的に使用されるデータが格納される。
なお、ここではC言語によりプログラムが記述された例を示したが、C言語と同様のメモリ操作を行う他の言語によって記述された場合も同じである。
【0020】
図2は、バッファオーバーフローによってリターンアドレスが不正なプログラムのコードのアドレスに書き換えられる例を示したスタック領域の模式図である。スタック領域には、ローカル変数などの関数で一時的に使用されるデータを格納するためにバッファ領域が確保されるが、プログラムの動作によってバッファ領域の上限をこえてデータが書き込まれるとバッファ領域以外のスタック領域のデータが上書きされる。これを、バッファオーバーフローという。
【0021】
バッファ領域に格納されるデータは、ファイルからの入力、ネットワークを経由しての入力、キーボードからの入力など、多くはプログラムの外部から読み込まれる。図2に示すように、不正なプログラムを含むデータを外部からバッファ領域の上限をこえてバッファ領域に読み込ませることで意図的にバッファオーバーフローを生じさせることによりスタック領域に記憶されたリターンアドレスを書き換えて不正なプログラムを実行させることをバッファオーバーフロー攻撃という。
【0022】
リターンアドレスで指示される先は実行形式のプログラム又はライブラリであるので、図1に説明したように、リターンアドレスはテキスト領域又は共有ライブラリの範囲でなければならない。
一方、バッファオーバーフロー攻撃によって書き換えられたリターンアドレスは本来プログラムが存在すべきではない領域を指示している。本来プログラムが存在すべきではないスタック領域に不正なプログラムが上書きされて実行される例を図2に示す。
【0023】
本実施形態では、プロセス空間の各領域の開始アドレスと終了アドレスをメモリマップに示される情報から取得する。メモリマップとは、オペレーティングシステムのカーネルにおいてプロセスの状態を示すデータ構造の情報をマッピングしたファイルを指し、例えば、Linux(登録商標)では、/procディレクトリ配下にプロセスIDごとに存在する。
【0024】
図3は、Linux(登録商標)でのメモリマップの例である。符号aに開始アドレスが示され、符号bに終了アドレスが示される。図1に示すように、スタック領域は、あるアドレスから最高位アドレスまでの連続した領域として設定される(符号f)。また、テキスト領域(符号d)と共有ライブラリ(符号e)は、いずれもアクセス権限(符号c)がr−x(読込可、書込不可、実行可)であることから識別ができる。
メモリマップによってプロセス空間の各領域の正確な開始アドレスと終了アドレスを得ることができるために処理の確実性が向上する。
以下、実施例では、オペレーションシステムとしてLinux(登録商標)を例として説明するが、メモリマップが取得できる他のオペレーションシステムによるものであってもよい。
【実施例1】
【0025】
本実施例は、テキスト領域又は共有ライブラリ以外の領域を第1の領域とした処理装置である。スタートアップルーチンを実行することでメモリマップを取得し、メモリマップに示される情報から取得したテキスト領域と共有ライブラリの開始アドレスと終了アドレスを格納する複数組の専用レジスタセットを有し、処理手段を実施する内部命令を有するプロセッサを備えることを特徴とする。
内部命令は、アセンブリ言語のよるリターン命令(RET命令)にニーモニックに対応する図7に示す処理フローを実施する機械語命令である。なお、以下、実施例の記述においては、アセンブリ言語のよるリターン命令をRET命令と記述する。
【0026】
図4は、処理装置1の構成を示すブロック図である。本実施例に係るプロセッサ100は、汎用レジスタ121の他にテキスト領域と共有ライブラリの開始アドレスを格納する開始レジスタ123と終了アドレスを格納する終了レジスタ124の複数組からなる専用レジスタセット122を有する。
処理装置1は、図示しないが外部との入出力装置や記憶装置や表示装置などを含むことができる。
【0027】
次に、スタートアップルーチンについて説明する。
図5は、一般的なコンピュータにおいてハードウェアとアプリケーションプログラムを結び付けるカーネルの概念図である。例えば、アプリケーションプログラムがプロセッサにプログラムの実行を指示する際には、システムコールによってカーネルに処理が渡り、処理が終了すると処理を戻す(exit)。スタートアップルーチンはカーネルの一種で、アプリケーションプログラムの主処理の実行前にアプリケーションプログラムの実行ファイルにリンクされてスタックの設定やライブラリの初期化などを行う。
本実施例は、スタートアップルーチンによって、アプリケーションプログラムの主処理の実行前にメモリマップに示される情報からメモリ上のテキスト領域と共有ライブラリの開始アドレスと終了アドレスを取得されることを特徴とする。
【0028】
メモリマップに示される情報からテキスト領域と共有ライブラリの開始アドレスと終了アドレスを取得する処理ステップについて説明する。
図6は、図4で示される処理装置1がスタートアップルーチンによりテキスト領域と共有ライブラリの開始アドレスと終了アドレスを取得する手順を示すフローチャートである。本実施例では、テキスト領域と共有ライブラリの開始アドレスと終了アドレスが第1特定情報である。
処理装置1は、アプリケーションプログラムの主処理の実行前にアプリケーションプログラムの実行ファイルにリンクされたスタートアップルーチンを実行することで、アプリケーションプログラムの実行ファイルのメモリマップを取得する(ステップS100)。メモリマップは開始アドレスの低位から高位へ昇順にソートする(ステップS110)。
メモリマップには図3で示された情報が含まれている。メモリマップの先頭から順に判定を行う(ステップS120)。アクセス権限がr−x(読込可、書込不可、実行可)の場合にテキスト領域又は共有ライブラリと判定し(ステップS130)、開始アドレスと終了アドレスを同一の専用レジスタセット122にある開始レジスタ123と終了レジスタ124にそれぞれ格納する(ステップS140)。本実施例では、レジスタセットが第1記憶手段である。
【0029】
次に、図7は、図4に示されるプロセッサ100において、演算ユニット120が行う処理の手順を示すフローチャートである。戻り先がプロセス空間の任意の領域に戻ることができるRET命令の処理と比較すると、本実施例でのRET命令の処理には図7のaで示される部分の処理が追加されている。
【0030】
次に、RET命令を検出し、その被演算子として指示されるリターンアドレスを取得する処理ステップについて説明する。
図4で示される処理装置1において、外部との入出力装置や記憶装置からロードされたアプリケーションプログラムは機械語に翻訳された実行命令としてメモリ150のテキスト領域に格納される。プロセッサ100の制御ユニット110では、フェッチ111により実行命令が取得されデコーダ112を経て演算ユニット120へ制御情報が送られる。この際、演算ユニット120がRET命令を検出した場合、RET命令の被演算子として指示されるリターンアドレスを取得する。
【0031】
次に、リターンアドレスがメモリ上のいずれの領域を指示しているか判定する処理ステップについて説明する。
図4で示される処理装置1の演算ユニット120が、RET命令の被演算子として指示されるリターンアドレスを取得(ステップS200)した後、同一の専用レジスタセット122にある開始レジスタ123と終了レジスタ124に格納されている開始アドレスと終了アドレスの範囲かどうかの判定(ステップS220)を行う。
【0032】
次に、リターンアドレスがメモリ上の不正な領域を指示している場合には不正なプログラムの実行を未然に阻止する処理ステップについて説明する。
リターンアドレスの指示先がテキスト領域又は共有ライブラリである場合はリターンアドレスにジャンプ(ステップS250)し、リターンアドレスの指示先がテキスト領域又は共有ライブラリ以外の領域(第1の領域)の場合はプログラムの実行を強制的に終了する(ステップS240)。リターンアドレスの指示先がテキスト領域又は共有ライブラリ以外の領域(第1の領域)の場合とは、リターンアドレスがテキスト領域の開始アドレス以上終了アドレス以下の範囲でも共有ライブラリの開始アドレス以上終了アドレス以下の範囲でもない場合である。
【0033】
以上の説明のとおり、本実施例によれば不正にリターンアドレスが書き換えられた場合に、リターンアドレスの指示先がテキスト領域又は共有ライブラリ以外の領域(第1の領域)の場合はプログラムの実行を強制的に終了することでバッファオーバーフローによる不正なプログラムの実行を防止することができる。
また、プロセッサの内部処理で行うために高速な処理が可能であるとともに、アプリケーションプログラム個別の修正作業が不要であり、プログラムの作成に使用される高級言語に依存しない。
【実施例2】
【0034】
本実施例は、スタック領域を第1の領域とした処理装置である。スタートアップルーチンを実行することでメモリマップを取得し、メモリマップに示される情報から取得したスタック領域の開始アドレスと終了アドレスを格納する一組の専用レジスタセットを有し、処理手段を実施する内部命令を有するプロセッサを備えることを特徴とする。
内部命令は、RET命令にニーモニックに対応する図9に示す処理フローを実施する機械語命令である。
【0035】
図4は、処理装置1の構成を示すブロック図である。本実施例に係るプロセッサ100は、汎用レジスタ121の他にスタック領域の開始アドレスを格納する開始レジスタ123と終了アドレスを格納する終了レジスタ124の一組からなる専用レジスタセット122を有する。スタック領域はひとつの連続した領域なので専用レジスタセット122は一組で足りる。
処理装置1は、図示しないが外部との入出力装置や記憶装置や表示装置などを含むことができる。
【0036】
本実施例は、スタートアップルーチンによって、アプリケーションプログラムの主処理の実行前にメモリマップに示される情報からメモリ上のスタック領域の開始アドレスと終了アドレスを取得されることを特徴とする。
【0037】
メモリマップに示される情報からスタック領域の開始アドレスと終了アドレスを取得する処理ステップについて説明する。
図8は、図4で示される処理装置1がスタートアップルーチンによりスタック領域の開始アドレスと終了アドレスを取得する手順を示すフローチャートである。
処理装置1は、アプリケーションプログラムの主処理の実行前にアプリケーションプログラムの実行ファイルにリンクされたスタートアップルーチンを実行することで、アプリケーションプログラムの実行ファイルのメモリマップを取得する(ステップS300)。メモリマップは開始アドレスの低位から高位へ昇順にソートする(ステップS310)。
メモリマップには図3で示された情報が含まれている。メモリマップの先頭から順に判定を行う(ステップS320)。スタック領域は最高位アドレスまでの連続した領域として設定されるためにメモリマップの最終行を参照する(ステップS330)。終了アドレスを終了レジスタ124に格納する(ステップS330)。本実施例では、レジスタセットが第1記憶手段である。
処理装置1は、当該プロセスのスタックサイズ上限値を取得する(ステップS350)。Linux(登録商標)の場合はulimit−a(シェルスクリプトがbashの場合)などの命令で確認することができる。16進数の演算により得たスタック領域の終了アドレスからスタックサイズ上限値の差分値(スタック領域下限値)を開始レジスタ123にスタック領域の開始アドレスとして格納する(ステップS360)。
メモリマップに示された開始アドレスをそのまま開始レジスタ123に格納しないのはスタック領域のサイズは動的に変更されるが上限値をこえて変更されることはないためである。本実施例では、スタック領域のスタック領域下限値と終了アドレスが第1特定情報である。
【0038】
次に、図9は、図4に示されるプロセッサ100において、演算ユニット120が行う処理の手順を示すフローチャートである。戻り先がプロセス空間の任意の領域に戻ることができるRET命令の処理と比較すると、本実施例でのRET命令の処理には図9のaで示される部分の処理が追加されている。
【0039】
次に、RET命令を検出し、その被演算子として指示されるリターンアドレスを取得する処理ステップについて説明する。
図4で示される処理装置1において、外部との入出力装置や記憶装置からロードされたアプリケーションプログラムは機械語に翻訳された実行命令としてメモリ150のテキスト領域に格納される。プロセッサ100の制御ユニット110では、フェッチ111により実行命令が取得されデコーダ112を経て演算ユニット120へ制御情報が送られる。この際、演算ユニット120がRET命令を検出した場合、RET命令の被演算子として指示されるリターンアドレスを取得する。
【0040】
次に、リターンアドレスがメモリ上のいずれの領域を指示しているか判定する処理ステップについて説明する。
処理装置1の演算ユニット120が、RET命令の被演算子として指示されるリターンアドレスを取得(ステップS400)した後、開始レジスタ123に格納されている開始アドレスとリターンアドレスの値の大小について判定(ステップS410)を行う。リターンアドレスがスタック領域下限値よりも大きい又は等しいならばスタック領域を指示していると判定する。
【0041】
次に、リターンアドレスがメモリ上の不正な領域を指示している場合には不正なプログラムの実行を未然に阻止する処理ステップについて説明する。
リターンアドレスがスタック領域下限値よりも小さければリターンアドレスにジャンプ(ステップS430)し、リターンアドレスがスタック領域下限値よりも大きい又は等しいならばプログラムの実行を強制的に終了する(ステップS420)。
【0042】
以上の説明のとおり、本実施例によれば不正にリターンアドレスが書き換えられた場合に、リターンアドレスの指示先がスタック領域である場合はプログラムの実行を強制的に終了することでバッファオーバーフローによる不正なプログラムの実行を防止することができる。
また、プロセッサの内部処理で行うために高速な処理が可能であるとともに、アプリケーションプログラム個別の修正作業が不要であり、プログラムの作成に使用される高級言語に依存しない。
実施例1と比べると、不正なプログラムがスタック領域に書き込まれている場合に限定されるが、専用レジスタセットが一組で足りるとの特徴を有する。
【実施例3】
【0043】
本実施例は、テキスト領域又は共有ライブラリ以外の領域を第1の領域とした処理装置である。本実施例は、バッファオーバーフローにより不正にリターンアドレスが書き換えられた場合には不正なプログラムの実行を未然に阻止するようにアプリケーションプログラムのアセンブリコードに命令を追加することを特徴とする。
【0044】
図10は、本実施例による処理装置3の構成を示すブロック図である。処理装置3は、プロセッサ300、メモリマップ取得部310、逆アセンブラ320、リターン命令検出部330、命令挿入部340、アセンブラ350、メモリ360を備えた装置である。
【0045】
本実施例はアプリケーションプログラムの実行ファイルが実行される前に動作する。
メモリマップ取得部310は、メモリマップに示される情報からテキスト領域と共有ライブラリの開始アドレスと終了アドレスを取得する。本実施例では、テキスト領域と共有ライブラリの開始アドレスと終了アドレスが第1特定情報である。
リターン命令検出部330は、RET命令を検出する。
命令挿入部340は、RET命令の被演算子として指示されるリターンアドレスを取得するためのリターンアドレス取得命令、リターンアドレスがメモリ上のいずれの領域を指示しているか判定するための判定命令、リターンアドレスがメモリ上の不正な領域を指示している場合には不正なプログラムの実行を未然に阻止する強制終了命令を挿入する。
【0046】
図11は、処理装置3においてメモリマップ取得部310がテキスト領域と共有ライブラリの開始アドレスと終了アドレスを取得する手順を示すフローチャートである。
【0047】
処理装置3は、実行しようとするアプリケーションプログラムの実行ファイルのメモリマップを取得する(ステップS500)。メモリマップは開始アドレスの低位から高位へ昇順にソートする(ステップS510)。メモリマップには図3で示された情報が含まれている。メモリマップの先頭から順に判定を行う(ステップS520)。アクセス権限がr−x(読込可、書込不可、実行可)の場合にテキスト領域又は共有ライブラリと判定し(ステップS720)、リターンアドレスを保存するための領域をメモリ360に確保したうえで開始アドレスと終了アドレスを格納する(ステップS540)。本実施例では、メモリが第1記憶手段である。
【0048】
図12及び図13は、逆アセンブラ320、リターン命令検出部330、命令挿入部340、アセンブラ350が行う処理の手順を示すフローチャートである。
処理装置3は、逆アセンブラ320によって対象となるアプリケーションプログラムを逆アセンブルする(ステップS600)。
その後、リターン命令検出部330ではRET命令かを判定する(ステップS620)。RET命令ならば命令挿入部340へ処理を渡す。
【0049】
処理装置3は、命令挿入部340ではアプリケーションプログラムのアセンブリコードのRET命令の前に次の3つの命令を挿入する。
まず、RET命令の被演算子として指示されるリターンアドレスを取得するリターンアドレス取得命令を挿入(ステップS630)する。
次に、リターンアドレスがテキスト領域又は共有ライブラリを指示しているかを判定する判定命令を挿入(ステップS640)する。
リターンアドレスがテキスト領域又は共有ライブラリを指示しているかの判定は、リターンアドレスがリターンアドレスを保存するための領域に格納されているテキスト領域及び共有ライブラリの開始アドレスと終了アドレスの範囲かどうかの判定による。
次に、リターンアドレスがテキスト領域又は共有ライブラリを指示していなければプログラムを強制的に終了する強制終了命令を挿入(ステップS650)する。リターンアドレスの指示先がテキスト領域又は共有ライブラリ以外の領域(第1の領域)の場合とは、リターンアドレスがテキスト領域の開始アドレス以上終了アドレス以下の範囲でも共有ライブラリの開始アドレス以上終了アドレス以下の範囲でもない場合である。
【0050】
図12に示す手順により命令挿入部340により命令が挿入される(ステップS640及びステップS650)ことで、テキスト領域が拡張されている。このため、図13に示すように命令が挿入されたアセンブリコードをアセンブルにより実行ファイルとした後(ステップS700)、再度、逆アセンブルを行ったアセンブルコード(ステップS740)について再度取得したメモリマップから得たテキスト領域の開始アドレスと終了アドレスで更新を行う(ステップS750)。その後、アセンブラ350によってアセンブルして対象となるアプリケーションプログラムの実行ファイルを完成する(ステップS760)。
【0051】
以上の説明のとおり、本実施例によれば不正にリターンアドレスが書き換えられた場合に、リターンアドレスの指示先がテキスト領域と共有ライブラリのいずれでもない場合はプログラムの実行を強制的に終了するようにアプリケーションプログラムに命令を追加することでバッファオーバーフローによる不正なプログラムの実行を未然に防止することができるプログラムに変換する。
また、処理装置が、自動的にアセンブリコードへの命令追加を行うために、アプリケーションプログラム個別の修正作業が不要であり、プログラムの作成に使用される高級言語に依存しない。
【実施例4】
【0052】
本実施例は、スタック領域を第1の領域とした処理装置である。バッファオーバーフローにより不正にリターンアドレスが書き換えられた場合には不正なプログラムの実行を未然に阻止するようにアプリケーションプログラムのアセンブリコードに命令を追加することを特徴とする。
【0053】
図10は、本実施例による処理装置3の構成を示すブロック図である。処理装置3は、プロセッサ300、メモリマップ取得部310、逆アセンブラ320、リターン命令検出部330、命令挿入部340、アセンブラ350、メモリ360を備えた装置である。
【0054】
本実施例はアプリケーションプログラムの実行ファイルが実行される前に動作する。
メモリマップ取得部310は、メモリマップに示される情報からスタック領域の開始アドレスと終了アドレスを取得する。
リターン命令検出部330は、RET命令を検出する。
命令挿入部340は、RET命令の被演算子として指示されるリターンアドレスを取得するためのリターンアドレス取得命令、リターンアドレスがメモリ上のいずれの領域を指示しているか判定するための判定命令、リターンアドレスがメモリ上の不正な領域を指示している場合には不正なプログラムの実行を未然に阻止する強制終了命令を挿入する。
【0055】
図14は、処理装置3においてメモリマップ取得部310がスタック領域の開始アドレスと終了アドレスを取得する手順を示すフローチャートである。
処理装置3は、実行しようとするアプリケーションプログラムの実行ファイルのメモリマップを取得する(ステップS800)。メモリマップは開始アドレスの低位から高位へ昇順にソートする(ステップS810)。メモリマップには図3で示された情報が含まれている。メモリマップの先頭から順に判定を行う(ステップS820)。スタック領域は最高位アドレスまでの連続した領域として設定されるためにメモリマップの最終行を参照する(ステップS830)。リターンアドレスを保存するための領域をメモリ360に確保したうえで終了アドレスを格納する(ステップS840)。
次に、処理装置3は、当該プロセスのスタックサイズ上限値を取得する(ステップS850)。Linux(登録商標)の場合はulimit−a(シェルスクリプトがbashの場合)などの命令で確認することができる。16進数の演算により得たスタック領域の終了アドレスからスタックサイズ上限値の差分値(スタック領域下限値)を保存するための領域をメモリ360に確保したうえで格納する(ステップS860)。本実施例では、メモリが第1記憶手段である。
メモリマップに示された開始アドレスをそのままリターンアドレスを保存するための領域に格納しないのはスタック領域のサイズは動的に変更されるが上限値をこえて変更されることはないためである。本実施例では、スタック領域のスタック領域下限値と終了アドレスが第1特定情報である。
【0056】
図15は、逆アセンブラ420、命令挿入部430、アセンブラ440が行う処理の手順を示すフローチャートである。
処理装置3は、逆アセンブラ420によって対象となるアプリケーションプログラムを逆アセンブルする(ステップS900)。
その後、リターン命令検出部330ではRET命令かを判定する(ステップS920)。RET命令ならば命令挿入部430へ処理を渡す。
処理装置3は、命令挿入部430ではアプリケーションプログラムのアセンブリコードのRET命令の前に次の3つの命令を挿入する。
まず、RET命令の被演算子として指示されるリターンアドレスを取得するリターンアドレス取得命令を挿入(ステップS930)する。
次に、リターンアドレスがスタック領域を指示しているかを判定する判定命令を挿入(ステップS940)する。
リターンアドレスがスタック領域を指示しているかの判定は、リターンアドレスがスタック領域下限値よりも大きい又は等しいならばリターンアドレスがスタック領域を指示していると判定する。
次に、リターンアドレスがスタック領域を指示していればプログラムを強制的に終了する強制終了命令を挿入(ステップS950)する。これにより、リターンアドレスがメモリ上の不正な領域を指示している場合には不正なプログラムの実行を未然に阻止する。
【0057】
以上の説明のとおり、本実施例によれば不正にリターンアドレスが書き換えられた場合に、リターンアドレスの指示先がスタック領域である場合はプログラムの実行を強制的に終了するようにアプリケーションプログラムに命令を追加することでバッファオーバーフローによる不正なプログラムの実行を未然に防止することができる。
また、処理装置が、自動的にアセンブリコードへの命令追加を行うために、アプリケーションプログラム個別の修正作業が不要であり、プログラムの作成に使用される高級言語に依存しない。
実施例3と比べると、不正なプログラムがスタック領域に書き込まれている場合に限定されるが、プログラムの実行サイズが小さいので更新処理が速いとの特徴を有する。
【産業上の利用可能性】
【0058】
バッファオーバーフローによる不正なプログラムの実行を未然に防止できる。
【符号の説明】
【0059】
1 処理装置
100 プロセッサ
110 制御ユニット
111 フェッチ
112 デコード
120 演算ユニット
121 汎用レジスタ
122 専用レジスタセット
123 開始レジスタ
124 修了レジスタ
125 演算器
150 メモリ
3 処理装置
300 プロセッサ
310 メモリマップ取得部
320 逆アセンブラ
330 リターン命令検出部
340 命令挿入部
350 アセンブラ
【要約】
本発明は、バッファオーバーフローによる不正なプログラムの実行を確実に防止する技術を提供することを目的とする。
本発明は、メモリ上の各領域の開始アドレスと終了アドレスを取得し、アセンブリ言語によるリターン命令を検出し、その被演算子として指示されるリターンアドレスを取得し、リターンアドレスがメモリ上のいずれの領域
を指示しているか判定し、リターンアドレスがメモリ上の不正な領域を指示している場合には不正なプログラムの実行を未然に防止する。
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14
図15