(57)【要約】【課題】  バッファオーバフロー攻撃に対する脆弱性を有するプロセスがバッファオーバフロー攻撃を受けた場合、攻撃後にＯＳが攻撃・侵入を検出しても、サービスは停止せざるを得ず、可用性に対する脅威を解決できなかった。【解決手段】  攻撃メッセージを受け取る直前の状態を退避保存し、攻撃・侵入を検出したならば、退避時の状態に回復する。攻撃・侵入の危険が去った、あるいはプロセスに、回復が困難な状態変化が生じた場合には、退避保存を中止し、警戒状態を解除することによって、警戒状態のオーバヘッドを緩和する。【選択図】  図１
2005258498.tif 000002
【特許請求の範囲】
【請求項１】
ネットワークと接続されるインターフェースと、
プロセッサと
メモリとを有する計算機において、
前記プロセッサで実行されるオペレーティングシステムに基づいて前記プロセッサが、
該オペレーティングシステムの制御下で稼動するサーバプログラムが前記インターフェースを介してメッセージを受信する前の前記メモリの状態を記録し、サーバプログラムによる前記メッセージの処理において、該サーバプログラムの振舞いを監視し、該サーバプログラムが所定外の振舞いをしたことを検出すると、先に記録した前記メモリの状態を前記メモリに回復し、先に受信したものと異なるメッセージの受信から処理を再開させることを特徴とする計算機。
【請求項２】
前記プロセッサは、バッファオーバフローによる攻撃の検出を行うことを特徴とする請求項１の計算機。
【請求項３】
前記プロセッサは、前記サーバプログラムの振舞いの監視を、該サーバプログラムが監視を始める前からオープンしていたファイルのクローズの際に終了することを特徴とする請求項１又は２記載の計算機。
【請求項４】
前記プロセッサは、前記サーバプログラムの振舞いを、該サーバプログラムが行うシステムコールの発生する仮想メモリ空間内部のアドレスに基づいて監視することを特徴とする請求項１、２又は３記載の計算機。
【請求項５】
前記プロセッサは、前記記録されたメモリの状態を用いてサーバプログラムの処理状態を回復する場合、回復前の前記メモリの内容をログファイルとして保存することを特徴とする請求項１、２、３、又は４記載の計算機。
【請求項６】
ネットワークと接続されるインターフェースと、プロセッサとメモリとを有する計算機における処理回復方法であって、
前記プロセッサで実行されるオペレーティングシステムに基づいて前記プロセッサが、
該オペレーティングシステムの制御下で稼動するサーバプログラムが前記インターフェースを介してメッセージを受信する前の前記メモリの状態を記録し、サーバプログラムによる前記メッセージの処理において、該サーバプログラムの振舞いを監視し、該サーバプログラムが所定外の振舞いをしたことを検出すると、先に記録した状態を回復し、先に受信したものと異なるメッセージの受信から処理を再開させることを特徴とする処理回復方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、バッファオーバフロー攻撃などによって侵入された計算機におけるプログラム（以下「サーバプログラム」とも言う）の実行処理の回復に関するものである。
【背景技術】
【０００２】
インターネットに接続された計算機（以下「サーバマシン」又は「サーバ」とも言う）で実行されるサーバプログラムは、インターネットを介して様々なアクセスにさらされる。その中には、本来のサービスを要求するアクセスだけでなく、サーバプログラムの不良を悪用してサーバ上で任意のプログラムを動かすこと、すなわちサーバへの侵入を目的とするアクセスもある。特に通信メッセージ処理の不良を利用したバッファオーバフロー攻撃と呼ばれる手段が多く使用されている。
【０００３】
バッファオーバフロー攻撃については非特許文献３等に開示されているが、ここで簡単に説明する。
サーバは、ネットワークからのサービス要求メッセージを受け付け、その内容に応じてサービスを提供する。サーバは、受信したメッセージを処理するために、メッセージデータをメモリ上の作業領域に取り込む。この際、サーバで実行されるプログラムの不良により、用意した作業領域の長さよりも長いデータを作業領域に書き込むものがある。その結果、用意した作業領域以外のメモリへのメッセージデータの書き込みによるメモリ破壊が発生する。この際、破壊されるメモリにプログラム内の命令のアドレスの退避フィールドがあることがある。例えば、サブルーチンコールの際の戻りアドレスがその典型である。
【０００４】
サーバで実行されるプログラムは、この退避フィールドのデータを退避されたアドレスとみなして退避されたアドレスへ制御を移すが、そのデータが破壊されると、以後、サーバは正しい動作をしなくなる。多くの場合、破壊後のデータは命令列が存在する領域のアドレスとなっておらず、ハードウエアによるエラー割込みを引き起こす。また、メッセージデータを巧妙に作成してメッセージデータ中に特定の命令列を忍ばせ、命令アドレスフィールドにこの命令列のアドレスを書き込むようにすると、サーバは、本来の動作、例えばサブルーチンリターンの結果、そのアドレスに制御を移すこととなり、メッセージデータ中のプログラムを実行してしまう。このプログラムの内容いかんによっては、サーバへの侵入が可能となり、セキュリティ上の深刻な脅威となる。
【０００５】
このような攻撃をバッファーオーバフロー攻撃と呼ぶ。実際のサーバでは作業領域（以下「メッセージバッファ」とも言う）とサブルーチンコールの際の戻りアドレス退避フィールドがスタック上に近接して取られている。侵入者は、バッファをあふれさせてアドレス退避フィールドの戻りアドレスを破壊し、サーバに侵入する場合が多い。以後、説明のため、このような攻撃に用いられるメッセージを「攻撃メッセージ」と呼ぶことにする。
【０００６】
バッファオーバフロー攻撃の対策手段として、次が知られている。
（１）プログラムの不備の修正
バッファオーバフローはサーバプログラムの不良であるので、これを修正する。
【０００７】
（２）ファイアウォール、ゲートウェイによるメッセージのフィルタリング
危険な入力、危険なサイトからの入力をサーバの手前で検出し、サーバに渡さないようにする。
【０００８】
（３）攻撃の検出
サーバがメッセージを取り込む際、戻りアドレスの前後の破壊を監視して戻りアドレス破壊を検出する（非特許文献１）、又は通常の実行環境では無いはずのスタック上での命令実行を検出する等により攻撃されたことを検出したならば、その攻撃を受けたプロセスの処理を停止する。
【０００９】
（４）被害範囲の限定
侵入者は侵入するとサーバで任意のプログラムを実行することが可能となるが、そのような場合でも、侵入者に強い権限を奪われないようにして、システム全体に悪影響が及ぶことがないようにする。
【００１０】
（５）スタックの保護
攻撃メッセージは、サーバのスタックや、スタック上のデータの配置アドレスが固定値であることを利用して作成される。そこで、サーバにおいてスタックのアドレスをランダムに変更させ、侵入コードの実行を困難にする（特許文献１）。
【００１１】
一方、停止したプロセスを回復し、処理を再開する技術としては、以下が知られている。
（６）チェックポイントリスタート
指定した時点のサーバの状態（メモリ、入出力）をディスク装置にダンプしておき、プロセスを終了する。その後、サーバを改めて起動したプロセスの状態を記録した時点の状態にし、その状態からサーバの処理を続行する。この方法においては、メモリ上の計算の途中結果を含めて回復されるので、サーバは、計算を続行することができる。
【００１２】
（７）プロセスクリーニング（非特許文献２）
アプリケーションの制御により、指示した時点の状態への回復をするために、以後のメモリの更新を記録する。状態をディスク装置などにダンプすることはせず、いわゆるコピーオンライトの手法を利用して、４ＫＢ程度のメモリページ単位に、指示時点以降に更新されたメモリの内容のみを記録するようにする。すなわち、一旦、プロセスの全てのページをハードウエアによって書き込み禁止状態にすることによって、メモリ更新を割込みとして検出できるようにする。割込み処理では、新たなページに元のページの内容をコピーし、書き込み可能な状態にしてプロセスに割り当て、元のページはアプリケーションからアクセスできない状態で保存する。アプリケーションにより状態回復が指示されると、更新されたメモリの割り当てを解除し、保存しておいたメモリに取り替える。非特許文献２では、アプリケーションが侵入された場合のセキュリティを考慮し、一度プロセスの権限を低下させると、その後はアプリケーションの要求によるプロセスの権限の上昇を制限するシステムにおいて、安全な権限上昇手段として、プロセスを権限低下前の状態に戻すことを提案している。
【００１３】
【特許文献１】U.S.Patent 5,949,973
【非特許文献１】Crispan Cowan 他著 「StackGuard: Automatic Adaptive Detection and Prevention of Buffer-Overflow Attacks」Proceedings of the 7th Usenix Security Symposium （1998）
【非特許文献２】光来健一、千葉滋 「サーバのアクセス制限を安全に変更するための機構」情報処理学会論文誌 Vol.42 No.6 （2001）
【非特許文献３】脇田  建 「バッファ溢れ攻撃とその防御」コンピュータソフトウエア、 Vol.19 No.1（2002）
【発明の開示】
【発明が解決しようとする課題】
【００１４】
（１）や（２）のアプローチで予防に失敗した場合、サーバは攻撃メッセージを受け取る。そして攻撃メッセージによってセキュリティホールが攻撃されると侵入が発生する。この侵入を上記（３）のアプローチにより検出することが可能な場合でも、それはすでに攻撃の後であり、メモリの一部が破壊された状態になっている。そのため、検出後はサーバで実行されるプロセス（以下「サーバプロセス」とも言う）を強制終了させなければならない。これは、侵入ほど危険な状況ではないが、サーバが提供するサービスが中断させられるという被害が発生している。（４）の技術では侵入が発生し、かつ検出に失敗しており、サーバもサービスを中断している。また（５）では、侵入、すなわち「メッセージとして入力したデータに潜ませたコードの実行」そのものをやりにくくしているが、バッファのオーバフローは発生し、命令コードでないデータを実行するなどして、エラーとなり、（３）と同様にサーバのサービス提供は停止させられる。
【００１５】
以上のように、バッファオーバフローを許した後の対処では、侵入後の被害の緩和の可能性はあるが、サーバのサービス停止を避けることはできない。
【００１６】
一方、（６）や（７）で示したプロセスの回復方法はいずれも、オペレータ、あるいはサーバで実行されるアプリケーションによる明示的な指示により回復時点を指定し、また必要になった時点で回復処理を明示的に起動する。従って侵入が発生した場合は、サーバ等が回復を指示することができず、サーバのサービス提供が停止されるという問題は解決されない。
【００１７】
解決しようとする問題点は、サーバへの攻撃、あるいは侵入を検出したとき、直ちにプロセスを終了せずに、安全な時点からプロセスを自動的に再開する手段を提供することである。
【課題を解決するための手段】
【００１８】
本発明にかかるサーバ回復方法では、メッセージ受信要求の時点でサーバが警戒状態に入り、警戒状態中は警戒状態に入る前の状態からの状態変更を記録し、侵入を検出したならばメッセージ受信要求の時点まで状態を回復する。又サーバは、受信メッセージによる侵入の危険が解消された時点、あるいは回復処理が困難なほど大きな状態変更が発生した時点で自動的に警戒状態を解除する。
【発明の効果】
【００１９】
本発明によれば、バッファオーバフロー攻撃を受けても、サーバがサービスを続行できる。
【発明を実施するための最良の形態】
【００２０】
本発明では、強力な早期侵入検出手段と組合せ、サーバで実行されるオペレーティングシステム（以下「ＯＳ」）が、プロセスの動きに応じて、警戒状態への移行と解除を自動的に制御する。侵入検出の際は、ＯＳが自動的にプロセスの状態を安全な状態に回復する。さらに望ましくは、ＯＳが回復処理を引き起こした侵入攻撃に対する対策を自動的に設定し、保護された状態でサービスを再開できるようにする。
【００２１】
以下、図を用いて本発明の実施例について説明する。
図１０は、本実施形態のハードウエア構成の例を示す図である。図示されているものは、一般的な計算機システムである。サーバ１０００は計算機である。サーバ１０００は、プロセッサ１０１０及びメモリ１０２０を有する。両者はバス１０５０によって接続されており、プロセッサ１０１０からメモリ１０２０上のデータへのアクセスが可能となる。メモリ１０２０上のデータ格納場所は、物理アドレスによって指定される。サーバ１０００は、さらに様々な外部装置と接続するためのデバイスインタフェース１０４０を有する。
【００２２】
外部装置の例としては、ストレージ１０８０、すなわち磁気記憶媒体がある。ストレージ１０８０は、データの蓄積に利用される。また外部装置の他の例は、例えばイーサネット（登録商標）などのネットワーク１０７０である。ネットワーク１０７０はＬＡＮ等で構成される。ネットワーク１０７０は、デバイスインターフェースの１種であるネットワークインタフェース１０３０と接続されている。ネットワーク１０７０は、サーバ１０００がネットワーク上の他の計算機に対してサービスを実行するために必要な通信に使用される。
【００２３】
これらデバイスインタフェース１０４０、１０３０は、Ｉ／Ｏバス１０６０に接続され、さらにＩ／Ｏバス１０６０はバス１０５０と接続される。このバスを用いた接続により、プロセッサ１０１０からの制御や、入出力されるデータの外部装置１０８０，１０７０と、メモリ１０２０とのデータの転送が可能となる。
【００２４】
図２は、サーバ１０００がサービスのためのサーバプログラムを実行する際の処理手順例を示すフローチャートである。サーバ処理２００は起動処理２１０、サービス処理２２０、２３０、および終了処理２５０からなる。
【００２５】
起動処理２１０では、サーバ１０００は、サービス処理に必要なメモリ領域の確保、初期設定を行い、さらに通信によりサービス要求を受け付けるための準備を行う。本実施例では、通信はソケットインタフェースによりＵＤＰ／ＩＰプロトコルを用いたコネクションレスのクライアント−サーバモデルに従って行われるものとする。尚、これらの技術については、例えば次の本に記述されている。W.Richard Stevens 著「UNIX network programming」Prentice Hall（1990）Chapter 6、和訳：Ｗ．リチャード・スティーヴンス「ＵＮＩＸネットワークプログラミング」ピアソンエデュケーション(１９９０) 第６章 ｐｐ.３０９−４０６。
【００２６】
起動処理２１０では、まず、サーバ１０００は、socket()システムコールにより、通信処理用のメモリ等の資源確保を行う。次にサーバ１０００は、bind()システムコールにより、サーバプログラムのネットワーク上での名前をつける。具体的にはport番号を指定し、サーバの識別を可能とする。
【００２７】
サービス処理では、サーバ１０００は、サービス要求メッセージを受け付け、その内容に従った処理を行う。メッセージの受け付け処理２２０では、サーバ１０００は、recvfrom()システムコールによりサービス要求メッセージをバッファに読み込む。要求がなければ、サーバ１０００は、要求が到達するまで待つ。要求メッセージを受信したならば、サーバ１０００は、受信したサービス要求メッセージの処理２３０に進む。サービス要求メッセージ処理２３０では、サーバ１０００は、要求の内容を調べ、要求を実行し、さらに処理結果をsendto()システムコールにより、要求元に返す。
【００２８】
要求メッセージの受信処理２２０、あるいはサービス要求処理２３０では、バッファあるいは作業領域は、コンパイラの生成した実行コードによりスタック上に取られ、バッファオーバフローはこれらの作業領域上で起こる。
【００２９】
サービス要求に対する処理２３０が終了すれば、サーバ１０００は、ステップ２４０でサービスの継続要否を判定し、継続不要ならば、終了処理２５０に進み、継続するならばステップ２２０に戻って、後続のサービス要求メッセージを受付ける。
【００３０】
このように、このサーバプログラムは反復型の処理構造を持っていることに特徴がある。そのため、このプロセスが攻撃された場合、サービスは中断する。
【００３１】
尚、ＴＣＰ／ＩＰによるコネクション指向のサーバでは、個々のコネクションに対して、独立したプロセスを起動して処理する並行型の処理構造を持つことが多い。この場合、あるコネクションのもとでバッファオーバフロー攻撃を受けてプロセスが中断しても、要求を受け付けるプロセスは安全に継続実行されるので、サービスは中断しない。
【００３２】
本実施例におけるサーバ１０００の処理は、大きく（１）警戒開始処理、（２）書込み例外処理、および、システムコール処理の中で行われる、（３）侵入検出処理、（４）メモリ回復処理、（５）警戒解除処理に分かれる。以下、順に説明する。尚、明細書中の説明でプログラムが主語になる場合には、実際にはプログラムを実行するプロセッサ等がその処理を実行している。
【００３３】
（１）警戒開始処理
警戒開始処理は、サーバ１０００が、攻撃メッセージを実行中のプロセスが受け取る前に行う。本実施例では、サーバ１０００は本処理をrecvfrom()システムコールの中で行う。
【００３４】
図３はＯＳのrecvfrom()システムコール処理の概要を示すフローチャートである。recvfrom()システムコールが発行されると、ＯＳは、警戒開始処理を実行し、侵入警戒状態に入る（ステップ３１０）。
【００３５】
次にＯＳは、サービス要求メッセージの有無を確認する（ステップ３２０）。サービス要求メッセージがまだ存在しなければ、ＯＳは、サーバプログラムのプロセスをブロックする。その後、サービス要求メッセージを受信する（ステップ３３５）と、ＯＳは待ち解除処理で待ち状態解除してプロセスを再開する（ステップ３４０）。
【００３６】
ステップ３２０で要求を受信した場合又はステップ３３５で要求を受信した場合、ＯＳは、ＯＳ領域内に保持している受信データを、プロセスに割り当てられたメモリにコピーし（ステップ３５０）、プロセスに処理を戻す（ステップ３９０）。
【００３７】
次に警戒開始処理３１０について、より詳細に説明する。
図４は、サーバプログラムで実行されるプロセスの仮想メモリ空間のレイアウトの例を示している。大きな長方形４００、あるいは４１０が一つの仮想メモリ空間をあらわしており、図面の上方が低位アドレス、下方が高位アドレスとなるように描かれている。仮想メモリ空間４００は警戒開始処理３１０を実行する前の状態を、仮想メモリ空間４１０は警戒が開始された後の状態を、それぞれ表している。
【００３８】
仮想メモリ空間の中には、例えばプログラムのローディング領域、ＯＳ用、あるいはサーバプログラム用のデータ領域、作業領域などがあり、それぞれの使われ方に応じて、メモリ保護の設定がなされる。
【００３９】
多くのプロセッサは、プログラムによるメモリアクセスに対する保護機能を備えており、プログラムの不良などによるデータ破壊などを防止できるようになっている。例えば、現在、広く普及している米国Intel社のＩＡ−３２アーキテクチャに従ったプロセッサでは、セグメンテーションとページングの２通りのメモリ保護機能を持っている。
【００４０】
セグメンテーションでは、仮想アドレス空間の連続領域に対して、その領域全体に対して属性を与え、その属性に応じて、書き込み許可、禁止、あるいは命令実行許可、禁止、と言った設定ができる。
【００４１】
仮想アドレス空間４００の書込み禁止領域４０１は、こういったセグメンテーション機能を利用して実現される。一方、本実施例による書き込み可能領域４０２を書き込み不可能領域４１２に変更する処理には、もっと細かい単位でのアクセス制御が可能な、次のようなページングによるメモリ保護機能を利用する必要がある。
【００４２】
図１１は、サーバ１０００に置けるアドレス変換機構の中に、メモリ保護機能が埋め込まれている例を示している。
【００４３】
サーバ１０００は、複数のプログラムを安全に効率よく実行するために、プロセッサ１０１０が備えるアドレス変換機能により、仮想アドレス空間をプログラムに対して提供している。仮想アドレス１１００は仮想アドレス空間上の位置を表すが、そこにあるデータの実体はメモリ１０２０上にある。アドレス変換機能は、仮想アドレス１１００に対してメモリ１０２０上の位置を表す物理アドレスを対応させる。すなわち、プログラムによる仮想アドレス１１００へのアクセスはプロセッサ１０１０によって物理アドレスによるメモリ１０２０に対するアクセスに変換される。
【００４４】
アドレス変換を簡単に説明する。仮想アドレス１１００は例えば３２ビットのビット列であって、典型的には、３つの部分に分割される。図では最上位のディレクトリインデックス１１０１、テーブルインデックス１１０２、およびページ内オフセット１１０３に分かれている。例えばこれらはそれぞれ、１０ビット、１０ビット、１２ビットの長さのビット列となっている。
【００４５】
ディレクトリインデックス１１０１およびテーブルインデックスによって、仮想アドレス空間上の仮想ページが定まる。すなわち仮想アドレス空間はこれらで定まる仮想ページの集合体と考える。同様にメモリ１０２０は多数の実ページの集合体と考える。仮想ページと実ページは同じ長さ、典型的には４ＫＢの長さを持つ。アドレス変換は、仮想ページに実ページを対応させ、さらにページ内の位置を与えることで、仮想アドレスに対応するメモリ上のデータを指定する。より詳しくは、前記の３つのビット列を用いて、アドレス変換の対応関係を与えるテーブルである、ページディレクトリ１１２０と、ページテーブル１１３０を検索することによって、次のように実行される。
【００４６】
ページディレクトリ１１２０はページディレクトリエントリ１１２１の列であり、仮想アドレス１１００の中の、ページディレクトリインデックス１１０１によりそのうちの一つが選択される。
【００４７】
ページディレクトリインデックスエントリ１１２１のテーブルアドレスはあるページテーブル１１３０をポイントしている。ページテーブル１１３０はページテーブルエントリ１１３１の列であり、仮想アドレス１１００のテーブルインデックス１１０２によって、そのいずれかが選択される。
【００４８】
ページテーブルエントリには実ページアドレス１１３２があり、仮想アドレス１１００が指定するデータの実体が格納された実ページ１１４０をポイントしている。以上により実ページ１１４０が検索される。仮想アドレス１１００が指定するデータは、ページ内オフセット１１０３により指定される、この実ページ１１４０内の対応するオフセットに存在する。
【００４９】
実ページ１１４０へのアクセス保護は、以上に述べたアドレス変換の過程で実施される。ページテーブルエントリ１１３１のＲＷビット１１３４は、このページテーブルエントリ１１３１がポイントする実ページ１１４０に対する、プログラムによるアクセスを制限するための情報である。すなわち、ＲＷビット１１３４が０のとき、実ページ１１４０は、読み出しのみ許され、書き込みは禁止される。またＲＷビット１１３４が１のとき、実ページ１１４０は読み出し、書き込みともに許される。また、ページディレクトリエントリ１１２１のＲＷビット１１２４は、ページディレクトリエントリ１１２１が指定するページテーブル１１３０上の全てのページテーブルエントリがポイントする実ページに対して、同様の読み出しと書き込みの、許可と禁止を制御する。
【００５０】
本実施例で採用するコピーオンライト方式では、特に書き込み保護をページ単位に設定できる点が重要である。
【００５１】
図４の例では、仮想メモリ空間がいくつかの領域にわけられている。領域４０１は、プログラムコードがローディングされた領域を想定しており、セグメンテーション機能により、実行可能、書込み禁止領域である。領域４０２は、サーバプログラムによる作業領域であり、データ用のセグメントとして、書込みが可能な領域である。領域４０３は、ＯＳが参照するデータが格納されており、サーバプログラムによる上書きを避けるため、書き込み禁止領域となっている。領域４０４は未割当てであり、新たな仮想メモリ領域の割当てはこの中から行われる。使い道は決まっておらず、書き込み可能か否かは、領域割当ての際に決定される。領域４０５は、スタック領域を想定しており、書込み可能となっている。領域４０１及び４０３の網掛けは、この領域が、ハードウエアの設定により書込み禁止に設定してあることを表している。また領域４０４の斜線は未割当て領域であることを示している。
【００５２】
警戒開始処理３１０では、サーバ１０００は、これらの領域のうち、書込み可能領域４０２及び４０５に対して、ページング機能による書込み禁止設定を施す。すなわち、この領域の全てのページテーブルエントリ１１３１に対応するＲＷビットを０にする。その結果、仮想アドレス空間は４１０の状態になる。領域４１１、４１３及び４１４は領域４０１、４０３及び４０４と同様の状態である。領域４１２及び４１５は書込み可能領域でありかつ書込み禁止の設定がなされている。このように設定してはいるが、これらは、書き込み可能であるべき領域であることを改めて注意する。これらの領域４１２及び４１５は後に回復処理をする際に、状態回復されるから、回復対象領域と呼ぶ。またページ単位での回復を行うから、この領域のページを回復対象ページと呼ぶことにする。
【００５３】
警戒開始処理では、さらに図５に示す制御ブロックの設定を行う。
図５は、サーバプログラムのプロセスに割り当てられた、実ページの管理ブロックの構造例を表す図である。プロセスの管理には、プロセス制御ブロック（以下ＰＣＢと略）５００が用いられる。ＰＣＢ５００は、プロセスの状態やプロセスに割り当てられた資源の管理のために用いられる。プロセスに割り当てられた実ページもＰＣＢによって管理される。各実ページは固定された長さ、典型的には４ＫＢに区切られた、物理メモリの断片であり、それぞれに１つの実ページ制御ブロック（以下ＲＰＢと略記）を用意する。
【００５４】
割り当てられた実ページに対応するＲＰＢすべてをポインタでつないで一本のチェインを構成し、ＰＣＢから先頭ＲＰＢと末尾ＲＰＢをポイントさせる。図５では、ＲＰＢ５２０のＮｅｘｔポインタフィールド５２１とＰｒｅｖポインタフィールド５２２によってＲＰＢチェインを作り、ＰＣＢ５００の割当てメモリ制御ブロックアンカフィールド５０１がＲＰＢのチェインの先頭と末尾を押さえている。
【００５５】
ＰＣＢ５００の回復時戻りアドレスフィールド５０４には、本実施例における回復処理の後に実行すべき、サーバプログラムのアドレスを保存する。本実施例では、サーバ１０００が、recvfrom()システムコールの処理中に警戒開始処理３１０を実行するので、回復時戻りアドレスとして、recvfrom()システムコールの戻りアドレスが退避される。また、回復処理に備え、同じrecvfrom()システムコールに指定されたパラメータを退避パラメータフィールド５０５に退避しておく。
【００５６】
尚、本実施例では、回復時戻りアドレスフィールド５０４は、このプロセスが警戒対象であることを示すのにも用いることにする。すなわち、このフィールドがゼロでない時、サーバ１０００が対応するプロセスを警戒中であることを、ゼロの時は、サーバ１０００が対応するプロセスを警戒していないことを示す。
【００５７】
さらに、回復ページ制御ブロックアンカ５０２を空、および退避ページカウンタ５０３をゼロとして、それぞれ初期化する。
【００５８】
ＲＰＢ５２０は、本実施例に係る回復対象ビット５２７を有する。ＲＰＢが回復対象ページに対応するとき、回復対象ビット５２７が１にセットされる。ＲＰＢ５３０をはじめ、他のプロセスに割り当てられたＲＰＢについてそれが回復対象であれば、同様の設定を行う。
【００５９】
（２）書込み例外処理
警戒開始処理で書き込み禁止を設定することにより、サーバプログラムが書込み保護の設定された領域に書込みを行おうとすると、プロセッサ１０１０は書込み例外割り込みを発生し、ＯＳはその解決処理を実行する。書き込み例外はメモリへの書込みが実行される前に発生するので、メモリの内容は変更されない。
【００６０】
図６は書込み例外処理の概要を示すフローチャートである。
書込み例外処理６００では、サーバ１０００は、まず書込み例外を起こしたプロセスが警戒対象であるか否かを判定する。具体的にはサーバ１０００は、このプロセスのＰＣＢ５００の回復時戻りアドレス５０４がゼロであるか否かを調べる（ステップ６１０）。ゼロの場合、すなわち対象でない場合は、発生した書込み例外はアプリケーションプログラムのエラー、すなわち不当な書込みによるものであるので、サーバ１０００は不当書込み例外処理を行う（ステップ６８０）。
【００６１】
書込み例外を起こしたプロセスが警戒対象である場合、サーバ１０００は、書込み例外を起こした領域が回復対象ページのものか否かを判定する。具体的には、サーバ１０００は、該当する実ページのＲＰＢ、例えばＲＰＢ５２０の回復対象ビットが１にセットされているか否かを調べる（ステップ６２０）。プロセスが回復対象ページでなければ、書込み禁止領域に対する不当な書込み例外と判断されるので、サーバ１０００はエラー処理を行う（ステップ６８０）。
【００６２】
回復対象ページであることが確認された場合、サーバ１０００は、回復対象ページのコピーを作る（ステップ６３０）。以下、ステップ６３０を細分化して説明する。まずサーバ１０００は、コピー先となる実ページの領域を確保する（ステップ６３１）。次にサーバ１０００は、確保した実ページに回復対象ページのデータをコピーする（ステップ６３２）。次にサーバ１０００は、確保した実ページのＲＰＢを、後ほど説明するように設定する（ステップ６３３）。その後、サーバ１０００は、このＲＰＢをＰＣＢ５００の回復ページ制御ブロックアンカ５０２につらなるＲＰＢチェインにエンキューする（ステップ６３４）。
【００６３】
次にサーバ１０００は、回復対象ページの書込み禁止の設定を解除する。すなわち、該当する仮想ページのページテーブルエントリのＲＷビットを１に設定する（ステップ６４０）。その後、サーバ１０００は処理を終了する（ステップ６９０）。プロセスに戻ると、プロセスは書込み例外を起こした書込み命令を再実行する。書込み禁止が解除されているので、今度は例外を起こさずに、書込みは成功する。さらにこのページに対する後続の書込みも、書込み例外を起こすことなく実行されるようになる。
【００６４】
図７は、ステップ６３０における処理の結果を反映した制御ブロックの状態例を示す図である。ＲＰＢ５２０、５３０は上に説明したとおり、このプロセスに割り当てられた実ページのＲＰＢである。それぞれ回復対象ビットフィールド５２６、５３６を持っており、書込み例外処理の開始時点では１に設定、すなわち回復対象であることが表示されているとする。今、書き込み例外を起こした実ページのＲＰＢが５２０であるとする。回復対象ビットが１にセットされているから、回復対象ページ退避処理６３０を実行する。まず、新たな実ページを割り当て、実ページの内容のコピーを行う。新たに割り当てた実ページのＲＰＢを７２０とする。ＲＰＢ７２０のＰＣＢポインタフィールド７２２はＰＣＢ５００をポイントさせる。仮想ページ番号７２３は、本来、マッピングされている仮想ページを識別する情報が格納されるが、ここでは後の処理に備えて、対応するＲＰＢ５２０をポイントするものとする。実ページ番号フィールドは新たに割り当てた実ページを指定する情報が元々格納されている。保護モードフィールド７２５にはＲＰＢ５２０の該当フィールド５２５の値をコピーする。その後に、サーバ１０００は、ＲＰＢ７２０をＰＣＢ５００の回復ページ制御ブロックアンカ５０２につなぐ。このＲＰＢを退避ページＲＰＢと呼ぶことにする。Ｎｅｘｔポインタフィールド７２１は、後に発生する新たな書き込み例外処理の際に、他の退避実ページのＲＰＢをチェインするのに使用される。
【００６５】
次にシステムコール処理について説明する。
図１は、本実施例に係る、システムコール処理の概要を示したフローチャートである。本実施例では、システムコール処理の中で侵入検出処理１２０を行い、その延長で、メモリ回復処理１２５、あるいは警戒解除処理１３５を実行する。
【００６６】
システムコール処理１００では、まずＯＳは、システムコールを要求したプロセスが、メモリ回復処理の対象であるか否かを調べる。具体的には、ＯＳは、プロセス制御ブロック５００の回復時戻りアドレスの設定の有無、すなわち同フィールド５０４がゼロであるか否かによって判定する（ステップ１１０）。同フィールドの値がゼロならば、回復処理の対象でないから、ＯＳは通常のシステムコール処理を実行する（ステップ１８０）。
【００６７】
回復時戻りアドレスフィールドの値がゼロでない場合、ＯＳは侵入検出処理を実行する。詳細は後述する（ステップ１２０）。ここで侵入が検出されたならば、ＯＳはメモリ回復処理を行う。同処理の詳細は後述する（ステップ１２５）。
【００６８】
一方侵入が検出されなかった場合、ＯＳは警戒解除判定処理を行う。同処理についても後述する（ステップ１３０）。ここで警戒解除することが決定されたら、ＯＳは警戒解除処理を行う。同処理の詳細についても後述する（ステップ１３５）。
【００６９】
ステップ１２５の後、ステップ１３０で警戒解除されない場合、又はステップ１３５の処理の後、ＯＳは、現在要求されているシステムコールの通常の処理を実行する（ステップ１８０）。
【００７０】
（３）侵入検出処理
次に侵入検出処理１２０について説明する。
本実施例では、ＯＳが、書込み可能な領域に格納された命令コードの実行によるシステムコールを監視することにより、侵入を検出するものとする。すなわち、ＯＳは、システムコールを実行したコードの仮想アドレスを知ることができ、さらに、その領域が書き込み可能な領域内にあるか否か、を調べることができる。正しくローディングされたプログラムのコードは書き込み禁止領域にあるはずであるから、書込み可能領域からのシステムコールであれば、侵入したコードによるシステムコールであると判断され、侵入が検出される。
【００７１】
検出手段は上記に限定するものではない。上記以外の手段により侵入検出できた場合にも、警戒中ならば、ＯＳは回復処理を起動することができる。
【００７２】
（４）メモリ回復処理
メモリ回復処理では、ＯＳはまず、回復対象となるメモリの内容を、ストレージ１０８０にセキュリティログファイルとして出力し、侵入攻撃の解析用のデータとする。
【００７３】
ついでＯＳは、割当てページの内容を退避しておいたページの内容に変える。この時の１つの実施方法は退避ページから割当てページに内容をコピーすることである。別の方法は、退避ページを割当てページとして用いることができるようにアドレス変換テーブルを変更することである。以下では後者を用いた場合の実施例を説明する。
【００７４】
図８は、メモリ回復処理１２５の詳細を示したフローチャートである。
まずＯＳは、この後に回復する割当てページの内容をログに出力する（ステップ８０１）。ついでＯＳは、退避ページの有無を確認し、ある場合には、ＰＣＢ５００につなげられた退避ページを、割当てページと交換する。なお、図７において、退避ＲＰＢ７２０に対応する割当てページＲＰＢを５２０として説明するが、割当てページＲＰＢ５２０は、本実施例ではＲＰＢ７２０の仮想アドレス番号フィールドを一時的に借用してポイントさせておき、ＲＰＢ５２０を直ちに検索できるように構成してある（ステップ８０５〜８５０）。
【００７５】
退避ページの一つ一つについて、ＯＳは以下の処理（ステップ８１０〜８５０）を実行する。
まずＯＳは、退避ページのＲＰＢ７２０を割当てページのＲＰＢとして完成させる。すなわち、仮想アドレス番号フィールド７２３に、対応する仮想ページ番号を格納する。これは、ＲＰＢ５２０の仮想アドレス番号フィールドの値をコピーすることで達成される。同様に保護モードフィールド７２５を同５２５からコピーする。また、回復対象ビット７２６を１にセットする（ステップ８１０）。
【００７６】
次にＯＳは、ＲＰＢ５２０を、ＰＣＢ５００の割り当てメモリのチェインからはずす（ステップ８２０）。その後ＯＳは、対応するページテーブルエントリ１１３１を、ＲＰＢ７２０に対応する実ページに変換されるように書き換える。本実施例では、ＲＰＢ７２０内に実ページ番号フィールド７２４を備えているので、その内容をページテーブルエントリ１１３１の実ページアドレス１１３２に反映させればよい（ステップ８３０）。
【００７７】
更にＯＳは、ＲＰＢ５２０の実ページを他の用途に使用可能な空き実ページとして解放する（ステップ８４０）。その後、ＯＳは、ＲＰＢ７２０を退避ページＲＰＢのチェインからデキューし、割当てページＲＰＢチェインにエンキューする（ステップ８５０）。
【００７８】
ＯＳは、ステップ８０５で退避ＲＰＢチェインが空になったことが確認できるまで、以上を繰り返す。
【００７９】
ステップ８０５で退避ＲＰＢチェインが空になったならば、ＯＳは、システムコール処理後のプロセス再開アドレスを、ＰＣＢ５００に退避しておいた回復時戻りアドレス５０４の内容に書き換える（ステップ８７０）。その後、ＯＳは、処理中のシステムコールが、あたかもrecvfrom()システムコールであるかのように模擬する。そのために、ＯＳは、ＰＣＢ５００の退避パラメータフィールド５０５に退避しておいたrecvfrom()システムコールのパラメータを用いる（ステップ８８０）。
【００８０】
ステップ８９０でシステムコール処理に戻ると、ステップ８８０での設定により、システムコール個別処理１８０では、recvfrom()処理が実行される。既に説明したように、recvfrom()処理では、警戒開始処理が実行される。さらにステップ８７０での設定により、システムコール処理からのリターン処理１９０では、recvfrom()コール２２０の直後に制御を戻すことができ、サーバプロセスの状態が回復される。
【００８１】
（５）警戒停止処理
警戒解除判定処理１３０では、ＯＳは、侵入が検出されず、また侵入の危険性がなくなったと判断されるとき、あるいは警戒状態の継続が困難になったときに、警戒状態の解除を決定する。実行中のシステムコールによっては、回復が困難になる場合があるので、その場合は警戒状態を解除する。一般に、状態の変化を記録し、回復処理を工夫すれば、警戒解除せずに実行できるシステムコールは増え、警戒期間を長くし、安全性を高めることができる。ただし、記録のためのオーバヘッドが増える。また、警戒対象とするサーバプログラムの処理内容によって、必要十分な警戒期間や、警戒解除せずに実行すべきシステムコールは異なるため、警戒期間の調整機能が必要である。
【００８２】
例えば、すべてのシステムコールについて警戒状態を解除することにすれば、実装は容易になり、オーバヘッドも少ないが、多くのサーバプラグラムにとって、十分な警戒期間が取れなくなる。
【００８３】
本実施例では、以下のルールを設ける。ＯＳは、警戒開始前にopen()されたファイルのclose()処理では警戒状態を解除する。ＯＳは、警戒開始後にopen()されたファイルのclose()は、解除せずに実行し、回復処理では、強制的にclose()処理を実行する。またＯＳは、警戒しているsocketに関する操作では警戒を解除する。特に、再度のrecvfrom()では、警戒解除し、改めて警戒開始処理を実行する。この後の回復処理では、今回のrecvfrom()の実行前の状態に戻すことになる。また、getpid()のような、実行の形跡の残らないものについては警戒状態のまま実行する。syslog()は警戒状態のまま実行する。
【００８４】
警戒解除を決定した時の、警戒解除処理１３５について説明する。
図９は、警戒解除処理１３５ではの処理概要を示すフローチャートである。
【００８５】
ＯＳは、プロセスの各退避ＲＰＢを解放する（ステップ９１０）。次にＯＳは、各割当てページを回復対象からはずす（ステップ９２０〜９４０）。まずＯＳは、未処理の割当てページのＲＰＢ、例えばＲＰＢ５２０を選ぶ（ステップ９２０）。未処理の割当てページのＲＰＢが有る場合、ＯＳは、ＲＰＢ５２０の回復対象フラグ５２７をリセットする（ステップ９３０）。その後ＯＳは、ＲＰＢ５２０に対応する実ページの書込み保護を解除する（ステップ９４０）。
【００８６】
ステップ９２０ですべての割当てページについて解除処理が終わったことを確認すると、ＯＳはＰＣＢ５００を警戒対象からはずす。そのために、回復時戻りアドレス５０４をゼロにする（ステップ９５０）。ついでＯＳはシステムコール処理に戻る（ステップ９９０）。
【図面の簡単な説明】
【００８７】
【図１】システムコール処理の概要を示したフローチャート。
【図２】回復対象とするサーバプログラムの動作の概要を示したフローチャート。
【図３】警戒開始処理の実行の概要を示したフローチャート。
【図４】警戒開始処理前後の仮想メモリ空間の状態を示したブロック図。
【図５】制御情報の概要を示したブロック図。
【図６】書込み例外処理の動作の概要を示したフローチャート。
【図７】書込み例外処理実行後の制御情報の状態を示したブロック図。
【図８】メモリ回復処理の概要を示したフローチャート。
【図９】警戒解除処理の概要を示したフローチャート。
【図１０】サーバの構成例を示したブロック図。
【図１１】前提とするメモリ保護機能を示したブロック図。
【符号の説明】
【００８８】
１０００…サーバ、１０１０…プロセッサ、１０２０…メモリ、１０３０…ネットワークインターフェース、１０４０…デバイスインターフェース、１０８０…ストレージ。
【図１】
2005258498.tif 000003
【図２】
2005258498.tif 000004
【図３】
2005258498.tif 000005
【図４】
2005258498.tif 000006
【図５】
2005258498.tif 000007
【図６】
2005258498.tif 000008
【図７】
2005258498.tif 000009
【図８】
2005258498.tif 000010
【図９】
2005258498.tif 000011
【図１０】
2005258498.tif 000012
【図１１】
2005258498.tif 000013