(57)【要約】【課題】計算機のカーネル空間を改竄する攻撃に対するセキュリティ機構を提供する。【解決手段】設定手段２０は、オペレーティングシステムの起動時にカーネル空間及びユーザ空間とは別の仮想記憶空間としてユーザ空間との切り替えが禁止される秘密空間を設ける処理を行うと共に、監視処理を記述した監視コード、及びカーネル空間の監視対象についての検証用データを秘密空間に記憶させる処理を行う。切替手段２２は設定手段２０による処理の後、所定のタイミングにて、カーネルが利用する仮想記憶空間をカーネル空間から秘密空間へ切り替える第一切替処理を行う。監視実行手段２４は第一切替処理に伴い秘密空間にて監視コードを実行し、監視処理として、現時点の監視対象を検証用データと比較してカーネル空間の改竄を検出する処理と、当該改竄検出処理後に、カーネルが利用する仮想記憶空間を秘密空間からカーネル空間へ切り替える第二切替処理とを行う。【選択図】図１
2020140689.tif 000002
【特許請求の範囲】
【請求項１】
カーネルモードで使用するカーネル空間とユーザモードで使用するユーザ空間とを分離して設ける仮想記憶方式の計算機であって、
オペレーティングシステムの起動時に前記カーネル空間及び前記ユーザ空間とは別の仮想記憶空間として前記ユーザ空間との切り替えが禁止される秘密空間を設ける処理を行うと共に、監視処理を記述した監視コード、及び前記カーネル空間の監視対象についての検証用データを前記秘密空間に記憶させる処理を行う設定手段と、
前記設定手段による処理の後、所定のタイミングにて、カーネルが利用する仮想記憶空間を前記カーネル空間から前記秘密空間へ切り替える第一切替処理を行う切替手段と、
前記第一切替処理に伴い前記秘密空間にて前記監視コードを実行し、前記監視処理として、現時点の前記監視対象を前記検証用データと比較して前記カーネル空間の改竄を検出する改竄検出処理と、当該改竄検出処理の後に、カーネルが利用する仮想記憶空間を前記秘密空間から前記カーネル空間へ切り替える第二切替処理とを行う監視実行手段と、
を有することを特徴とする計算機。
【請求項２】
前記切替手段は、前記監視対象を変更するシステムコール又は当該システムコールによって呼び出される所定の関数の実行指示を検出した場合に前記第一切替処理を行うこと、を特徴とする請求項１に記載の計算機。
【請求項３】
前記監視対象は、ロードされたカーネルモジュールのモジュール名リストであり、
前記切替手段は、前記監視対象を変更するシステムコールが発行された後、前記カーネルモジュールをロードする際に用いられる初期化関数が呼ばれる前に前記第一切替処理を行うこと、
を特徴とする請求項２に記載の計算機。
【請求項４】
前記監視実行手段は、前回の前記改竄検出処理の実行後から所定期間経過している場合に前記改竄検出処理を実行すること、を特徴とする請求項１から請求項３のいずれか１つに記載の計算機。
【請求項５】
前記監視実行手段は、前記第一切替処理が所定回数行われるごとに前記改竄検出処理を実行すること、を特徴とする請求項１から請求項４のいずれか１つに記載の計算機。
【請求項６】
前記設定手段は、前記オペレーティングシステムの起動時に前記検証用データ及び前記監視コードを前記カーネル空間に記憶させ、前記秘密空間を当該カーネル空間の複製として生成すること、を特徴とする請求項１から請求項５のいずれか１つに記載の計算機。
【請求項７】
認証情報の入力に用いる入力手段と、
前記切替手段により前記第一切替処理が行われた場合に、前記認証情報に基づいて前記監視対象の更新権限の有無を判定する権限判定手段と、を更に有し、
前記設定手段は、前記オペレーティングシステムの起動後に、現時点の前記監視対象を前記検証用データと比較して改変が検出され、且つ、前記権限判定手段により前記更新権限が有ると判定された場合には、前記改変が検出された前記監視対象で前記秘密空間の前記検証用データを更新すること、
を特徴とする請求項１から請求項６のいずれか１つに記載の計算機。
【請求項８】
前記設定手段は、前記カーネルモードで使用する空間として、前記カーネル空間及び前記秘密空間とは別に、前記ユーザ空間からの切り替え先として設定される位置に中継用空間をさらに設け、
前記切替手段は、前記ユーザモードから前記カーネルモードへの遷移時に前記ユーザ空間から切り替えられた前記中継用空間において当該中継用空間から前記カーネル空間への切替処理を行い、また、前記第一切替処理では、一旦、前記カーネル空間から前記中継用空間へ切り替え、当該中継用空間において前記秘密空間への切替処理を行うこと、
を特徴とする請求項１に記載の計算機。
【請求項９】
前記設定手段は、ユーザプロセスごとに生成される前記ユーザ空間それぞれに対応して前記中継用空間及び前記カーネル空間を設ける一方、複数の前記ユーザプロセスに対して共通の前記秘密空間を設けること、を特徴とする請求項８に記載の計算機。
【請求項１０】
前記切替手段は、前記カーネルモードから前記ユーザモードへの遷移を、前記中継用空間から前記ユーザ空間への切替処理により行うこと、を特徴とする請求項８又は請求項９に記載の計算機。
【請求項１１】
カーネルモードで使用するカーネル空間とユーザモードで使用するユーザ空間とを分離して設ける仮想記憶方式の計算機に用いられるオペレーティングシステムであって、当該計算機を、
当該オペレーティングシステムの起動時に前記カーネル空間及び前記ユーザ空間とは別の仮想記憶空間として前記ユーザ空間との切り替えが禁止される秘密空間を設ける処理を行うと共に、監視処理を記述した監視コード、及び前記カーネル空間の監視対象についての検証用データを前記秘密空間に記憶させる処理を行う設定手段、
前記設定手段による処理の後、所定のタイミングにて、カーネルが利用する仮想記憶空間を前記カーネル空間から前記秘密空間へ切り替える第一切替処理を行う切替手段、及び、
前記第一切替処理に伴って前記監視コードを実行し、前記監視処理として、現時点の前記監視対象を前記検証用データと比較して前記カーネル空間の改竄を検出する改竄検出処理と、当該改竄検出処理の後に、カーネルが利用する仮想記憶空間を前記秘密空間から前記カーネル空間へ切り替える第二切替処理とを行う監視実行手段、
として機能させることを特徴とするオペレーティングシステム。
【請求項１２】
前記設定手段は、前記カーネルモードで使用する空間として、前記カーネル空間及び前記秘密空間とは別に、前記ユーザ空間からの切り替え先として設定される位置に中継用空間をさらに設け、
前記切替手段は、前記ユーザモードから前記カーネルモードへの遷移時に前記ユーザ空間から切り替えられた前記中継用空間において当該中継用空間から前記カーネル空間への切替処理を行い、また、前記第一切替処理では、一旦、前記カーネル空間から前記中継用空間へ切り替え、当該中継用空間において前記秘密空間への切替処理を行うこと、
を特徴とする請求項１１に記載のオペレーティングシステム。
【請求項１３】
カーネルモードで使用するカーネル空間とユーザモードで使用するユーザ空間とを分離して設ける仮想記憶方式の計算機を制御する方法であって、
オペレーティングシステムの起動時に前記カーネル空間及び前記ユーザ空間とは別の仮想記憶空間として前記ユーザ空間との切り替えが禁止される秘密空間を設ける処理を行うと共に、監視処理を記述した監視コード、及び前記カーネル空間の監視対象についての検証用データを前記秘密空間に記憶させる処理を行う設定ステップと、
前記設定ステップの後、所定のタイミングにて、カーネルが利用する仮想記憶空間を前記カーネル空間から前記秘密空間へ切り替える第一切替処理を行う切替ステップと、
前記第一切替処理に伴って前記監視コードを実行し、前記監視処理として、現時点の前記監視対象を前記検証用データと比較して前記カーネル空間の改竄を検出する改竄検出処理と、当該改竄検出処理の後に、カーネルが利用する仮想記憶空間を前記秘密空間から前記カーネル空間へ切り替える第二切替処理とを行う監視実行ステップと、
を有することを特徴とする方法。
【請求項１４】
前記設定ステップは、前記カーネルモードで使用する空間として、前記カーネル空間及び前記秘密空間とは別に、前記ユーザ空間からの切り替え先として設定される位置に中継用空間をさらに設け、
前記切替ステップは、
前記ユーザモードから前記カーネルモードへの遷移時に前記ユーザ空間から切り替えられた前記中継用空間において当該中継用空間から前記カーネル空間への切替処理を行うステップと、
前記第一切替処理にて、一旦、前記カーネル空間から前記中継用空間へ切り替え、当該中継用空間において前記秘密空間への切替処理を行うステップと、
を含むことを特徴とする請求項１３に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、カーネル空間とユーザ空間とを分離して設ける仮想記憶方式の計算機に関し、特にカーネル空間の改竄を検知する技術に関する。
【背景技術】
【０００２】
近年、計算機のオペレーティングシステム（ＯＳ）の脆弱性を悪用した攻撃への対策が重要となっている。多くの攻撃では仮想記憶空間のうちＯＳのカーネルが管理する領域（以下、「カーネル空間」という）にルートキットを感染させる。ルートキットとは、計算機へ侵入した痕跡、攻撃プログラムの存在、及び自身の存在を隠蔽する機能などを持つ不正プログラムである。そのため、利用者は計算機にルートキットに感染したことに気付くことが困難であるため攻撃の検知が遅れ、計算機への被害が拡大する問題があった。
【０００３】
このような問題に対して、カーネル空間の改竄を検知するセキュリティ機構が提案されている（下記非特許文献１）。当該従来技術では、ルートキットに悪用される可能性の高いシステムコール（監視対象システムコール）の発行を監視し、監視対象システムコールの発行時におけるカーネル空間の情報と、ルートキット感染前のカーネル空間の情報とを比較することにより、カーネル空間の不正な改竄を検知する。
【先行技術文献】
【非特許文献】
【０００４】
【非特許文献１】池上祐太、山内利宏、「カーネルスタックの比較によるカーネルレベルルートキット検知システム」、情報科学技術フォーラム講演論文集、第１２巻、第４号、第１〜６頁、２０１３年８月
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかし、従来技術におけるセキュリティ機構では、カーネル空間の改竄を監視する監視コード自体もカーネル空間内に記憶されているため、当該セキュリティ機構自体をバイパス（回避）される危険性があった。
【０００６】
本発明は上記問題点を解決するためになされたものであり、カーネル空間の改竄を検知するセキュリティ機構であって、攻撃者によるバイパスが困難化されるものを提供することを目的とする。
【課題を解決するための手段】
【０００７】
（１）本発明に係る計算機は、カーネルモードで使用するカーネル空間とユーザモードで使用するユーザ空間とを分離して設ける仮想記憶方式の計算機であって、オペレーティングシステムの起動時に前記カーネル空間及び前記ユーザ空間とは別の仮想記憶空間として前記ユーザ空間との切り替えが禁止される秘密空間を設ける処理を行うと共に、監視処理を記述した監視コード、及び前記カーネル空間の監視対象についての検証用データを前記秘密空間に記憶させる処理を行う設定手段と、前記設定手段による処理の後、所定のタイミングにて、カーネルが利用する仮想記憶空間を前記カーネル空間から前記秘密空間へ切り替える第一切替処理を行う切替手段と、前記第一切替処理に伴い前記秘密空間にて前記監視コードを実行し、前記監視処理として、現時点の前記監視対象を前記検証用データと比較して前記カーネル空間の改竄を検出する改竄検出処理と、当該改竄検出処理の後に、カーネルが利用する仮想記憶空間を前記秘密空間から前記カーネル空間へ切り替える第二切替処理とを行う監視実行手段と、を有する。
【０００８】
（２）上記（１）に記載の計算機において、前記切替手段は、前記監視対象を変更するシステムコール又は当該システムコールによって呼び出される所定の関数の実行指示を検出した場合に前記第一切替処理を行う構成とすることができる。
【０００９】
（３）上記（２）に記載の計算機において、前記監視対象は、ロードされたカーネルモジュールのモジュール名リストであり、前記切替手段は、前記監視対象を変更するシステムコールが発行された後、前記カーネルモジュールをロードする際に用いられる初期化関数が呼ばれる前に前記第一切替処理を行う構成とすることができる。
【００１０】
（４）上記（１）から（３）に記載の計算機において、前記監視実行手段は、前回の前記改竄検出処理の実行後から所定期間経過している場合に前記改竄検出処理を実行する構成とすることができる。
【００１１】
（５）上記（１）から（４）に記載の計算機において、前記監視実行手段は、前記第一切替処理が所定回数行われるごとに前記改竄検出処理を実行する構成とすることができる。
【００１２】
（６）上記（１）から（５）に記載の計算機において、前記設定手段は、前記オペレーティングシステムの起動時に前記検証用データ及び前記監視コードを前記カーネル空間に記憶させ、前記秘密空間を当該カーネル空間の複製として生成する構成とすることができる。
【００１３】
（７）上記（１）から（６）に記載の計算機において、認証情報の入力に用いる入力手段と、前記切替手段により前記第一切替処理が行われた場合に、前記認証情報に基づいて前記監視対象の更新権限の有無を判定する権限判定手段と、を更に有し、前記設定手段は、前記オペレーティングシステムの起動後に、現時点の前記監視対象を前記検証用データと比較して改変が検出され、且つ、前記権限判定手段により前記更新権限が有ると判定された場合には、前記改変が検出された前記監視対象で前記秘密空間の前記検証用データを更新する構成とすることができる。
【００１４】
（８）上記（１）に記載の計算機において、前記設定手段は、前記カーネルモードで使用する空間として、前記カーネル空間及び前記秘密空間とは別に、前記ユーザ空間からの切り替え先として設定される位置に中継用空間をさらに設け、前記切替手段は、前記ユーザモードから前記カーネルモードへの遷移時に前記ユーザ空間から切り替えられた前記中継用空間において当該中継用空間から前記カーネル空間への切替処理を行い、また、前記第一切替処理では、一旦、前記カーネル空間から前記中継用空間へ切り替え、当該中継用空間において前記秘密空間への切替処理を行う構成とすることができる。
【００１５】
（９）上記（８）に記載の計算機において、前記設定手段は、ユーザプロセスごとに生成される前記ユーザ空間それぞれに対応して前記中継用空間及び前記カーネル空間を設ける一方、複数の前記ユーザプロセスに対して共通の前記秘密空間を設ける構成とすることができる。
【００１６】
（１０）上記（８），（９）に記載の計算機において、前記切替手段は、前記カーネルモードから前記ユーザモードへの遷移を、前記中継用空間から前記ユーザ空間への切替処理により行う構成とすることができる。
【００１７】
（１１）本発明に係るオペレーティングシステムは、カーネルモードで使用するカーネル空間とユーザモードで使用するユーザ空間とを分離して設ける仮想記憶方式の計算機に用いられるオペレーティングシステムであって、当該計算機を、当該オペレーティングシステムの起動時に前記カーネル空間及び前記ユーザ空間とは別の仮想記憶空間として前記ユーザ空間との切り替えが禁止される秘密空間を設ける処理を行うと共に、監視処理を記述した監視コード、及び前記カーネル空間の監視対象についての検証用データを前記秘密空間に記憶させる処理を行う設定手段、前記設定手段による処理の後、所定のタイミングにて、カーネルが利用する仮想記憶空間を前記カーネル空間から前記秘密空間へ切り替える第一切替処理を行う切替手段、及び、前記第一切替処理に伴って前記監視コードを実行し、前記監視処理として、現時点の前記監視対象を前記検証用データと比較して前記カーネル空間の改竄を検出する改竄検出処理と、当該改竄検出処理の後に、カーネルが利用する仮想記憶空間を前記秘密空間から前記カーネル空間へ切り替える第二切替処理とを行う監視実行手段、として機能させる。
【００１８】
（１２）上記（１１）に記載のオペレーティングシステムにおいて、前記設定手段は、前記カーネルモードで使用する空間として、前記カーネル空間及び前記秘密空間とは別に、前記ユーザ空間からの切り替え先として設定される位置に中継用空間をさらに設け、前記切替手段は、前記ユーザモードから前記カーネルモードへの遷移時に前記ユーザ空間から切り替えられた前記中継用空間において当該中継用空間から前記カーネル空間への切替処理を行い、また、前記第一切替処理では、一旦、前記カーネル空間から前記中継用空間へ切り替え、当該中継用空間において前記秘密空間への切替処理を行う構成とすることができる。
【００１９】
（１３）本発明に係る方法は、カーネルモードで使用するカーネル空間とユーザモードで使用するユーザ空間とを分離して設ける仮想記憶方式の計算機を制御する方法であって、オペレーティングシステムの起動時に前記カーネル空間及び前記ユーザ空間とは別の仮想記憶空間として前記ユーザ空間との切り替えが禁止される秘密空間を設ける処理を行うと共に、監視処理を記述した監視コード、及び前記カーネル空間の監視対象についての検証用データを前記秘密空間に記憶させる処理を行う設定ステップと、前記設定ステップの後、所定のタイミングにて、カーネルが利用する仮想記憶空間を前記カーネル空間から前記秘密空間へ切り替える第一切替処理を行う切替ステップと、前記第一切替処理に伴って前記監視コードを実行し、前記監視処理として、現時点の前記監視対象を前記検証用データと比較して前記カーネル空間の改竄を検出する改竄検出処理と、当該改竄検出処理の後に、カーネルが利用する仮想記憶空間を前記秘密空間から前記カーネル空間へ切り替える第二切替処理とを行う監視実行ステップと、を有する。
【００２０】
（１４）上記（１３）に記載の方法において、前記設定ステップは、前記カーネルモードで使用する空間として、前記カーネル空間及び前記秘密空間とは別に、前記ユーザ空間からの切り替え先として設定される位置に中継用空間をさらに設け、前記切替ステップは、前記ユーザモードから前記カーネルモードへの遷移時に前記ユーザ空間から切り替えられた前記中継用空間において当該中継用空間から前記カーネル空間への切替処理を行うステップと、前記第一切替処理にて、一旦、前記カーネル空間から前記中継用空間へ切り替え、当該中継用空間において前記秘密空間への切替処理を行うステップと、を含む構成とすることができる。
【発明の効果】
【００２１】
本発明によれば、カーネル空間からのアクセスを制限した仮想記憶空間として秘密空間を設け、当該秘密空間からカーネル空間を監視するセキュリティ機構により、攻撃者によるセキュリティ機構のバイパスを困難化し、カーネル空間の改竄を好適に検知するセキュリティ機構が得られる。
【図面の簡単な説明】
【００２２】
【図１】本発明の実施形態に係る計算機の概略の構成図である。
【図２】仮想アドレスから物理アドレスへの変換を説明する模式図である。
【図３】本発明の第１の実施形態における仮想記憶空間のレイアウトを示す模式図である。
【図４】本発明の第１の実施形態に係る計算機において生成される仮想記憶空間について説明する模式図である。
【図５】カーネル空間及び秘密空間の構造を説明する模式図である。
【図６】本発明の第１の実施形態に係る計算機における秘密空間による監視の開始を説明する概略のフロー図である。
【図７】本発明の第１の実施形態に係る計算機における監視動作を説明する模式図である。
【図８】本発明の第１の実施形態に係る計算機における秘密空間による監視を説明する概略のフロー図である。
【図９】攻撃側の概略のシーケンス図である。
【図１０】本発明の第１の実施形態に係る計算機における秘密空間を用いた監視シーケンスを示す図である。
【図１１】本発明の第２の実施形態に係る計算機の概略の構成図である。
【図１２】本発明の第２の実施形態に係る計算機において生成される仮想記憶空間について説明する模式図である。
【図１３】本発明の第２の実施形態における仮想記憶空間の切替処理を説明する模式図である。
【図１４】本発明の第２の実施形態における仮想記憶空間の切替処理の監視の対象領域を示す模式図である。
【図１５】カーネル脆弱性を利用した仮想記憶空間の切替処理への攻撃の例と本発明の第２の実施形態における検出例を説明する模式図である。
【発明を実施するための形態】
【００２３】
［第１の実施形態］
以下、本発明の第１の実施の形態（以下実施形態という）である計算機２について、図面に基づいて説明する。
【００２４】
図１は、実施形態に係る計算機２の概略の構成図である。計算機２はいわゆるコンピュータであり、主装置４、入力装置６及び出力装置８を含んで構成される。例えば、計算機２はインターネットなどのコンピュータネットワークに接続され、他のコンピュータなどと通信可能とされる。
【００２５】
主装置４はＣＰＵ(Central Processing Unit)１０、主記憶装置１２、補助記憶装置１４及びバス１６などを含んで構成される。
【００２６】
ＣＰＵ１０はプログラムを実行して各種の機能を提供する装置であり、例えば、後述する本発明の設定手段２０、切替手段２２、監視実行手段２４及び権限判定手段２６として機能する。主記憶装置１２はいわゆるメインメモリ、一次記憶装置であり、バス１６を介してＣＰＵ１０に接続される。主記憶装置１２は例えば、ＲＡＭ（Random Access Memory）などの半導体メモリからなる。補助記憶装置１４は二次記憶装置であり、バス１６を介してＣＰＵ１０に接続される。補助記憶装置１４は例えば、ハードディスク装置などで構成され、主記憶装置１２より大きな記憶容量を有する。例えば、補助記憶装置１４は、ＣＰＵ１０にて実行される各種プログラムやＣＰＵ１０での処理にて使用されるデータを記憶する。
【００２７】
入力装置６は、キーボード、マウスなどであり、ユーザが主装置４への操作を行うために用いる。
【００２８】
出力装置８は、ディスプレイ、プリンタなどであり、主装置４による処理結果などを画面表示、印刷等によりユーザに示す等に用いられる。
【００２９】
計算機２は仮想記憶方式で動作する。本実施形態では、計算機２のＯＳをＬｉｎｕｘ（登録商標）、また、ＣＰＵアーキテクチャをｘ８６＿６４とし、プロセスごとに仮想記憶空間を管理する多重仮想記憶方式を実装した例を説明する。
【００３０】
ＣＰＵ１０上での仮想記憶空間における仮想アドレスを物理メモリにおける物理アドレスに変換するためには多層のページテーブルが使われ得る。図２は仮想アドレスから物理アドレスへの変換を説明する模式図である。計算機２における物理メモリは主記憶装置１２であり、図２において物理ページ４０は主記憶装置１２の記憶領域を固定サイズで区画した複数のページの１つである。仮想アドレス４２は、ページテーブル４４が４階層からなることに対応して、４つのページテーブル４４-1〜４４-4それぞれにおけるオフセット（ＰＭＬ４オフセット、ＰＤＰオフセット、ＰＤオフセット、ＰＴオフセット）と、物理ページ４０におけるオフセットとを含む。
【００３１】
カーネルがＣＲ３制御レジスタ４６に最上位のページテーブル４４-1（ＰＭＬ４テーブル）のベースアドレスを設定する。これによりページテーブル４４-1が指定され、当該テーブルにてＰＭＬ４オフセットで指定されるアドレスから次の階層のページテーブル４４-2のベースアドレスが取り出され、ページテーブル４４-2が指定される。以下、同様にして、ページテーブル４４-2及びＰＤＰオフセットを用いてページテーブル４４-3が指定され、ページテーブル４４-3及びＰＤオフセットを用いてページテーブル４４-4が指定され、さらに、ページテーブル４４-4及びＰＴオフセットを用いて物理ページ４０が指定され、そして、当該物理ページ４０と仮想アドレス４２に格納された物理ページでのオフセットとを用いて物理アドレスが定まる。
【００３２】
具体的には、仮想アドレス４２から物理アドレスへの変換は、メモリ管理ユニット（Memory Management Unit：ＭＭＵ）及びトランスレーション・ルックアサイド・バッファ（Translation Lookaside Buffer：ＴＬＢ）を利用して行われる。
【００３３】
仮想記憶空間に配置されるデータのレイアウトはＯＳ及びＣＰＵアーキテクチャごとに異なる。図３は、本実施形態における仮想記憶空間５０のレイアウトを示す模式図であり、カーネル領域５２とユーザ領域５４とが設けられる。ちなみに、Ｌｉｎｕｘ ｘ８６＿６４における仮想記憶空間は４８ビットの仮想アドレスにより２５６ＴＢｙｔｅｓとなり、カーネル領域５２、ユーザ領域５４はそれぞれ１２８ＴＢｙｔｅｓである。カーネル領域５２には複数の領域がそれぞれ予め決められたアドレス範囲に配置され、例えば、Module mapping space（領域５６）、Kernel text mapping（領域５８）が設定される。
【００３４】
計算機２は、ユーザアプリケーションを実行するユーザモードとカーネルの動作を行うカーネルモードとで別々の仮想記憶空間を用いる。ユーザモードでの仮想記憶空間をユーザ空間、カーネルモードでの仮想記憶空間をカーネル空間と称する。具体的には、ＬｉｎｕｘではＫＰＴＩ（Kernel Page Table Isolation）にてユーザモードとカーネルモードの間で仮想記憶空間が分離する手法が実装されている。
【００３５】
さらに計算機２においては、上述したカーネル空間の改竄という課題を解決するために、カーネルモードについてカーネル空間とは別の仮想記憶空間を用意する。当該仮想記憶空間を秘密空間と称することにする。計算機２は、不正なモジュールやカーネル脆弱性を用いた攻撃によるカーネル空間の書き換えによる影響を回避するため、所定のタイミングにおいてカーネルの仮想記憶空間をカーネル空間から秘密空間に切り替え、秘密空間上において監視を行ってカーネル空間への不正操作を検出する。これにより、カーネルの脆弱性を利用されて特権ユーザが奪取された後、意図しないカーネルモジュール（以下、モジュール）が挿入されたことを検出できる。ちなみに、カーネルの脆弱性を利用されてカーネル空間の書き換えが起こったとしても、秘密空間上のセキュリティ機構は別の仮想記憶空間に存在するため、書き換えの影響を受けない。
【００３６】
ＣＰＵ１０は設定手段２０、切替手段２２、監視実行手段２４、権限判定手段２６として機能することにより当該セキュリティ機構を実現する。
【００３７】
設定手段２０は、ＯＳの起動時にカーネル空間及びユーザ空間とは別に秘密空間を設ける処理を行う。後述するように、カーネル空間及びユーザ空間のうち、秘密空間の切り替え相手の仮想記憶空間はカーネル空間に制限される。また、設定手段２０は監視処理を記述した監視コード、及びカーネル空間に関しての監視対象について初期状態を秘密空間に記憶させる処理を行う。
【００３８】
切替手段２２は、カーネルモードでの動作時における所定のタイミングにて、カーネルが利用する仮想記憶空間をカーネル空間から秘密空間へ切り替える処理（第一切替処理）を行う。例えば、切替手段２２は、監視対象を変更するシステムコール又は当該システムコールによって呼び出される所定の関数を検出した場合に第一切替処理を行う。
【００３９】
監視実行手段２４は、第一切替処理に伴い秘密空間にて監視コードを実行し、監視処理として、現時点の監視対象を、秘密空間に保存されている監視対象の初期状態と比較してカーネル空間の改竄を検出する改竄検出処理と、当該改竄検出処理の後に、カーネルが利用する仮想記憶空間を秘密空間からカーネル空間へ切り替える処理（第二切替処理）とを行う。
【００４０】
権限判定手段２６は、切替手段２２により第一切替処理が行われた場合に、例えば入力装置６からユーザが入力する認証情報に基づいて監視対象の更新権限の有無を判定する。例えば、認証情報を入力したユーザが、正規ユーザやシステム管理者であることを認証情報に基づいて判定する。権限判定手段２６により更新権限が有ると判定された場合には、設定手段２０は秘密空間に保存される監視対象の初期状態の改変を、監視対象と検証用データとの比較によって検出し、検出された改変の内容で更新する。この検出は改竄検出処理のコードを流用して行えばよい。
【００４１】
図４は計算機２において生成される仮想記憶空間について説明する模式図である。上述したように、ＫＰＴＩによりカーネル及びプロセスごとに仮想記憶空間が２つ作成される。さらに、本発明では秘密空間が１つ作成される。具体的には、ＯＳが起動されると、仮想記憶空間ごとにページテーブル４４が生成される。ＬｉｎｕｘのページテーブルはＰＧＤ、ＰＵＤ、ＰＭＤ、ＰＴＥの４階層で構成され、物理メモリ６０でのその位置は最上位であるＰＧＤテーブルのベースアドレスで特定され、mm_struct構造体のpgd変数がそれを指すポインタとなる。ちなみに、Ｌｉｎｕｘのページテーブルの階層は、上述したｘ８６アーキテクチャのページテーブルのＰＭＬ４、ＰＤＰ、ＰＤ、ＰＴという４階層に対応している。図４では物理メモリ６０にカーネル空間７０のページテーブル６２、ユーザ空間７２のページテーブル６４、及び秘密空間７４のページテーブル６６が設定され、カーネル空間７０、ユーザ空間７２及び秘密空間７４からなる仮想記憶空間の組７６が生成される。
【００４２】
また、１つのプロセスの生成に対応してカーネル空間及びユーザ空間が追加生成される。例えば、プロセスＩＤがｋであるプロセスに対応して、物理メモリ６０にはページテーブル６２-k，６４-kが設定され、仮想記憶空間の組７６-kとしてカーネル空間７０-k及びユーザ空間７２-kが生成される。
【００４３】
一方、秘密空間７４はプロセスが追加されても追加されず、基本的には１つの秘密空間７４を複数のプロセスで共用することができる。
【００４４】
例えば、組７６の３つの仮想記憶空間それぞれのページテーブルの物理アドレスは、カーネル空間７０についてはmm_struct構造体のinit_mm変数が持つpgd変数とし、ユーザ空間７２についてはinit_mm変数が持つpgd変数に１ページサイズ分（ｘ８６＿６４では４Ｋｂｙｔｅｓ）を論理和した値とし、秘密空間７４についてはinit_mm変数が持つpgd変数に４ページサイズ分を論理和した値とすることができる。
【００４５】
カーネル空間７０、ユーザ空間７２、秘密空間７４は基本的には互いに複製の関係にあり、図３にて説明したようにそれぞれの上半分はカーネル領域５２であり、下半分はユーザ領域５４である。一方、ユーザ空間７２のページテーブルのうちカーネル領域５２に対応する部分には基本的にカーネルページはマップされず（Kernel Unmap）、SYSCALL発行に必要な最小限のカーネルページだけが含まれる。また、Supervisor Mode Execution Prevention（ＳＭＥＰ）及びSupervisor Mode Access Prevention（ＳＭＡＰ）というｘ８６アーキテクチャが提供するメモリ保護機能により、カーネルモードで利用されるカーネル空間７０及び秘密空間７４のユーザ領域５４のコードは実行できず、またアクセスできない。
【００４６】
ユーザアプリケーションの実行に際してはシステムコールにより仮想記憶空間をユーザ空間７２とカーネル空間７０との間で切り替えることができ、これによりカーネルの機能を利用することができる。一方、秘密空間７４はカーネル空間７０との間でしか切り替えられない。つまりユーザ空間７２と秘密空間７４とは直接には切り替えられない。また、カーネル空間７０から秘密空間７４への切り替えも第一切替処理を行う切替手段を介した場合のみに制限される。つまり、カーネル空間７０とは別の仮想記憶空間として秘密空間７４を設けることで、カーネル空間７０における監視対象となるカーネルコードが実行中に利用する仮想アドレスからは秘密空間７４にはアクセスすることができない。これらの点についてはさらに後述する。
【００４７】
組７６-kのカーネル空間７０-k及びユーザ空間７２-kの位置、構成は上述のカーネル空間７０及びユーザ空間７２と同様とすることができる。
【００４８】
図５はカーネル空間７０及び秘密空間７４の構造を説明する模式図である。上述したように、秘密空間７４は基本的にはカーネル空間７０からの複製である。よって、カーネル空間７０のカーネルコード８０ａ及びデータ８２ａが秘密空間７４のカーネルコード８０ｂ及びデータ８２ｂに複製される。また、本発明では、カーネル空間７０には監視実行手段２４が用いる監視コード８６ａ及び検証用データ８４ａが定義され、これらが秘密空間７４の監視コード８６ｂ及び検証用データ８４ｂとして複製される。ここで、検証用データ８４はカーネル空間７０に関しての監視対象とするデータ（以下、監視対象データ）についての初期状態を表すものである。つまり、本実施形態では、設定手段２０は、カーネル空間７０に監視コード８６ａ及び検証用データ８４ａを記憶させ、これを秘密空間７４に複製することで、秘密空間７４に監視コード８６ｂ及び検証用データ８４ｂを記憶させる。なお、カーネル空間７０の監視コード８６ａ及び検証用データ８４ａはページテーブル上にてアクセス制限のフラグ操作を行い参照不可とする。例えば、設定手段２０が当該操作を行う。なお、監視対象をデータのみならずプログラムとしてもよい。
【００４９】
具体的には、監視用ならびに仮想記憶空間の切り替えを行うカーネルコード８６と検証用データ８４はKernel text mapping（図３の領域５８）に、また監視対象データはModule mapping space（図３の領域５６）にそれぞれ配置する。既に述べたように秘密空間７４はカーネル空間７０からの複製であり、ＣｏＷ（Copy on Write）を無効化することで、秘密空間７４に仮想記憶空間を切り替えた後でもModule mapping spaceを参照可能とする。一方、カーネル空間７０にて監視コード８６ａ及び検証用データ８４ａが書き換えられることを防ぐため、ＰＴＥ（Page Table Entry）にて読み書きをオフとし、参照不可能とする。
【００５０】
図６は計算機２における秘密空間７４による監視の開始を説明する概略のフロー図である。ＯＳ（カーネル）はそのブート動作（ステップＳ５）にて、カーネル空間７０の初期化処理（mm init関数）及びＫＰＴＩによるユーザ空間７２の初期化処理（kaiser init関数）を行う。次に、カーネルは物理記憶空間に秘密空間７４を確保し初期化処理を行う（ステップＳ１０）。カーネルはモジュール読込処理（load default modules関数）を実行し、モジュールをロードする（ステップＳ１５）。そして、カーネルはカーネル空間７０において記憶した検証用データ８４ａ及び監視コード８６ａを秘密空間７４に複製させることで、それぞれ秘密空間７４における検証用データ８４ｂ及び監視コード８６ｂとして記憶させる（ステップＳ２０）。本実施形態では監視対象データはカーネル空間７０にロードされているモジュールに関するモジュール名リストとする。当該リストはModule mapping space及びKernel text mappingに基づいて生成され、ロードされているモジュールの変化に応じて更新されるが、ステップＳ２０では、カーネルブート時での初期状態のモジュール名リストが検証用データ８４として複製される。しかる後、秘密空間７４にて監視コードによる監視が開始される（ステップＳ２５）。
【００５１】
図７は計算機２における監視動作を説明する模式図であり、ユーザモードとカーネルモードとの遷移における仮想記憶空間の切り替わり、及びカーネルモードでのカーネル空間７０と秘密空間７４との切り替わりが示されている。
【００５２】
ユーザモードにおいては、割り込み（SYSCALL，IRQ Interrupt）や例外（Exception）を発生させ（処理Ａ１）、カーネルモードへ遷移する（処理Ａ２）。具体的には、ユーザ空間７２のユーザ領域５４にてアプリケーションプログラムによりSYSCALL等が発行されると、ユーザ空間７２のカーネル領域５２にマップされたSWITCH_KERNEL_CR3関数９０を呼び出してカーネル空間７０への切り替えが行われる。ちなみに、SWITCH_KERNEL_CR3関数９０は図２に示したＣＲ３制御レジスタ４６にカーネル空間７０のページテーブルを指し示すinit_mm変数のpgd変数を書き込み、これに対応してカーネルが仮想記憶空間をカーネル空間７０に切り替える。
【００５３】
さらに本発明では、カーネルモードにてカーネル空間７０から秘密空間７４への切り替えが行われる（処理Ａ３、第一切替処理）。つまり、ＣＰＵ１０が切替手段２２として機能する。具体的には、本実施形態では、この秘密空間７４への切り替えを行うために、カーネル空間７０のカーネル領域５２にカーネルコードとしてSWITCH_SECRET_CR3関数９２を用意する。この関数は、init_mm変数のpgd変数が示す物理アドレスから４ページサイズのオフセット位置、つまり秘密空間７４のページテーブルの位置を示す物理アドレスを計算してＣＲ３制御レジスタ４６に書き込み、これに対応してカーネルが仮想記憶空間を秘密空間７４に切り替える。
【００５４】
当該切り替え後、秘密空間７４におけるカーネルモードの動作は監視コードに基づいて行われ、ＣＰＵ１０は監視処理等を行う監視実行手段２４として機能する。ここで、監視実行手段２４の監視処理を行うか否かは以下の条件、（１）カーネル空間７０を変更操作するシステムコールまたは関数の呼び出しがあったこと、（２）前回の監視処理における割り込み・例外の呼び出しが予め定められた回数に達したこと、（３）一定の時間周期が到来したこと、に基づいて決めることができる。すなわち、（２）は第一切替処理が所定回数行われるごとに改竄検出処理を実行することが代表例であり、（３）は前回の改竄検出処理の実行後から所定期間経過している場合に前記改竄検出処理を実行することが代表例である。なお、これら条件のうち特定の１つが満たされたときに監視処理を行う構成とすることができる。また、これら条件の任意の１つが満たされれば監視処理を行う構成とすることもできる。
【００５５】
カーネルは、監視処理の終了後（又は監視処理を行わないと判断した後）、SWITCH_ORIGINAL_CR3関数９４において、current変数（task_struct構造体）の持つactive_mm構造体の持つpgd変数が示す物理アドレスをＣＲ３制御レジスタ４６に書き込み、これに対応して仮想記憶空間を、実行中プロセスでのカーネル空間７０、すなわち秘密空間７４への切り替え元のカーネル空間７０に切り替える（処理Ａ４）。つまり、ＣＰＵ１０が監視実行手段２４として第二切替処理を実行する。それぞれのＣＲ３制御レジスタへの書き込み後はＴＬＢフラッシュを行って、仮想アドレスから物理アドレスへの変換キャッシュをクリアする。その後、カーネル空間７０にてSWITCH_USER_CR3関数を呼び出してユーザ空間７２に切り替え（処理Ａ５）、割り込みの終了（SYSRET Interruptreturn）および例外終了（Exception exit）にてユーザモードに遷移する（処理Ａ６）。
【００５６】
図８は計算機２における秘密空間７４による監視を説明する概略のフロー図である。図８を用いて攻撃者によるモジュールの操作に対する切替手段２２及び監視実行手段２４の動作を説明する。
【００５７】
攻撃者はユーザ権限にてカーネル脆弱性を悪用した攻撃を実行し悪意のあるコードを書き込み（ステップＳ３０）、当該悪意のあるコードにより特権を奪取する（ステップＳ３５）。攻撃者は奪取した特権を利用して、不正なモジュールを挿入（sys_init_moduleシステムコール）、またはモジュールの除去（sys_delete_moduleシステムコール）を行う。カーネルは切替手段２２として機能し、例えば、監視対象とするモジュール名リストを変更するモジュール関係のシステムコール発行を捕捉し（entry_SYSCALL_64関数内）（ステップＳ４０）、当該システムコールの発行後、かつ次にモジュールの初期化関数（add_unformed_module関数）が呼ばれるよりも前に秘密空間７４に切り替える（図７の処理Ａ３）。
【００５８】
カーネルは秘密空間７４の監視コードを実行して、現時点のモジュール名リスト（modules変数）と、検証用データ８４ｂとして保存されている初期状態でのモジュール名リストとを比較する監視処理を行って（ステップＳ４５）、不正なモジュールの検出を行う（ステップＳ５０）。その後、実行中プロセスのcurrent変数（task_struct構造体）が参照するカーネル空間７０へ切り替える（図７の処理Ａ４）。
【００５９】
図９は攻撃側の概略のシーケンス図である。攻撃のシーケンスはユーザ空間７２とカーネル空間７０で起こる。攻撃者はユーザ空間７２にてプログラムを実行しカーネルの脆弱性を利用して特権を奪取する（ステップＳ６０）。具体的には、特権を奪取すると、攻撃者はinsmodコマンドを実行し、ルートキットなどの不正なモジュールを挿入するための処理を行う（ステップＳ６５）。そして、insmodコマンドの中でsys_init_moduleシステムコールを発行してカーネルモードに遷移し（ステップＳ７０）、カーネル空間７０にてカーネルへのモジュール挿入が行われる。このモジュール挿入に伴い、監視対象データであるモジュール名リストの内容が改変される（ステップＳ７５）。システムコールが終了してユーザモードに遷移する（ステップＳ８０）。これにより、攻撃者はモジュールを利用した攻撃が可能となる（ステップＳ８５）。
【００６０】
図１０は計算機２における秘密空間７４を用いた監視シーケンスを示す図である。カーネル空間７０にて予め定めた注意イベントが発生すると（ステップＳ１００）、カーネルモードの仮想記憶空間をカーネル空間７０から秘密空間７４へ切り替える（ステップＳ１０５）。注意イベントは例えば、図８のステップＳ４０に関して述べたモジュール関係のシステムコール発行などとすることができる。
【００６１】
秘密空間７４では図５に示す監視コード８６ｂ及び検証用データ８４ｂを用いて監視処理が行われる。監視コードは、カーネル空間７０から監視対象とするデータ（本実施形態ではモジュール名リスト）を読み取り（ステップＳ１１０）、これと検証用データ８４ｂとの比較を行う（ステップＳ１１５）。検証用データ８４ｂは、監視対象データの初期状態、つまり未改竄の状態で保存された正しいデータであり、監視コードは当該比較の結果により監視対象データの正否、つまり現状の監視対象データが不正か否かを判定する（ステップＳ１２０）。当該判定後、監視コードは元のカーネル空間７０への切り替えを行う（ステップＳ１２５）。
【００６２】
ステップＳ１２５の判定結果に基づいて攻撃の検出を行うことができ、攻撃が検出された場合には、その旨を出力しユーザに知らせるなどの処理を行うことができる。なお、秘密空間７４での監視処理は上述したように、特定のシステムコール、一定回数のシステムコール発行時、及び指定された時間周期などにて開始を判定することができる。
【００６３】
上述の実施形態では、検証用データ８４は監視対象データの初期状態であり、図６の説明にて述べたように、ＯＳのブート時に保存している。そして、当該初期状態から監視対象データが改変されることを以て攻撃を検出する。一方、ＯＳの起動後にシステム管理者が計算機２にドライバを追加するといったシステム構成の変更を行う際などにも監視対象データは変更され得る。そのような正常な改変は上述したように、権限判定手段２６により更新権限を確認することにより可能とする。その際、正規ユーザやシステム管理者等に要求する認証情報は例えば、予め定めたパスワードとすることができる。
【００６４】
切替手段２２による第一切替処理は、上述したように、監視対象を変更するシステムコール等を検出したタイミングにて行うことができ、そのために本実施形態では、モジュール名リストを変更するシステムコール発行を捕捉する。ここで、既に述べたようにルートキットは計算機へ進入した痕跡、攻撃プログラムの存在、及び自身の存在を隠蔽する機能を有し得る。そのため、モジュール名リストは、不正モジュールの追加によって初期状態から変更される一方、ルートキットの隠蔽機能により追加モジュール名を削除され再び初期状態に戻り得る。この隠蔽は追加モジュールにて初期化関数を用いることで行われる。そこで、上記実施形態では、モジュール名が追加された後であって、かつモジュールをロードする際に用いられる初期化関数が呼ばれるよりも前に秘密空間７４に切り替え、監視処理を実行することとし、これにより隠蔽を図る攻撃も検出することができる。
【００６５】
また、本発明は上述のＬｉｎｕｘ、ｘ８６＿６４以外の、カーネル空間とユーザ空間を分離して設ける仮想記憶方式の計算機、例えばＷｉｎｄｏｗｓ（登録商標）などにも適用可能である。本発明により、意図しないカーネルモジュール挿入をカーネルの仮想記憶空間の不正な書き換えとして検出することができる。カーネルの仮想記憶空間は、ユーザモードからカーネルモードに遷移した後においてのみ読み書き、実行が可能である。このため、カーネルの仮想記憶空間の不正な書き換えはカーネルモードでのカーネルコードの実行中に発生する。そこで、本発明では、カーネルモードにおいてカーネルの仮想記憶空間の監視を行うために、秘密空間７４として上述したように、カーネルコードから参照されない記憶領域を確保し、当該領域にて監視を実行する。
【００６６】
［第２の実施形態］
第２の実施形態に係る計算機の構成要素のうち、第１の実施形態と基本的に同一の構成要素には同一の符号を付して第１の実施形態での説明を援用しここでの説明の簡素化を図ることとする。
【００６７】
第２の実施形態に係る計算機２の概略の構成図は第１の実施形態の図１と共通である。第２の実施形態に係る計算機２は、第１の実施形態と同様、仮想記憶方式で動作するが、ＣＰＵ１０で行われる仮想記憶空間の切替処理に関し、第１の実施形態との相違点を有する。以下、主に当該相違点について説明する。
【００６８】
図１１はカーネルモードで使用する仮想記憶空間に関する模式図である。カーネルにて複数の仮想記憶空間を用いた攻撃困難化手法として、第１の実施形態では、当該仮想記憶空間として互いに分離したカーネル空間７０と秘密空間７４とを設ける構成を説明したが、第２の実施形態では、カーネル空間７０及び秘密空間７４とは分離して中継用空間７８をさらに設ける。
【００６９】
物理メモリ６０には、カーネル空間７０、秘密空間７４及び中継用空間７８それぞれに対応してページテーブル６２，６６，６８が設定され、これらページテーブルに基づいてカーネルモードで使用する３種類の仮想記憶空間が生成される。
【００７０】
カーネルモードで行われる処理はカーネルにおいて適切な仮想記憶空間に切り替えた後に行われる。カーネル機能の多くはカーネル空間７０に配置する一方、カーネルに備えるセキュリティ機構への攻撃を困難化するため、当該セキュリティ機構は専ら秘密空間７４又は中継用空間７８に配置する。これにより、セキュリティ機構の無効化を目的としたカーネルへの攻撃に対して、セキュリティ機構のうちの改竄可能範囲をカーネル空間７０に配置された部分に限定することができる。つまり、秘密空間７４ならびに中継用空間７８に配置されたカーネルコード・データへの攻撃を困難化し、セキュリティ機構への影響を低減する。
【００７１】
具体的には、カーネル空間７０は、システムコールからの要求、割込み要求などのカーネル機能を処理する。ここで、カーネル空間７０で処理されるカーネルコードには、カーネル脆弱性を利用した攻撃の対象となるもの（脆弱カーネルコード１００）が含まれ得る。脆弱カーネルコード１００は攻撃を受けて改竄され、カーネル空間７０の他のカーネルコード、データに有害な作用１０１を及ぼし得る。
【００７２】
秘密空間７４はカーネルのセキュリティ機能１１０を実行する仮想記憶空間であり、セキュリティ機能データ１１１、セキュリティ機能コード１１２にはそれぞれ第１の実施形態で述べた検証用データ８４ｂ、監視コード８６ｂが記憶される。監視コードの実行により、監視処理としてカーネル空間７０に対してその改竄を検出する改竄検出処理１１３がなされる。
【００７３】
中継用空間７８はユーザモードとカーネルモードとの間の遷移時、ならびにカーネル空間７０、秘密空間７４の切り替え先となる仮想記憶空間である。
【００７４】
図１１にて点線で囲む範囲１２０が本実施形態のセキュリティ機構が存在する部分である。当該セキュリティ機構では、カーネルの仮想記憶空間はカーネル空間７０、秘密空間７４、ならびに中継用空間７８の間で切り替えを行う。ユーザモードからカーネルモードへの遷移とカーネル提供機能の処理との関連により、以下の切り替えパターンが挙げられる。
【００７５】
パターン１：システムコール発行や割り込み要求時におけるユーザモードからカーネルモードへの遷移時に、ユーザ空間から中継用空間７８に切り替え（切替動作Ｃ０）、当該中継用空間７８を経由してカーネル空間７０に切り替え（切替動作Ｃ１）、対応するカーネルコードを実行する。
【００７６】
パターン２：カーネルモードからユーザモードへの遷移時に、カーネル空間７０から中継用空間７８を経由して（切替動作Ｃ１）ユーザ空間に切り替える。
【００７７】
パターン３：改竄検出処理の開始に際し、システムコール処理前にあっては中継用空間７８から秘密空間７４に切り替え（切替動作Ｃ２）、また、カーネル処理中またはシステムコール処理後にあってはカーネル空間７０から中継用空間７８を経由して（切替動作Ｃ１）秘密空間７４に切り替えて（切替動作Ｃ２）、監視処理のカーネルコードを実行する。
【００７８】
仮想記憶空間の切替処理（切替動作Ｃ１，Ｃ２）は第１の実施形態で述べたような、各仮想記憶空間に配置した専用のSWITCH関数１３０〜１３２にて管理する。ちなみに、切替動作Ｃ１に対応して、ページテーブル６２とページテーブル６８との切り替え１３５が行われ、切替動作Ｃ２に対応して、ページテーブル６６とページテーブル６８との切り替え１３６が行われる。
【００７９】
ここで、中継用空間７８からはカーネル空間７０ならびに秘密空間７４へ切り替え可能であるが、カーネル空間７０ならびに秘密空間７４からは中継用空間７８へのみ切り替え可能とする。また、カーネルモードとユーザモードとの間の遷移時は、中継用空間７８とユーザ空間との間でのみ切り替えを行う。すなわち、秘密空間は、第１の実施形態と同様、ユーザ空間との切り替えを禁止される。ちなみに、第１の実施形態では秘密空間の切り替え相手はカーネル空間７０に制限される。これに対し、第２の実施形態では秘密空間７４の切り替え相手は中継用空間７８に制限され、カーネル空間７０から秘密空間７４への切り替え（第一切替処理）と秘密空間７４からカーネル空間７０への切り替え（第二切替処理）とは中継用空間７８を経由して行われる。
【００８０】
さて、カーネルモードにて脆弱性を突く攻撃は、当該脆弱性を含むカーネルコードと同一の仮想記憶空間上にのみ影響を及ぼす。従って、カーネル機能に脆弱性の存在を想定した場合、当該脆弱性を利用した攻撃はカーネル空間７０で行われ、カーネル空間７０に配置されたカーネルコード・データのみ攻撃可能となる。ここで、カーネル空間７０への攻撃により、カーネル空間７０から秘密空間７４への第一切替処理を無効化された場合、カーネル処理中およびシステムコール処理後の秘密空間７４での監視コードの実行を回避されてしまう。この点に対して、秘密空間７４及び中継用空間７８はカーネル空間７０に対する攻撃の影響は受けない。そこで、本実施形態の監視実行手段２４は第一切替処理が行われる場合だけでなく、システムコールの処理前など、秘密空間７４、中継用空間７８のみでカーネル空間７０を介さないタイミングでセキュリティ機能を実行することで、カーネル空間７０への攻撃に対処することを可能とする。
【００８１】
本実施形態の計算機２は第１の実施形態と同様、仮想記憶方式で動作する。また、ＯＳはＫＰＴＩを備えＳＣＩ（System Call Isolation）を導入したＬｉｎｕｘとし、ＣＰＵアーキテクチャはｘ８６＿６４とする。
【００８２】
図１２は本実施形態の計算機２において生成される仮想記憶空間について説明する模式図である。第１の実施形態と同様、秘密空間７４が１つ生成されると共に、プロセスごとにカーネル空間７０及びユーザ空間７２が生成される。また、本実施形態では、プロセスごとに中継用空間７８も作成される。例えば、プロセスＩＤがｋであるプロセスに対応して、物理メモリ６０にはカーネル空間、中継用空間、ユーザ空間のページテーブルが設定され、カーネル空間７０-k、中継用空間７８-k及びユーザ空間７２-kからなる１組の仮想記憶空間が生成される。
【００８３】
これら複数種類の仮想記憶空間の構築を具体的に説明する。ＫＰＴＩはプロセスごとにユーザおよびカーネルの仮想記憶空間を作成し、ＳＣＩはプロセスごとにシステムコール処理用の仮想記憶空間を作成する。ＫＰＴＩで作成されるユーザの仮想記憶空間はユーザ空間７２となり、カーネルの仮想記憶空間は中継用空間７８として利用する。ＳＣＩにより追加されるカーネルの仮想記憶空間はカーネル空間７０として利用する。さらにこれらとは別に、最初のプロセスの生成時に秘密空間７４が作成され、これは追加生成される他プロセスと共有する。
【００８４】
例えば、ＫＰＴＩでのカーネルの仮想記憶空間であるinit_mm構造体のpgd変数を中継用空間７８の初期値とする。ユーザ空間７２のページテーブルはinit_mm構造体のpgd変数に１ページサイズ（ｘ８６＿６４では４Ｋｂｙｔｅｓ）を論理積して得られる物理アドレスに配置する。秘密空間７４は、init_mm構造体のpgd変数に４ページサイズ（ｘ８６＿６４では１６Ｋｂｙｔｅｓ）を論理積して得られる物理アドレスに配置する。カーネルの仮想記憶空間は、ＳＣＩにてtask_struct構造体に追加されるmm_struct構造体のkernel_pgd変数とする。
【００８５】
プロセス生成時に作成される仮想記憶空間は中継用空間７８-k、カーネル空間７０-k、ユーザ空間７２-kである。current変数のtask_struct構造体に含まれるmm_struct構造体のpgd変数を中継用空間７８-k、kernel_pgd変数をカーネル空間７０-kとし、pgd変数の物理アドレスに１ページサイズを論理積した物理アドレスをユーザ空間７２-kとし、それぞれ初期値より複製する。
【００８６】
図１３は仮想記憶空間の切替処理を説明する模式図である。本実施形態でのカーネルの仮想記憶空間の切り替えはそれぞれの仮想記憶空間に配置されたカーネルコードにより行う。上述した各切り替えパターンについて本実施形態での実現方式を説明する。
【００８７】
パターン１：ユーザモードからカーネルモードへの遷移後（処理Ｂ１）、ユーザ空間７２のSWITCH_KPTI_CR3関数１４０にて、ユーザ空間７２の物理アドレスに１ページサイズ排他的論理和した値をＣＲ３制御レジスタに書込み、中継用空間７８に切り替える（切替動作Ｃ０）。さらに中継用空間７８のSWITCH_KERNEL_CR3関数１４１にて、current変数のkernel_pgd物理アドレスをＣＲ３制御レジスタに書込み、カーネル空間７０に切り替える（切替動作Ｃ１）。
【００８８】
パターン２：カーネルモードからユーザモードへの遷移の前に、カーネル空間７０のSWITCH_KERNEL_CR3関数１４２にて、current変数に含まれるpgd変数の物理アドレスをＣＲ３制御レジスタに書込み、中継用空間７８に切り替える（切替動作Ｃ１）。中継用空間７８のSWITCH_KPTI_CR3関数１４３にて、中継用空間７８の物理アドレスに１ページサイズを論理積した値をＣＲ３制御レジスタに書込み、ユーザ空間７２に切り替える（切替動作Ｃ０）。しかる後、カーネルモードからユーザモードへ遷移する（処理Ｂ２）。
【００８９】
パターン３：システムコール処理前におけるセキュリティ機能の実行に関しては、中継用空間７８のSWITCH_SECURITY_CR3関数１４４にて、init_mm構造体のpgd変数に４ページサイズを論理積した物理アドレスをＣＲ３制御レジスタに書込み、秘密空間７４に切り替える（切替動作Ｃ２）。カーネル処理中およびシステムコール処理後におけるセキュリティ機能の実行に関しては、まず、カーネル空間７０のSWITCH_KERNEL_CR3関数１４２にて、中継用空間７８に切り替え（切替動作Ｃ１）、その後、中継用空間７８のSWITCH_SECURITY_CR3関数１４４により秘密空間７４に切り替える（切替動作Ｃ２）。
【００９０】
本実施形態におけるセキュリティ機構は仮想記憶空間の切替処理の監視を含む。つまり、本実施形態の計算機２は、ＳＥＬｉｎｕｘ（Security-Enhanced Linux）等の強制アクセス制御を提供するためのＬＳＭ（Linux Security Module）という従来の仕組みに加え、カーネルの仮想記憶空間における仮想記憶空間の切替処理を監視し保護対象とする。図１４は、当該監視の対象領域を示す模式図であり、Monitored Data（ハッチングを施した部分）が監視対象領域である。当該監視は秘密空間７４の領域１５０に記憶された監視コード及び検証用データを用いて行われる。ちなみに、領域１５０に記憶されるデータ、コードは、図１１のセキュリティ機能１１０のセキュリティ機能データ１１１、セキュリティ機能コード１１２に当たり、これらは上述したように第１の実施形態の検証用データ８４ｂ、監視コード８６ｂに相当する。なお、これらデータ、コードは仮想記憶空間を複製により生成することによりカーネル空間７０及び中継用空間７８の領域１５１，１５２にも存在するが、これら領域１５１，１５２はアクセス制限されている。
【００９１】
本実施形態の監視は、基本的には第１の実施形態にて図６を用いて説明した手順と同様にして開始される。つまり、Ｌｉｎｕｘカーネルの起動時、kaiser_init関数の終了後において、ＫＰＴＩのユーザ、カーネルの仮想記憶空間が作成され、カーネルコード・データの仮想アドレスの位置を定める。その後、中継用空間７８、秘密空間７４の領域を物理記憶空間に確保し、カーネルの仮想記憶空間上に配置される、監視に利用する検証用データとして、カーネル空間７０のモジュール名リスト、ＬＳＭ及び仮想記憶空間の切替処理を行うSWITCH_KERNEL_CR3関数の仮想アドレスが秘密空間７４の領域１５０に複製される。
【００９２】
本実施形態のセキュリティ機構におけるカーネル監視を行うタイミングは、システムコールの実行前と実行後、およびカーネルの処理中における任意のタイミングとしている。監視処理においては、秘密空間７４に切り替え後、カーネルモジュール、ＬＳＭを呼出すカーネルコードの仮想アドレス、ならびに仮想記憶空間の切替処理の仮想アドレスに対して改竄の有無を検証用データと比較することで判断する。
【００９３】
仮想記憶空間の切替処理への攻撃を受けた際の計算機２の動作について説明する。上述したように、中継用空間７８はSWITCH_KPTI_CR3関数１４３、SWITCH_SECURITY_CR3関数１４４、SWITCH_KERNEL_CR3関数１４１、ならびに割り込みや例外捕捉関連のカーネルコードを実行することができる。秘密空間７４はSWITCH_SECURITY_CR3関数１４５、ならびに監視処理用のカーネルコードを実行することができる。カーネル空間７０は、SWITCH_KERNEL_CR3関数１４２、ならびにその他のカーネル機能を提供するカーネルコードを実行することができる。
【００９４】
カーネルモードの処理毎に仮想記憶空間を分離して管理し、カーネルコード・データはそれぞれの配置された仮想記憶空間にて実行・読み書きする。カーネルコードに脆弱性が存在する場合、該当する仮想記憶空間上にマッピングされているカーネルコード・データのみ攻撃対象となる。本実施形態においては、殆どのカーネル機能はカーネル空間７０にマッピングされるため、セキュリティ機能の回避のためにカーネル脆弱性を利用した攻撃による攻撃対象は、カーネル空間７０上にある仮想記憶空間の切り替えを行うSWITCH_KERNEL_CR3関数１４２となる。
【００９５】
ここで、セキュリティ機構の監視回避として、カーネル空間７０に配置されるSWITCH_KERNEL_CR3関数１４２に対して攻撃を巧妙に行なった場合、カーネル空間７０から直接、ユーザ空間７２に切り替え、ユーザモードに遷移することは可能といえる（後述の図１５の点線１６０ｆ）。カーネル空間７０のSWITCH_KERNEL_CR3関数１４２を改竄した場合、セキュリティ機構の監視のうちカーネル処理中、ならびにシステムコール処理後の監視処理は回避される。しかしながら、中継用空間７８、秘密空間７４は攻撃の影響を受けないため、システムコール処理前の監視処理は回避されない。
【００９６】
本実施形態では、カーネルへの攻撃に対し、秘密空間への切替処理に対する改竄を困難とし、部分的な保護を実現している。本実施形態のカーネル監視機構の行う監視タイミングにおいても攻撃による全ての監視処理の回避は行えない。攻撃によるSWITCH_KERNEL_CR3関数１４２の改竄により、カーネル空間７０においてカーネルパニック等を発生した際は、カーネルモードからユーザモードに遷移できず攻撃は失敗する。
【００９７】
図１５はカーネル脆弱性を利用した仮想記憶空間の切替処理への攻撃と検出例を説明する模式図である。eBPF（extended Berkeley Packet Filter）のカーネル脆弱性を利用した攻撃におけるフローを点線１６０ａ〜１６０ｆで示している。また、改竄検出におけるフローを点線１６２ａ〜１６２ｃで示している。
【００９８】
当該攻撃では、ユーザモードのプロセス１７０から攻撃の起点となるカーネルコード１７２（kernel/bpf/verifier.c）の存在する仮想記憶空間の任意の仮想アドレスに対して、本来は許可されていない読み書きを可能とする。
【００９９】
本実施形態の計算機２において当該カーネル脆弱性を利用して攻撃を試みる場合、カーネルコード１７２の実行はカーネル空間７０となり、同一の仮想記憶空間にある仮想記憶空間の切替処理を行うSWITCH_KERNEL_CR3関数１４２を改竄可能である（点線１６０ｅ）。
【０１００】
カーネル空間７０における攻撃時には、中継用空間７８および秘密空間７４の仮想アドレスは指定できないため、それらの仮想記憶空間に配置されるカーネルコード・データの改竄は困難である。このため、攻撃後に新たなシステムコールが発行される際（点線１６２ａ）には、システムコール処理前の状態のままであるカーネル監視機構１８０（図１１のセキュリティ機能１１０）による監視処理は回避されない。よって、中継用空間７８から秘密空間７４に切り替え（点線１６２ｂ）、監視処理（点線１６２ｃ，図１１の改竄検出処理１１３）を実行することでカーネル空間７０に存在するSWITCH_KERNEL_CR3関数１４２を呼び出すカーネルコードの改竄有無は検出可能である。
【符号の説明】
【０１０１】
２  計算機、４  主装置、６  入力装置、８  出力装置、１０  ＣＰＵ、１２  主記憶装置、１４  補助記憶装置、１６  バス、２０  設定手段、２２  切替手段、２４  監視実行手段、２６  権限判定手段、４０  物理ページ、４２  仮想アドレス、４４  ページテーブル、４６  ＣＲ３制御レジスタ、５０  仮想記憶空間、５２  カーネル領域、５４    ユーザ領域、６０  物理メモリ、７０  カーネル空間、７２  ユーザ空間、７４  秘密空間、７８  中継用空間、８４  検証用データ、８６  監視コード。
【図１】
2020140689.tif 000003
【図２】
2020140689.tif 000004
【図３】
2020140689.tif 000005
【図４】
2020140689.tif 000006
【図５】
2020140689.tif 000007
【図６】
2020140689.tif 000008
【図７】
2020140689.tif 000009
【図８】
2020140689.tif 000010
【図９】
2020140689.tif 000011
【図１０】
2020140689.tif 000012
【図１１】
2020140689.tif 000013
【図１２】
2020140689.tif 000014
【図１３】
2020140689.tif 000015
【図１４】
2020140689.tif 000016
【図１５】
2020140689.tif 000017