(57)【要約】【課題】  セキュリティホールの発生原因と言われるバッファオーバーラン現象を利用したコンピュータウイルスや不正アクセスを抑制することのできるオペレーティングシステム、及びそれを記録した記録媒体を提供する。【解決手段】  ＡＰＩ（アプリケーションプログラムインタフェイス）またはシステムコールをプログラムに提供するオペレーティングシステム１００において、プログラムから要求されたＡＰＩまたはシステムコールの実行前に、メモリ装置上における前記プログラムの格納アドレスを読み取るアドレス取得手段５を備え、ＡＰＩを要求したプログラムを１次プログラムとし、１次プログラムがサブルーチンである場合、１次プログラムの呼び出し元となる２次〜ｎ次（ｎは２以上の整数）プログラムまでが、順に呼び出し階層を形成していると定義すると、前記アドレス取得手段５は、１次プログラムの格納アドレスと、２次〜ｎ次プログラムまでの格納アドレスをそれぞれ取得する。【特許請求の範囲】
【請求項１】
ＡＰＩ（アプリケーションプログラムインタフェイス）またはシステムコールをプログラムに提供するオペレーティングシステムにおいて、
プログラムから要求されたＡＰＩまたはシステムコールの実行前に、メモリ装置上における前記プログラムの格納アドレスを読み取るアドレス取得手段を備え、
ＡＰＩを要求したプログラムを１次プログラムとし、１次プログラムがサブルーチンである場合、１次プログラムの呼び出し元となる２次〜ｎ次（ｎは２以上の整数）プログラムまでが、順に呼び出し階層を形成していると定義すると、
前記アドレス取得手段は、１次プログラムの格納アドレスと、２次〜ｎ次プログラムまでの格納アドレスをそれぞれ取得することを特徴とするオペレーティングシステム。
【請求項２】
前記アドレス取得手段が取得したアドレスが、メモリ装置上の適正な位置を示しているか否かを、比較基準となるアドレスと大小比較することにより判定するアドレス比較判定手段と、
メモリ装置上における所定のアドレスを前記比較基準アドレスとして検出する基準アドレス検出手段とを備えることを特徴とする請求項１に記載されたオペレーティングシステム。
【請求項３】
前記基準アドレス検出手段は、プログラムに割り振られたメモリ領域を構成する各領域のアドレスを検出し、各領域のアドレスを、それぞれ前記比較基準アドレスとして設定する機能を有することを特徴とする請求項２に記載されたオペレーティングシステム。
【請求項４】
前記基準アドレス検出手段は、プログラムに割り振られたメモリ領域のうち、プログラム格納用の開始アドレスおよび終了アドレスを検出し、該開始アドレスおよび終了アドレスを前記比較基準アドレスとして設定することを特徴とする請求項２に記載されたオペレーティングシステム。
【請求項５】
前記基準アドレス検出手段は、プログラムに割り振られたメモリ領域のうち、スタックメモリ用の開始アドレスおよび終了アドレスを取得し、該開始アドレスおよび終了アドレスを前記比較基準アドレスとして設定することを特徴とする請求項２に記載されたオペレーティングシステム。
【請求項６】
前記アドレス比較判定手段の判定結果により、プログラムが要求するＡＰＩまたはシステムコールを実行するか否かが決定されることを特徴とする請求項２乃至請求項５のいずれかに記載されたオペレーティングシステム。
【請求項７】
前記アドレス比較判定手段の判定結果により、プログラムが要求するＡＰＩまたはシステムコールの実行の中止を決定した際、
ＡＰＩまたはシステムコールの実行を中止すると共に、警報としての電子メールをシステム管理者に送信することを特徴とする請求項６に記載されたオペレーティングシステム。
【請求項８】
請求項１乃至請求項７のいずれかに記載されたオペレーティングシステムを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】  本発明は、コンピュータウイルスに感染しにくい、安全性の高いオペレーティングシステム、及びそれを記録した記録媒体に関する。
【背景技術】
【０００２】  インターネットの普及に従い、企業、個人用途のコンピュータシステムの多くが、ネットワークに接続し、相互にデータのやり取りをするに至っている。
しかしながら、コンピュータシステムに対し、外部より悪意あるネットワーク利用者が接続し、システム管理者が気付かないうちに、コンピュータシステムが書き換えられる問題が頻繁に発生している。また、所謂コンピュータウイルスと呼ばれる悪意ある実行形式のデータ（プログラム）がシステムに書き込まれるという問題も多く、これらは深刻な社会問題となっている。
尚、コンピュータシステムや、悪意あるネットワーク接続者による行為については、非特許文献１〜３にそれぞれ記載されている。
【非特許文献１】「ハッカー・プログラミング大全」，ＵＮＹＵＮ著
【非特許文献２】「ＯＰＥＲＡＴＩＮＧ  ＳＹＳＴＥＭ  Ｉｎｔｅｒｎａｌｓ  ａｎｄＤｅｓｉｇｎ」，Ｗｉｌｌｉａｍ  Ｓｔａｌｉｎｇｓ，Ｐｈ．Ｄ．著
【非特許文献３】「インテル・アーキテクイチャ最適化マニュアル」，米インテル社
【発明の開示】
【発明が解決しようとする課題】
【０００３】  前記したような悪意あるネットワーク接続者による行為は、コンピュータシステムに存在するセキュリティホールを利用して行われる。このセキュリティホールとは、インターネットを通じた不正アクセス及び、コンピュータウイルスによりコンピュータシステムを破壊改造するための警備の穴である。
現在では、世界中のコンピュータシステムにおいて、多数のセキュリティホールが存在し、前記したように、これを利用した不正アクセス、コンピュータウイルスが社会問題となっている。【０００４】  セキュリティホールの発生原因の一つは、バッファオーバーラン現象にあると言われている。このバッファオーバーラン現象について説明すると、例えば、ある電子メールの送付ソフトにおいて、送付先の入力可能なメールアドレスの最大文字数が５０文字とする。
ここで、送付先のメールアドレスに、１０００文字の長さのメールアドレスを指定すると、（想定していない）５０文字を超えた９５０文字のデータがメモリ領域を超えて書き込まれ、これによりコンピュータの制御が破綻を来たす。このような現象がバッファオーバーラン現象と呼ばれている。【０００５】  更に、バッファオーバーラン現象について、詳細に説明する。図１は、一般的なコンピュータにおいて、アプリケーションプログラム（以下、単にプログラムとも呼ぶ）を実行する際に使用するメモリ装置（単にメモリとも呼ぶ）の構成を模式的に示した図である。【０００６】  図１のメモリ構成のうち、プログラムは領域Ａ１１に格納される。そして、プログラムのデータ処理に使用する領域として、領域Ａ１２、Ａ１３、Ａ１４を確保する。このうち、領域Ａ１２は、プログラム全体で使用するデータの読み書きに使用する。領域Ａ１３は、プログラムを実行する上で、適時データ領域を確保したいときに使用し、プログラムの実行中にメモリ中の領域が伸縮する。また、領域Ａ１４は、スタックメモリと呼称する特殊なメモリ領域であって、プログラムを構成するサブルーチンと呼ばれる小さい構成のプログラムの実行管理と、サブルーチンが一時的に使用するデータの管理を行うための領域である。
尚、サブルーチンとは当文書において次のように定義する。
サブルーチンとはスタックメモリに事前にサブルーチンを実行し終わったら実行すべき次のプログラムの開始アドレスを格納して実行するプログラムと規定するものとする。サブルーチンコールとはこのサブルーチンを呼び出すこと、つまり実行する事を示すものとする。【０００７】  図２に、サンプルプログラムと共に、領域Ａ１４のスタックメモリの働きを模式的に示す。尚、サンプルプログラムはＣ言語により記述されている。
前記サンプルプログラムは、プログラム１２行目でｔｅｓｔという名称のサブルーチン（子プログラム）を呼び出し、それを実行する構成となっている。また、そのサブルーチン実行時に、引数と呼ばれるデータを４つ渡している。即ち、その引数は、‘Ｔ’、‘Ｅ’、‘Ｓ’、‘Ｔ’の４つである。これらのデータは、スタックメモリ上の領域Ａ２１、Ａ２２、Ａ２３、Ａ２４に書き込まれる。【０００８】  このサンプルプログラム実行時において、前記引数がスタックメモリに書き込まれた後、サブルーチン‘ｔｅｓｔ’に制御が移行する。また、このとき、サブルーチン実行終了後にプログラム１３行目に制御が戻るように、スタックメモリの領域Ａ２５に、プログラム１３行目を示すアドレスデータを記憶する。【０００９】  そして、プログラム１４行目から始まるサブルーチン‘ｔｅｓｔ’の実行においては、先ず、プログラム１４行目、１６行目において初期設定が行われる。次いで、１７行目において、変数ｓに‘Ａ’という値が代入される。この値は、スタックメモリの領域Ａ２６に書き込まれる。【００１０】  そして、プログラム１８行目においては、故意に、変数ｓの存在するメモリ領域をアドレス指定し、そこからゼロ（０）を１００文字、メモリに書き込むよう指示している。すなわち、これが実行されると、領域Ａ２１〜Ａ２６を含め、１００文字分の全ての内容が、ゼロに上書きされ、その結果プログラムの流れが破壊される。【００１１】  すなわち、プログラム１９行目において、本来ならば、領域Ａ２５に格納されている、呼び出し元の１３行目のアドレスに戻り、１３行目からの処理に続くのであるが、実際には、領域Ａ２５にはゼロが書き込まれており、プログラムはゼロ番地から実行しようとする。その結果、コンピュータに障害が生じる。【００１２】  以上、説明したように、本来設定されたメモリの領域を超えて不正に書き込まれる現象をバッファオーバーランと呼んでいる。尚、このような脆弱性が現在のＣＰＵ（中央処理装置）には存在しており、コンピュータウイルスや不正アクセスは、前記した現象を利用してコンピュータシステムに不正を働く。また、実際のコンピュータウイルスや不正アクセスにあっては、メモリへの上書きにおいて、自身に都合のよいメモリアドレスを書き込み、ここにプログラムの制御が移行するように仕向け、不正を働くようにしている。【００１３】  不正アクセス利用者は、前記バッファオーバーランを悪用し、スタックメモリ上に自分の不正プログラムを書き込み、これを実行させることによりシステムの制御権を乗っ取る。すなわち、スタックメモリ上の不正プログラムが、不正行為を行う目的でＯＳ（オペレーティングシステム）に対してＡＰＩ（アプリケーションプログラムインタフェイス）またはシステムコールを要求し、実行する。【００１４】  本発明は、前記したような事情のもとになされたものであり、セキュリティホールの発生原因と言われるバッファオーバーラン現象を利用したコンピュータウイルスや不正アクセスを抑制することのできるオペレーティングシステム、及びそれを記録した記録媒体を提供することを目的とする。
【課題を解決するための手段】
【００１５】  前記した課題を解決するため、本発明に係るオペレーティングシステムは、ＡＰＩ（アプリケーションプログラムインタフェイス）またはシステムコールをプログラムに提供するオペレーティングシステムにおいて、プログラムから要求されたＡＰＩまたはシステムコールの実行前に、メモリ装置上における前記プログラムの格納アドレスを読み取るアドレス取得手段を備え、ＡＰＩを要求したプログラムを１次プログラムとし、１次プログラムがサブルーチンである場合、１次プログラムの呼び出し元となる２次〜ｎ次（ｎは２以上の整数）プログラムまでが、順に呼び出し階層を形成していると定義すると、前記アドレス取得手段は、１次プログラムの格納アドレスと、２次〜ｎ次プログラムまでの格納アドレスをそれぞれ取得することに特徴を有する。【００１６】  また、前記アドレス取得手段が取得したアドレスが、メモリ装置上の適正な位置を示しているか否かを、比較基準となるアドレスと大小比較することにより判定するアドレス比較判定手段と、メモリ装置上における所定のアドレスを前記比較基準アドレスとして検出する基準アドレス検出手段とを備えることに特徴を有する。【００１７】  このような構成によれば、プログラムから要求されたＡＰＩを実行する前に、メモリ装置上におけるプログラムの格納アドレスを取得し、そのアドレスが適正な位置を示しているか否かを比較判定することにより、プログラムが適正か不正かを判断することができる。
その結果、ＡＰＩを要求したプログラムを適正なものと判断した場合は、ＡＰＩを実行し、プログラムを不正なものと判断した場合は、プログラムを中断させることができる。したがって、本発明に係るオペレーティングシステムによれば、バッファオーバーラン現象を利用した不正アクセスが発生した場合には、それを抑制し、コンピュータシステムを保護することができる。
【発明の効果】
【００１８】  本発明によれば、セキュリティホールの発生原因と言われるバッファオーバーラン現象を利用したコンピュータウイルスや不正アクセスを抑制することのできるオペレーティングシステム、及びそれを記録した記録媒体を提供することができる。
【発明を実施するための最良の形態】
【００１９】  以下、本発明に係る実施の形態について説明する。本発明に係るオペレーティングシステム（以下、ＯＳと呼ぶ）は、例えば、パーソナルコンピュータシステム等に代表されるような、ＣＰＵ、記憶装置等を備えたハードウエアにおいて好適に機能させることができる。【００２０】  前記ＣＰＵとしては、スタックレジスタ（スタックメモリ専用レジスタ）を備えた全てのＣＰＵに適用することができるが、以下の説明においては、ＩＡ３２（Ｉｎｔｅｌ社の３２ビットマイクロプロセッサ）を例に説明する。
図３に、ＩＡ３２が有するレジスタ・セット２００の概略構成図を示す。以下の説明におけるスタックメモリは、図３中のレジスタ装置Ｒ１１（３２ビット表現でＥＳＰのレジスタ）により管理され、レジスタ装置Ｒ１２（３２ビット表現でＥＢＰのレジスタ）により操作される。【００２１】尚、図３中、３２ビット表現でＥＩＰはプログラムカウンタ（ＣＰＵがこれから実行したいプログラムのメモリのアドレスを示すもの）であり、ＥＡＸ、ＥＢＸ、ＥＣＸ、ＥＤＸ、ＥＳＩ、ＥＤＩ、ＥＢＰの各レジスタは、汎用レジスタである。【００２２】  図４は、本発明に係るＯＳの概略構成を示している。尚、一般にＯＳは、アプリケーションプログラムを代表とするプログラムに対して、ＡＰＩ（アプリケーションプログラムインタフェイス）を提供する。ＡＰＩとは、データファイルの読み書きや、マウス等の周辺装置を制御するための機能を提供するものである。すなわち、アプリケーションプログラムは、ＯＳが提供するＡＰＩを実行することによって、ファイルの読み書き等、ＯＳが提供する様々な機能を利用することができる。また、ＡＰＩは、ＯＳによっては、システムコールとも呼ばれる。【００２３】  図４に示すＯＳ１００は、周辺装置２０を制御するＡＰＩ等を提供するＯＳ本体１と、プログラム（メインルーチンまたはサブルーチン）１０からのＡＰＩ要求窓口となるＡＰＩ入り口２と、記憶装置２０に記録するデータの管理を行うファイル管理システム３とを備える。
以上の構成は、一般的なＯＳ構成と同一であるが、ＯＳ１００においては、さらにＯＳ本体１とＡＰＩ入り口２との間にアドレス比較判定手段４を備える。さらには、アドレス比較判定手段４に対しプログラムの格納アドレスを提供するアドレス取得手段５と、アドレス比較判定手段４に対し比較の基準とするアドレスを提供する基準アドレス検出手段６とを備える。【００２４】  ＡＰＩ入り口２は、プログラムの実行の際に発生するＡＰＩ要求の入り口であって、ＯＳ１００は、この部分で受け付けを行う。一般的なＯＳと同様に、ＯＳ１００が提供するＡＰＩには多数の種類が存在するが、プログラム１０（メインルーチンまたはサブルーチン）からＡＰＩ実行の要求が発生すると、ＡＰＩ入り口２で一括して受け付けし、要求のあったＡＰＩに応じた処理に制御を渡す。【００２５】  アドレス取得手段５は、ＡＰＩを呼び出したプログラム（メインルーチンまたはサブルーチン）のメモリ領域上の格納アドレスを取得する機能を有している。
逐次処理型のコンピュータは、すべてのプログラムの実行をメモリのアドレスにより指定する方式をとる。すなわち、ＡＰＩを要求するサブルーチンのプログラムを１次プログラムとし、１次プログラムの呼び出し元を２次プログラムとし、２次プログラムの呼び出し元を３次プログラムとし、以下、ｎ次（この場合、ｎは４以上の整数）プログラムまでを定義すると、（ｎ−１）次プログラムは、ＡＰＩを実行後に復帰（リターン）して実行するｎ次プログラムのアドレスをメモリに保存している。アドレス取得手段５は、このアドレスをメモリ装置から読み取る働きをする。【００２６】  また、基準アドレス検出手段６は、ＯＳ上において、プログラムの格納が許されている領域と許されていない領域とを判定するためのアドレスを比較基準アドレスとして取得する。ここで、ＯＳ１００を搭載したコンピュータシステムにおいて、プログラム１０を実行する際に使用するメモリ構成の例を図５に示す。
前記比較基準アドレスを取得する具体的な一例としては、図５において、プログラムを格納する領域を示す開始アドレスＡ４０及び終了アドレスＡ４１を取得する方法がある。この方法が論理的に完全な実施例である。【００２７】  しかしながら、実際のＯＳにおいてプログラムを格納する領域は、複数のメモリ領域に分断して格納する場合が多い。その場合、プログラムの格納領域ごとに、その開始アドレスと終了アドレスとを調べる必要があり煩雑である。【００２８】  なお、基準アドレス検出手段６が比較基準アドレスとして取得するアドレスは、適正なプログラム格納領域の開始アドレス及び終了アドレスに限定されるものではない。すなわち、基準アドレス検出手段６は、メモリ領域における所望のアドレスを比較基準アドレスとして設定することができる。
そこで本実施の形態においては、本発明の理解を容易にするため、比較基準アドレスとして、スタック領域の上限及び下限（開始アドレス及び終了アドレス）を取得する方法を簡易例として示す。これは、バッファオーバーランを利用して、不正アクセスを行うプログラムは、その性質上、大多数がプログラム本体をスタック領域に保存するためである。【００２９】  図５のメモリ構成において、ＯＳ１００がプログラム１０に割り振るメモリ領域のうち、スタック領域の上限（０番地方向／終了アドレス）は符号Ａ３７で示すアドレスであり、下限（開始アドレス）は符号Ａ３８に示すアドレスである。
すなわち、基準アドレス検出手段６は、符号Ａ３７、Ａ３８に示したアドレスを取得する。【００３０】  また、図４に示すアドレス比較判定手段４は、アドレス取得手段５が取得したプログラム格納アドレスと、基準アドレス取得手段６が取得した比較基準アドレスとを比較し、ＡＰＩを要求するプログラム（メインルーチンまたはサブルーチン）が不正プログラムであるか否かを判断する。具体的には、アドレス取得手段５が取得した、プログラム格納領域のアドレスが、スタック領域の上限Ａ３７と下限Ａ３８の間にあるか否かを判断する。【００３１】  すなわち、バッファオーバーランを利用して不正プログラムがコンピュータに寄生した場合、通常、その不正プログラムの格納領域は、図５のメモリ構成ではスタック領域中の使用中領域Ａ３４となる。したがって、アドレス取得手段５が取得した、プログラム格納領域のアドレスが、スタック領域の上限Ａ３７と下限Ａ３８の間である場合には、そのプログラムが不正プログラムであると判定される。【００３２】  その場合、アドレス比較判定手段４は、不正プログラムが寄生している旨をＯＳ本体１に通知する。ＯＳ本体１は、ＡＰＩの要求を中断し、プログラムを強制終了させるとともに、警告を電子メール等の手段によりシステム管理者に通知する。
尚、アドレス比較判定手段４による判定の結果、ＡＰＩを要求するプログラムが正常なものであると判断された場合には、要求されたＡＰＩが実行される。【００３３】  続いて、プログラムからＡＰＩの要求があった場合のＯＳ１００の動作について、さらに図６のフロー図に基づいて説明する。
プログラム１０（メインルーチンまたはサブルーチン）からＡＰＩの要求が発生すると、アドレス取得手段５はＡＰＩを要求したプログラムのメモリ上の格納アドレスを取得する（図６のステップＳ１）。【００３４】  ＡＰＩを要求したプログラムを１次プログラムとすれば、取得するアドレスは、１次プログラム中のＡＰＩを要求した部分の次位置を示すアドレスである。すなわち、ＡＰＩを実行した後に復帰（リターン）し、１次プログラムを継続する位置を示すアドレスである。具体的には、例えば、図７のスタックメモリの構成例における領域Ａ５１からアドレスを取得する。【００３５】  また、基準アドレス検出手段６は、ＯＳ１００がプログラム１０に割り振ったメモリ領域を調べ、プログラムが存在してはならない領域のアドレスを比較基準アドレスとして取得する（ステップＳ２）。
前記したように、バッファオーバーランが発生したときに、不正プログラムが寄生するのはスタック領域である。このため、基準アドレス検出手段６は、スタック領域の上限（終了アドレス）Ａ３７と下限（開始アドレス）Ａ３８を取得し、その間の領域を、プログラムの存在してはならない領域として設定する。【００３６】  次いで、アドレス比較判定手段４において、アドレス取得手段５が取得したプログラム格納アドレスと、基準アドレス検出手段６が検出した比較基準アドレスとが比較される（ステップＳ３）。すなわち、アドレス取得手段５が取得したプログラム格納アドレスが、不正なアドレスであるか否かが判断される。【００３７】  具体的には、アドレス取得手段５が取得したプログラム格納アドレスが、基準アドレス検出手段６が検出したアドレス領域内である場合には、プログラム１０は不正であると判断され、領域外である場合にはプログラム１０は適正なものであると判断される。また、前提となるＡＰＩの要求がＯＳ本体である場合もあるため、呼び出し元のアドレスが、ＯＳの管理領域内であるか否かも判断される。ＯＳの管理領域内である場合は、適正な処理が行なわれていると判断する。【００３８】  ステップＳ３において、ＡＰＩを要求したプログラムが不正であると判断されると、システム管理者にその旨を電子メールにて送信し、ＡＰＩの要求を中断し、プログラムを強制終了させる（ステップＳ７）。【００３９】  一方、ステップＳ３において、ＡＰＩを要求したプログラムが正常であると判断されると、さらに、アドレス取得手段５が、ＡＰＩを要求したプログラムの親プログラムの格納アドレス（呼び出し元のアドレスと呼ぶ）を取得し、基準アドレス検出手段６が、プログラム領域Ａ３１の開始アドレス及び終了アドレスを検出して比較基準アドレスに設定する。そして、アドレス比較判定手段４は、ＡＰＩを要求したプログラムの親プログラムの格納アドレスがプログラム領域Ａ３１にあるか否かを判断する（ステップＳ４）。
尚、この処理は、不正プログラムが、共有ライブラリのプログラムを経由してＡＰＩを実行する可能性があるために行なわれる。【００４０】  ステップＳ４において、呼び出し元アドレスが、プログラム領域Ａ３１の外である場合、共有ライブラリのアドレスであると見なし、呼び出し元のさらに親プログラムのアドレス（その親プログラムへのリターンアドレス）を取得し（ステップＳ５）、ステップＳ３の処理に戻る。
このように、ステップＳ３〜Ｓ５のループ処理においては、ＡＰＩを要求したプログラムを１次プログラムとすれば、その呼び出し元（親プログラム）となる２次プログラムをはじめ、順に呼び出し階層を形成するｎ次プログラムまでの格納アドレスが適正か否か判定される。【００４１】  ここで、ステップＳ５の処理の具体例を示す。例えば、ＡＰＩの実行元プログラムを１次プログラム、１次プログラムの呼び出し元を２次プログラム、２次プログラムの呼び出し元を３次プログラム、さらに３次プログラムの呼び出し元を４次プログラムとする。
図７に示すスタックメモリの、領域Ａ５４、Ａ５７、Ａ５１０には、それぞれ２次〜４次プログラムへのリターンアドレス、すなわち、プログラム格納アドレスが格納されている。
よって、アドレス取得手段５は、領域Ａ５４、Ａ５７、Ａ５１０の中から、所望のプログラムの格納アドレスをループ処理毎に順に取得する。【００４２】  ここで、それぞれのリターンアドレスを取得する方法について、図７及び図８に基づいて詳細に説明する。
図８は、ＩＡ３２におけるサブルーチンプログラムの基本構成を示す図である。先ず、図８について説明する。図８のサブルーチンプログラムＰ１の１行目及び２行目は、サブルーチンの最初に固定的に存在し、４行目及び５行目は、サブルーチンの最後に固定的に存在する。
１行目は、ＥＢＰレジスタの内容（親プログラムのデータ開始領域を示す値）をスタックに格納する命令である。図７中の領域Ａ５３、Ａ５６、Ａ５９に示される親プログラムのデータ開始領域の値は、この手順により書き込まれている。【００４３】  ２行目は、ＥＢＰレジスタへ、ＥＳＰレジスタの内容を複写する命令である。ＥＳＰレジスタは、常に、スタック領域における未使用のゼロ側最上位を示す。この命令以後は、そのプログラムの作業用データ領域の参照に、ＥＢＰレジスタを使用する。プログラム１〜３に対応する領域Ａ５２、Ａ５５、Ａ５８は、それぞれのプログラム実行時におけるＥＢＰレジスタの内容として、そのプログラムの作業用データ領域開始位置を示している。【００４４】  ３行目は、サブルーチン本体である。図８においては、３行目のみに示すが、実際は複数行で示される。
４行目は、サブルーチンの終了を行う手順である。ＩＡ３２固有のＣＰＵ命令であるｌｅａｖｅコマンドは、プログラム１〜３のそれぞれにおいて、ＥＢＰレジスタの値をＥＳＰレジスタに複写し、スタックメモリから領域Ａ５３、Ａ５６、Ａ５９の値をＥＢＰレジスタへ読み取る。ＥＳＰレジスタの値は、減算して、領域Ａ５３、Ａ５６、Ａ５９を開放する。【００４５】  ５行目は、親プログラムに戻る命令である。これを実行すると、サブルーチンプログラムは、領域Ａ５１、Ａ５４、Ａ５７、Ａ５１０にそれぞれ示される、対応するリターンアドレスに制御を移す。同時にＥＳＰレジスタの内容を減算して領域を開放する。
尚、ｒｅｔ命令の代わりにｉｒｅｔ命令を使用する場合がある。すなわち、サブルーチンの呼び出しは、ＩＡ３２においては、ｃａｌｌ命令とｉｎｔ命令が存在する。ｃａｌｌ命令に対しては、ｒｅｔ命令で復帰し、ｉｎｔ命令に対してはｉｒｅｔ命令にて復帰する約束となっている。【００４６】  図８のサブルーチンプログラムＰ１の基本構成を前提として、各プログラムのリターンアドレスは、次のようにして取得することができる。
図７において、ＡＰＩの実行元プログラム１へのリターンアドレスはスタック領域のゼロ側の最上位に存在する。その所在位置のＥＳＰレジスタの内容により機械的に取得することができる。すなわち、ＥＳＰレジスタは常に、未使用のゼロ側最上位を示すので、領域Ａ５１はＥＳＰレジスタの示す値の領域と隣接する領域として取得することができる。【００４７】  ＡＰＩは通常、前記したサブルーチン呼び出し命令のうち、ｉｎｔ命令を使用する。領域Ａ５１に示される値はｉｎｔ命令がスタック領域に書き込んだ、プログラム１へのリターンアドレスである。領域Ａ５１にはｉｎｔ命令の仕様に従い、ＡＰＩの実行元プログラムに関するリターン情報と各種戻り情報が書き込まれている。すなわち、ここから、リターンアドレスのみを機械的に取得することができる。【００４８】  また、前記したように、図８の１行目においてプログラム１〜３のそれぞれは、呼び出し元のプログラム（親プログラム）のＥＢＰレジスタの値（親プログラムのデータ開始領域を示す値）を領域Ａ５３、Ａ５６、Ａ５９に格納している。領域Ａ５３は、領域Ａ５６と隣接するゼロ側の次の領域を示す。領域Ａ５６は、領域Ａ５９と隣接するゼロ側の次の領域を示す。したがって、プログラム１〜３のそれぞれにおいては、その親プログラムのデータ領域を芋づる式に取得することができる。【００４９】  そして、プログラム２〜４へのリターンアドレスは、領域Ａ５３、Ａ５６、Ａ５９、すなわち親プログラムのデータ領域開始を示すアドレスの上位アドレス側に常に隣接している。これにより、プログラム２〜４のリターンアドレスは、親プログラムのデータ領域開始を示すアドレスに基づいて機械的に算出することができる。【００５０】  一方、図６のステップＳ４において、呼び出し元アドレスが、プログラム領域Ａ３１内である場合、要求されたＡＰＩを実行し（ステップＳ６）、制御はＡＰＩの実行を要求した呼び出し元にリターンする。
尚、ステップＳ４において、呼び出し元アドレスと、共有ライブラリ領域Ａ３９のアドレスとを直接比較しないのは、共有ライブラリの格納領域Ａ３９が動的に変化するため、そのアドレスの取得が困難であるためである。【００５１】  以上のようにして、ＯＳ１００における一連の動作が行なわれる。尚、ＡＰＩを直接呼び出したプログラムの格納アドレスのみを判定する場合には、図６のフロー図は、図９に示すフロー図のように、図６のステップＳ４、Ｓ５が省略され、処理フローは簡素化される。【００５２】  以上、説明した実施の形態によれば、プログラムから要求されたＡＰＩを実行する前に、メモリ装置上におけるプログラムの格納アドレスを取得し、そのアドレスが適正な位置を示しているか否かを比較判定することにより、プログラムが適正か不正かを判断することができる。
その結果、ＡＰＩを要求したプログラムを適正なものと判断した場合は、ＡＰＩを実行し、プログラムを不正なものと判断した場合は、プログラムを中断させることができる。したがって、本発明に係るオペレーティングシステムによれば、バッファオーバーラン現象を利用した不正アクセスが発生した場合には、それを抑制し、コンピュータシステムを保護することができる。
【図面の簡単な説明】
【００５３】
【図１】図１は、一般的なコンピュータにおいて、プログラムを実行する際に使用するメモリ装置の構成を模式的に示した図である。
【図２】図２は、サンプルプログラム及びスタックメモリの働きを模式的に示す図である。
【図３】図３は、米国インテル社のＩＡ３２系ＣＰＵのレジスタ・セットの概略構成図である。
【図４】図４は、本発明に係るオペレーティングシステムの概略構成の一例である。
【図５】図５は、図３のオペレーティングシステムを搭載したコンピュータシステムにおいて、プログラムを実行する際に使用するメモリ構成の一例である。
【図６】図６は、プログラムからＡＰＩの要求があった場合のオペレーティングシステムの動作を示すフロー図である。
【図７】図７は、スタックメモリに記憶されるデータ構成例を模式的に示す図である。
【図８】図８は、サブルーチンプログラムの基本構成を説明するための図である。
【図９】図９は、プログラムからＡＰＩの要求があった場合のオペレーティングシステムの動作の他の形態を示すフロー図である。
【図１】
2005029328.tif 000002
【図２】
2005029328.tif 000003
【図３】
2005029328.tif 000004
【図４】
2005029328.tif 000005
【図５】
2005029328.tif 000006
【図６】
2005029328.tif 000007
【図７】
2005029328.tif 000008
【図８】
2005029328.tif 000009
【図９】
2005029328.tif 000010
【国際調査報告】
2005029328.tif 000011
2005029328.tif 000012
2005029328.tif 000013
2005029328.tif 000014