(57)【要約】【課題】  異なるルールが適用される異なるクラスのデータを記憶するための特殊目的ヒープを生成すること。【解決手段】  データをそのデータクラスとともに使用するように指定されたヒープだけに記憶し、ヒープに適用されるルールに反するヒープ上のデータに対する動作の実行を妨げることによって異なるヒープに適用される異なるクラスのルールを守るように設計された関数ライブラリが提供される。複数のヒープの使用によって、あるデータに対してデータに反するオペレーションが実行されるプログラマエラーが防止される。これは、その動作を実行するために、プログラマは、１つのヒープからもう１つのヒープへ明示的にデータをコピーしなければならないためである。一実施例では、秘密データを記憶するために１つのヒープが指定され、汎用（非秘密）データのために他のヒープが指定される。【選択図】  図３
2005327255.tif 000002
【特許請求の範囲】
【請求項１】
少なくとも２つの異なるデータクラスを管理するためのシステムであって、
複数のヒープを生成する１または複数のメモリ管理コンポーネントであって、前記ヒープの各々の上にデータの使用に関する異なるルールセットが存在し、前記１または複数のメモリ管理コンポーネントは、プログラムが使用するための関数をエクスポーズし、前記関数は、データを記憶しおよび／または消費するように構成され、前記関数は、（１）前記ヒープのうちのどのヒープにデータを記憶するのかを、前記データの性質または意図する用法に基づいて決定し、（２）要求されたデータの使用が、前記データに適用可能な前記ルールに反しないかどうかを、前記データがどのヒープ上に位置するのかに基づいて判定するように構成され、前記関数は、前記各々のヒープに適用可能な前記ルールの違反を防ぐための１または複数の方策をとるメモリ管理コンポーネントを
備えたことを特徴とするシステム。
【請求項２】
前記複数のヒープは、なんらかの形でその使用が制限されたデータを記憶するように指定された第１のヒープと、その使用が制限されていないデータを記憶するように指定された第２のヒープとを備えたことを特徴とする請求項１に記載のシステム。
【請求項３】
前記第１のヒープは、秘密にしておくべきデータを記憶することを特徴とする請求項２に記載のシステム。
【請求項４】
前記関数のうちの第１の関数は、出力関数を備え、前記第１の関数は、前記第１のヒープ上に記憶されたデータの出力を防ぐ１または複数の方策をとることを特徴とする請求項３に記載のシステム。
【請求項５】
秘密にしておくべき前記データは、１または複数の暗号鍵を含むことを特徴とする請求項３に記載のシステム。
【請求項６】
秘密にしておくべき前記データは、解読された暗号文を含むことを特徴とする請求項３に記載のシステム。
【請求項７】
前記１または複数のコンポーネントは、１つのコンポーネントからなることを特徴とする請求項１に記載のシステム。
【請求項８】
前記各々のヒープは、１または複数のメモリ位置範囲の中に記憶され、前記範囲は、前記１または複数のコンポーネントに知られており、前記関数は、前記複数のヒープのうちのどのヒープ上に所与のデータが位置するのかを、前記範囲のうちのどの範囲に前記データのアドレスが含まれるのかに基づいて決定することを特徴とする請求項１に記載のシステム。
【請求項９】
前記１または複数の方策は、データが記憶されたヒープに適用可能なルールに反した前記データに対する動作の実行を拒絶することを含むことを特徴とする請求項１に記載のシステム。
【請求項１０】
前記１または複数の方策は、データが記憶されたヒープに適用可能なルールに反する動作を前記データに対して実行する要求がなされたことの警告を生成することを含むことを特徴とする請求項１に記載のシステム。
【請求項１１】
方法を実行するためのコンピュータ実行可能命令を使用して符号化されたコンピュータ読取り可能媒体であって、前記方法は、
各々が異なるデータクラスに対応する複数のヒープを生成すること、
第１のクラスに属する第１のデータを記憶することを含む第１の関数を実行する第１の要求を受け取ること、
前記ヒープのうちの第１のヒープから第１のメモリ部分を割り当てること、
前記第１のメモリ部分に前記第１のデータを記憶すること、
前記第１のメモリ部分に記憶されたデータを使用することを含む第２の関数を実行する第２の要求を受け取ること、および、
前記第１のクラスに属するデータに対して前記データの使用が許されるかどうかに従って、前記第２の要求の着手を許可し、または前記第２の要求の着手を妨げる少なくとも１つの動作を実行すること
を備えたことを特徴とするコンピュータ読取り可能媒体。
【請求項１２】
前記複数のヒープは、秘密にしておくべきデータクラスに対応する第１のヒープと、秘密にしておく必要のないデータクラスに対応する第２のヒープとを備えたことを特徴とする請求項１１に記載のコンピュータ読取り可能媒体。
【請求項１３】
前記第１の関数は、前記第１のメモリ部分への秘密の記憶を実行し、前記第２の関数は、前記第１のメモリ部分のアドレスを受け取り、前記第２の関数は、受け取った前記アドレスに記憶されたデータに対して、受け取った前記アドレスの内容を開示することになる動作を実行するように構成されており、前記第２の関数は、受け取った前記アドレスが前記第１のヒープ上に位置する場合に、前記動作の実行を妨げるように構成されていることを特徴とする請求項１１に記載のコンピュータ読取り可能媒体。
【請求項１４】
前記動作は、前記受け取ったアドレスの内容を出力装置に書き込むことを含むことを特徴とする請求項１３に記載のコンピュータ読取り可能媒体。
【請求項１５】
前記第２の要求の着手を妨げる少なくとも１つの動作は、前記第２の要求の実行を拒絶することを含むことを特徴とする請求項１１に記載のコンピュータ読取り可能媒体。
【請求項１６】
前記第２の要求の着手を妨げる少なくとも１つの動作は、前記要求を実行する前に警告を生成することを含むことを特徴とする請求項１１に記載のコンピュータ読取り可能媒体。
【請求項１７】
データを誤用から守る方法であって、
第１のクラスに属する第１のデータを処理する第１の関数セットを提供することであって、前記関数は、前記第１のデータを第１のヒープ上に記憶すること、および、
前記第１のクラスに適用されるルールセットに反する方法で第２のデータを処理する第２の関数セットを提供することであって、前記第２の関数セットは、前記第２のデータを第２のヒープ上に記憶し、前記第２の関数セットは、前記第１のヒープ上の前記データを前記第２のヒープにコピーするのを防ぐ少なくとも１つの方策をとるように構成され、前記第２の関数セットは、前記第１のクラスに適用される前記ルールセットに反する方法で前記第１のヒープ上のデータの使用を妨げる少なくとも１つの方策をとるように構成されていること
を備えたことを特徴とする方法。
【請求項１８】
前記第１のクラスに適用されるルールセットは、前記第１のクラスのデータを秘密にしておく要求を含み、前記第２のクラスは、非秘密データを含むことを特徴とする請求項１７に記載の方法。
【請求項１９】
前記第１のクラスに適用されるルールセットは、前記第１のクラスのデータを出力装置上に送信してはならないとするルールを含むことを特徴とする請求項１７に記載の方法。
【請求項２０】
前記第１の関数セットは、暗号鍵を生成しまたは適用する関数を含み、前記第１のクラスのデータは、１または複数の暗号鍵を含むことを特徴とする請求項１７に記載の方法。
【請求項２１】
前記第１のヒープ上の前記データを前記第２のヒープにコピーするのを防ぐ少なくとも１つの方策は、前記第２のヒープにコピーするデータが前記第１のヒープに位置するかどうかを判定し、コピーする前記データが前記第１のヒープに位置する場合には、前記コピーの実行を拒絶することを含むことを特徴とする請求項１７に記載の方法。
【請求項２２】
前記第１のクラスに適用される前記ルールセットに反する方法で前記第１のヒープ上のデータの使用を妨げる少なくとも１つの方策は、前記第１のヒープ上に位置するデータの要求された使用の実行を拒絶することを含むことを特徴とする請求項１７に記載の方法。
【請求項２３】
前記第１のクラスに適用される前記ルールセットに反する方法で前記第１のヒープ上のデータの使用を妨げる少なくとも１つの方策は、前記第１のヒープ上に位置するデータの要求された使用を実行する前に警告を生成することを含むことを特徴とする請求項１７に記載の方法。
【請求項２４】
方法を実行するためのコンピュータ実行可能命令を使用して符号化されたコンピュータ読取り可能媒体であって、前記方法は、
各々が異なるデータクラスに対応する複数のヒープを生成すること、
メモリの一部分を使用することを含む関数を実行する要求を受け取ることであって、前記メモリの一部分は、前記複数のヒープのうちの第１のヒープ上に位置すること、および、
前記使用が前記第１のヒープを支配しているルールに反していないかどうかに従って、前記要求の着手を許可し、または前記要求の着手を妨げる少なくとも１つの動作を実行すること
を備えたことを特徴とするコンピュータ読取り可能媒体。
【請求項２５】
前記使用は、前記メモリの一部分にデータを書き込むことを含み、前記ルールは、前記第１のヒープ上に記憶することができるデータの型、または前記第１のヒープにデータを書き込むことができる状況を支配することを特徴とする請求項２４に記載のコンピュータ読取り可能媒体。
【請求項２６】
前記使用は、前記メモリの一部分からデータを読み取ることを含み、前記ルールは、前記第１のヒープ上に記憶されたデータから実施することができる使用の型、または前記第１のヒープからデータを読み取りまたは使用することができる状況を支配することを特徴とする請求項２４に記載のコンピュータ読取り可能媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は一般にコンピューティングの分野に関し、より詳細には、期待され、予想され、または要求されるさまざまな使用を受けるデータを管理するための複数のヒープの使用に関する。
【背景技術】
【０００２】
一般的なコンピューティング環境において、実行中のプログラムは、記憶する必要があるデータを生成しまたは受け取ることができる。「ヒープ（heap）」と呼ばれるメモリの一部分を使用して、このようなデータを記憶する。典型的には、動的メモリ割当てを実行する必要があるプログラムは、プログラムが開始された直後にメモリ管理関数のライブラリをロードする。ライブラリは、オペレーティングシステムから大きなメモリブロックを要求してヒープを形成し、プログラムは、数バイトのメモリの割当てを要求するルーチンを、ライブラリから呼び出す。ライブラリは、ヒープからメモリバイトを提供することによってプログラムのこの要求に応える。
【０００３】
通常、プログラムは、１つのヒープを有する。ヒープは、プログラムの必要に応じて拡大または縮小させることができるが、典型的に、ヒープ内の全てのメモリは、それに対して動的に空間が割り当てられた全てのデータを包含する区別されない単一のクラスである。すなわち、特定の位置に記憶できるデータに関して、または特定の位置に記憶されたデータを用いて実行できることに関して、ヒープ内の異なる位置は区別されない。
【発明の開示】
【発明が解決しようとする課題】
【０００４】
ある種のデータ型は、異なるクラスのデータを使用しなければならない方法において、範囲を示す異なるクラスに分けることができる。例えば、データを秘密データまたは非秘密データに分類することができる。「秘密」データには暗号鍵、パスワードなどが含まれる。ファイル、ネットワークなどのプログラムのアドレス空間の外側の場所に非秘密データを送信することはごく普通のことである。秘密データもプログラムのアドレス空間の外側に送信することができるが、秘密データの送信は、非常に限られた状況に限って実行されなければならない。機密保護違反の１つのクラスは、プログラマエラー（programmer error）によって秘密データが公開の場に不注意に送られる場合である。従来のシステムは他のデータと同じヒープに秘密データを記憶するため、そのデータが秘密データか否かをデータの位置から判定する方法はない。
【０００５】
以上のことから、従来技術の上記の欠点を克服する機構が求められている。
【課題を解決するための手段】
【０００６】
本発明は、複数のヒープを使用して異なるクラスのデータを記憶することを提供する。アプリケーションを構築するためにプログラマが使用可能なライブラリ関数は、どの型のデータを記憶するのかに応じて、特定のヒープにデータを割り当てるように設計される。さらに、ライブラリ関数は、１つのヒープから別のヒープへデータをコピーしないように設計される。明示の命令が発行された場合には、１つのヒープから他のヒープへデータをコピーすることができるが、プログラマが誤ってこのような命令を発行する可能性は比較的に低い。従って、不注意による秘密データの漏えいは大幅に低減する。
【０００７】
好ましい一実施形態では、一般的なデータのための１つのヒープと、秘密データ（例えば暗号鍵、パスワードなど）のためのもう１つのヒープの２つのヒープが割り当てられる。秘密データを生成し管理しまたは記憶するライブラリ関数は、このような秘密データを記憶するために、秘密ヒープからメモリを割り当てる。秘密ヒープを構成するメモリページの仮想アドレス範囲は既知なので、所与のメモリアドレスに含まれるデータが秘密ヒープの一部であるか否かは、そのアドレスから容易に判定することができる。従って、ライブラリの他の関数は、秘密ヒープの一部であることが知られている位置に記憶されたデータを用いてある種の動作を実行しないように設計される。（例えば、ネットワーク上にデータを送信する関数は、秘密ヒープ上に位置するデータが送信されようとした場合にはデータを送信しないように構成することができる。データの送信を拒絶する代わりに、ネットワーク上に秘密データが送信されようとした場合にユーザに警告を発し、ユーザが秘密の漏えいを防ぐ動機を有すると関連秘密保護モデルがみなす限り、送信を中止するオプションをユーザに与えるように関数を構成することもできる。）１つのヒープから別のヒープにデータを明示的にコピーすることは常に可能だが、このようなコピーを実行する命令を明示的に発しなければならない（すなわち、プログラマが知らないうちにライブラリ関数がこっそりと１つのヒープから別のヒープへデータを転送することはしない）ので、ヒープに記憶された秘密データの保護は、そうしようというプログラマの意図が相当に信頼性の高い指示であったときにのみ、そのヒープから秘密データをコピーすることができないことにある。
【０００８】
複数のヒープの使用は、秘密および非秘密データに対する２つのヒープに限定されない。より一般的には、任意の数のデータクラスに対して任意の数のヒープを指定することができる。場合によっては、異なるクラスのデータが異なるクラスの秘密を含むことができる。例えば１つのヒープが政党の秘密に対するものであり、他のヒープが医療上の秘密に対するものである。または他の例として、暗号化された電子メールを異なるクラスに分類し、異なるヒープを使用して、それぞれのクラスを保護するさまざまな異なる秘密を保護することができる。任意の数の異なる型のクラスが存在することができ、本発明は、データを分類する特定の方法または特定の数のクラスに限定されない。一般に、それぞれのクラスは、そのクラスのデータを用いて実行できること、または実行できないことに関する自身のルールを有することができ、関数のライブラリは、ヒープに関してそれらのルールに従うように設計することができる。
【発明を実施するための最良の形態】
【０００９】
本発明の他の特徴を以下に説明する。
【００１０】
好ましい実施形態の上記の概要および以下の詳細な説明は、添付図面を参照して読んだときによりいっそう理解される。本発明を例示するために、図面には本発明の例示的な構造が示されているが、本発明は、開示される特定の方法および手段に限定されない。
【００１１】
（概要）
本発明は、異なるクラスのデータを異なるヒープに記憶する機構を提供する。異なるクラスのデータを処理する関数は、それぞれのクラスのデータを適切なそれぞれのヒープだけに書き込み（または特定のクラスに属すると思われるデータを特定のヒープだけから読み取り）、特定のヒープのデータを使用するときにそのヒープを支配しているルールを守るように構成することができる。例えば、秘密データと非秘密データを別々に記憶するために２つのヒープを生成することができる。秘密データを全て秘密ヒープに記憶し、秘密ヒープのデータを安全でない位置に書き込むことを拒絶するように関数を構成することができる。別の例として、１つのヒープを、ある種の非破損標準に従ったデータ（例えば、「信頼できる」データ）を記憶するように指定することができ、このようなデータを使用し、データに依存する関数を、入力データが破損することを防ぐために、データをそのヒープだけから受け取るように構成することができる。反対に、信頼できないデータ（例えば、信頼できない供給元からのデータ、あるいは適用可能な信用標準を満たさないなんらかの方法で生成されまたは獲得されたデータ）を信頼できるヒープに書き込むことを拒絶することにより、そのヒープ上のデータの完全性を保護するように、関数を構成することができる。言い換えると、異なるメモリ領域（異なるヒープなど）の分離に関するルールを使用して、秘密データが出力されないようにし、不良データが入力されないようにすることができる。一般に、異なるヒープを使用して、そのデータについての特定のルールに従うデータを記憶することができ、それらのルールが守られる方法でヒープを使用する（すなわち読み取りまたは書き込む）だけでそれらのルールが守られるように関数を構成することができる。
【００１２】
（例示的なコンピューティング配置）
図１に、本発明の諸態様を実装することができる例示的なコンピューティング環境を示す。コンピューティングシステム環境１００は、適当なコンピューティング環境の一例にすぎず、本発明の使用または機能の範囲を限定することを意図したものではない。また、コンピューティング環境１００が、例示的なオペレーティング環境１００内に示された１つの構成要素または構成要素の組合せに関する依存性または要件を有すると解釈してはならない。
【００１３】
本発明は、他の多数の汎用または特殊用途コンピューティングシステム環境または構成とともに使用可能である。本発明とともに使用するのに適した周知のコンピューティングシステム、環境および／または構成の例には、パーソナルコンピュータ、サーバコンピュータ、ハンドヘルドまたはラップトップ装置、マルチプロセッサシステム、マイクロプロセッサベースのシステム、セットトップボックス、プログラム可能なコンシューマ電子機器、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、組込み型システム、上記のいずれかのシステムまたは装置を含む分散コンピューティング環境などが含まれる。ただしこれらに限定されるわけではない。
【００１４】
本発明は、コンピュータによって実行されるプログラムモジュールなどのコンピュータ実行可能命令の一般的な文脈で記述することができる。一般的に、プログラムモジュールは、特定のタスクを実行し、または特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などを含む。本発明はさらに、通信ネットワークまたは他のデータ伝送媒体によってリンクされた複数の遠隔処理装置によってタスクが実行される分散コンピューティング環境で実施することができる。分散コンピューティング環境では、プログラムモジュールおよび他のデータが、メモリ記憶装置を含むローカルコンピュータ記憶媒体とリモートコンピュータ記憶媒体の両方に位置することができる。
【００１５】
図１を参照して、本発明を実装するための例示的なシステムは、コンピュータ１１０の形態の汎用コンピューティング装置を含む。コンピュータ１１０の構成要素には例えば、処理ユニット１２０、システムメモリ１３０、およびシステムメモリを含むさまざまなシステム構成要素を処理ユニット１２０に結合するシステムバス１２１を含む。ただしこれらに限定されるわけではない。処理ユニット１２０は例えば、マルチスレッドプロセッサ上に支持された論理処理ユニットなどの複数の論理処理ユニットを表す。システムバス１２１は、メモリバスまたはメモリコントローラ、周辺バスおよびローカルバスを含む、さまざまなバスアーキテクチャのうちの任意のアーキテクチャを使用したいくつかの種類のバス構造のうちの任意のバス構造とすることができる。例えば、このようなアーキテクチャには、ＩＳＡ（Industry Standard Architecture）バス、ＭＣＡ（Micro channel Architecture）バス、ＥＩＳＡ（Enhanced ISA）バス、ＶＥＳＡ（Video Electronics standards Association）ローカルバス、およびＰＣＩ（Peripheral Component Interconnect）バス（別名メザニン（Mezzanine）バス）が含まれる。ただしこれらに限定されるわけではない。システムバス１２１は、通信装置のうち、ポイントツーポイント接続、スイッチングファブリック（switching fabric）などとして実装することもできる。
【００１６】
コンピュータ１１０は一般にさまざまなコンピュータ読取り可能媒体を含む。コンピュータ読取り可能媒体は、コンピュータ１１０がアクセスできる使用可能な任意の媒体とすることができ、これには揮発性および不揮発性媒体、リムーバブルおよび非リムーバブル媒体が含まれる。例えば、コンピュータ読取り可能媒体はコンピュータ記憶媒体および通信媒体を含むことができる。ただしこれらに限定されるわけではない。コンピュータ記憶媒体には、コンピュータ読取り可能命令、データ構造、プログラムモジュール、その他のデータなどの情報を記憶するための任意の方法または技術において実現された揮発性および不揮発性のリムーバブルおよび非リムーバブル媒体が含まれる。コンピュータ記憶媒体には、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリまたは他のメモリ技術、ＣＤＲＯＭ、ＤＶＤ（digital versatile disk）または他の光ディスク記憶装置、磁気カセット、磁気テープ、磁気ディスク記憶装置または他の磁気記憶装置、あるいは所望の情報の記憶に使用することができコンピュータ１１０がアクセスできる他の任意の媒体が含まれる。ただしこれらに限定されるわけではない。通信媒体は一般に、搬送波などの被変調データ信号または他のトランスポート機構中にコンピュータ可読命令、データ構造、プログラムモジュールまたは他のデータを具体化し、通信媒体には任意の情報送達媒体が含まれる。用語「被変調データ信号」は、信号に情報を符号化する方法でセットされ変更された１または複数の特徴を有する信号を意味する。例えば通信媒体には、有線ネットワーク、直接有線接続などの有線媒体、音響、ＲＦ、赤外線などの無線媒体が含まれる。ただしこれらに限定されるわけではない。上記の媒体の組合せもコンピュータ読取り可能媒体の範囲に含まれる。
【００１７】
システムメモリ１３０は、リードオンリーメモリ（ＲＯＭ）１３１、ランダムアクセスメモリ（ＲＡＭ）１３２などの揮発性および／または不揮発性メモリの形態のコンピュータ記憶媒体を含む。起動時などにコンピュータ１１０内の要素間の情報の転送を助ける基本ルーチンを含む基本入出力システム１３３（ＢＩＯＳ）は、典型的には、ＲＯＭ１３１に記憶される。ＲＡＭ１３２は、典型的には、すぐにアクセス可能であり、かつ／または処理ユニット１２０によって現在操作されているデータおよび／またはプログラムモジュールを含む。例えば、図１には、オペレーティングシステム１３４、アプリケーションプログラム１３５、他のプログラムモジュール１３６およびプログラムデータ１３７が示されている。ただしこれらに限定されるわけではない。
【００１８】
コンピュータ１１０はさらに、揮発性／不揮発性の他のリムーバブル／非リムーバブルコンピュータ記憶媒体を含むことができる。例えば、図１には、不揮発性非リムーバブル磁気媒体から読み取りまたはこれへ書き込むハードディスクドライブ１４０、不揮発性リムーバブル磁気ディスク１５２から読み取りまたはこれへ書き込む磁気ディスクドライブ１５１、およびＣＤＲＯＭ、他の光媒体などの不揮発性リムーバブル光ディスク１５６から読み取りまたはこれへ書き込む光ディスクドライブ１５５が示されている。例示的なオペレーティング環境で使用することができる他の揮発性／不揮発性リムーバブル／非リムーバブルコンピュータ記憶媒体には、磁気カセットテープ、フラッシュメモリカード、ＤＶＤ、ディジタルビデオテープ、固体ＲＡＭ、固体ＲＯＭなどが含まれる。ただしこれらに限定されるわけではない。ハードディスクドライブ１４１は一般に、インタフェース１４０などの非リムーバブルメモリインタフェースを介してシステムバス１２１に接続されており、磁気ディスクドライブ１５１および光ディスクドライブ１５５は一般に、インタフェース１５０などのリムーバブルメモリインタフェースによってシステムバス１２１に接続されている。
【００１９】
これまでに論じ、図１に示したドライブおよびそれらの関連コンピュータ記憶媒体は、コンピュータ１１０のためのコンピュータ読取り可命令、データ構造、プログラムモジュールおよび他のデータの記憶を提供する。例えば図１では、ハードディスクドライブ１４１が、オペレーティングシステム１４４、アプリケーションプログラム１４５、他のプログラムモジュール１４６およびプログラムデータ１４７を記憶するドライブとして示されている。これらのコンポーネントは、オペレーティングシステム１３４、アプリケーションプログラム１３５、他のプログラムモジュール１３６およびプログラムデータ１３７と同じものであり、または異なるものであることに留意されたい。少なくともこれらが異なるコピーであることを示すために、オペレーティングシステム１４４、アプリケーションプログラム１４５、他のプログラムモジュール１４６およびプログラムデータ１４７には異なる符号が付されている。ユーザは、キーボード１６２、一般にマウス、トラックボールまたはタッチパッドと呼ばれるポインティングデバイス１６１などの入力装置を介して、コマンドおよび情報をコンピュータ２０に入力することができる。他の入力装置（図示せず）には例えばマイクロホン、ジョイスティック、ゲームパッド、衛星アンテナ、スキャナなどが含まれる。これらの入力装置および他の入力装置はしばしば、システムバスに結合されたユーザ入力インタフェース１６０を介して処理ユニット１２０に接続されるが、パラレルポート、ゲームポート、ユニバーサルシリアルバス（ＵＳＢ）などの他のインタフェースおよびバス構造によって接続することもできる。さらに、モニタ１９１または他のタイプのディスプレイ装置がビデオインタフェース１９０などのインタフェースを介してシステムバス１２１に接続される。モニタの他に、コンピュータはさらに、スピーカ１９７、プリンタ１９６など、出力周辺インタフェース１９５によって接続された他の周辺出力装置を含むことができる。
【００２０】
コンピュータ１１０は、リモートコンピュータ１８０などの１台または数台のリモートコンピュータへの論理接続を使用したネットワーク環境で動作することができる。リモートコンピュータ１８０は、例えば、パーソナルコンピュータ、サーバ、ルータ、ネットワークＰＣ、ピア装置または他の一般的なネットワークノードであり、これには一般に、コンピュータ１１０に関して先に記載した全てまたは多くの要素が含まれるが、図１にはメモリ記憶装置１８１だけが示されている。図１に示した論理接続は、ローカルエリアネットワーク（ＬＡＮ）１７１およびワイドエリアネットワーク（ＷＡＮ）１７３を含むが、他のネットワークを含むこともできる。このようなネットワーキング環境は、オフィス規模、会社規模のコンピュータネットワーク、イントラネットおよびインターネットではごく普通の環境である。
【００２１】
ＬＡＮネットワーキング環境で使用されるとき、コンピュータ１１０は、ネットワークインタフェースまたはアダプタ１７０を介してＬＡＮ１７１に接続される。ＷＡＮネットワーキング環境で使用されるとき、コンピュータ１１０は一般に、インターネットなどのＷＡＮ１７３上で通信を確立するためのモデム１７２または他の手段を含む。内部または外部モデムであるモデム１７２は、ユーザ入力インタフェース１６０または他の適当な機構を介してシステムバス１２１に接続することができる。ネットワーク環境では、コンピュータ１１０に関して示されたプログラムモジュールまたはその部分を、リモートメモリ記憶装置に記憶することができる。例えば、図１には、記憶装置１８１上にあるリモートアプリケーションプログラム１８５が示されている。図示したネットワーク接続は例示的なものであり、コンピュータ間の通信リンクを確立する他の手段を使用することもできることを理解されたい。
【００２２】
（ヒープ）
プログラムの実行中に、データを記憶するためにメモリを割り当てることが必要になることがある。当技術分野で知られているとおり、「ヒープ」は、このようなメモリ割当て要求を満たすために分配されるように指定された１または複数のメモリブロックである。一般に、プログラムはライブラリルーチンを使用してある量のメモリを要求する。ライブラリルーチンは、ヒープのメモリを割り当て、割り当てられたメモリのアドレスを返す。図２に、プログラムが、ヒープからのメモリの割当てを獲得する方法を示す。
【００２３】
プログラム２０４は、コンピュータ環境で実行されるプログラムである。その実行中にプログラム２０４は、ある型のデータを記憶するためのメモリを要求することができる。オペレーティング環境全体に対するメモリがオペレーティングシステムによって分配され、プログラム２０４はシステムコールを使用して、オペレーティングシステムから直接にメモリ割当てを要求することができる。しかし、プログラム２０４が、メモリ管理ＡＰＩ２０８などの標準関数ライブラリを使用してメモリを要求することのほうがより一般的である。
【００２４】
メモリを要求するときプログラム２０４は、必要な量のメモリを要求するための要求２０６をメモリ管理ＡＰＩ２０８に発行する。要求２０６は一般に、メモリ管理ＡＰＩ２０８によってエクスポーズ（expose）される関数への呼出しの形態をとる（例えば、malloc(size)）。メモリ管理ＡＰＩ２０８は、指定されたサイズの割り当てられていない連続したメモリブロックをヒープ２０２の中に置き、このメモリブロックの基底アドレスをプログラム２０４に返す。
【００２５】
ヒープ２０２は、メモリ管理ＡＰＩ２０８によって管理される１または複数の一般に大きなメモリブロックである。メモリ管理ＡＰＩ２０８は、オペレーティングシステムから１または複数の割当てを要求することによって、ヒープ２０２のためのメモリを獲得する。先に述べたとおり、プログラムは、オペレーティングシステムから直接にそれぞれのメモリ割当てを要求することができるが、一般的には、必要に応じてプログラム２０４に分配する大きなメモリブロック（すなわちヒープ２０２）を獲得するメモリ管理ＡＰＩ２０８を使用したほうが効率的である。（費用のかかる）システムコールの回数を減らすことができるからである。さらに、メモリ管理ＡＰＩ２０８は、断片化を防止する意図がある技法を使用し、ガーベージコレクション（garbage collection）を実行することによって、ヒープ２０２の中のメモリを効率的に管理することができる。さらに、メモリ管理ＡＰＩ２０８を介してプログラム２０４に割り当てられたメモリが全てヒープ２０２にあるので、このようなメモリは全て、明確に定義された１または複数のアドレス範囲に含まれることが分かっている。後に論じるように、メモリが特定のアドレス範囲に含まれるかどうかに基づいて、そのメモリが特定のヒープにあることを識別できることを利用して、異なる方法でまたは異なるルールに従って処理する必要がある異なる型のデータを有利に区別する。しかし、データがどのヒープに位置するかに基づいてそのデータの分離を実施する能力は、このような実施がメモリ管理ＡＰＩだけによって実行される場合に限定されないことに留意されたい。好ましい実施形態では、メモリ管理ＡＰＩ、他のＡＰＩまたはオペレーティングシステム（例えばオペレーティングシステムのメモリ割当て関数）の部分であるかどうかに関わらず、メモリを管理する全ての関数が、異なるクラスのデータを異なるヒープに分離するように構成される。
【００２６】
（複数のヒープを使用した異なるタイプのデータの管理）
図３に、異なるタイプのデータを管理するために２つの異なるヒープ２０２（１）および２０２（２）が維持されるシナリオを示す。この例では、「秘密」データを管理するためにヒープ２０２（１）が使用され、その他のデータを管理するためにヒープ２０２（２）が使用される。「秘密」データは一般に配布されてはならないデータ、または非常に特殊な条件下でしか配布されてはならないデータである。暗号鍵は秘密データの例である。
【００２７】
一例では、２つの異なるＡＰＩによって、ヒープ２０２（１）および２０２（２）が割り当てられる。一方のＡＰＩは秘密データに対するオペレーションを実行し、もう一方のＡＰＩは秘密データに対するオペレーションを実行しない。（あるいは、両方のヒープを使用し、秘密データに対するいくつかのオペレーションを実行し、非秘密データに対するいくつかのオペレーションを実行する単一のＡＰＩを使用することもできる）。図３の例では、秘密管理ＡＰＩ３０２および「他の」ＡＰＩ３０４がある。例えば、秘密管理ＡＰＩ３０２は、暗号鍵を生成し、またはこのような暗号鍵を暗号化、暗号解読、ディジタル署名などに使用する関数をエクスポーズすることができる。「他の」ＡＰＩ３０４は、秘密データの管理に関係しない他の関数、例えば入力／出力、ソーティング、数学計算または他のタイプの関数を実行することができる。秘密管理ＡＰＩ３０２は秘密データを記憶するためにヒープ２０２（１）を維持する。「他の」ＡＰＩ３０４は非秘密データを記憶するためにヒープ２０２（２）を維持する。例えば、秘密管理ＡＰＩ３０２が暗号鍵を生成し、鍵を記憶するための空間を必要としているとき、秘密管理ＡＰＩ３０２は、鍵を記憶するためのメモリをヒープ２０２（１）から獲得する。「他の」ＡＰＩ３０４がメモリ（例えばＩ／Ｏバッファ）を必要としているとき、「他の」ＡＰＩ３０４はヒープ２０２（２）からメモリを獲得する。図３の例では、ＡＰＩ３０２と３０４が別個のＡＰＩとして示されているが、先に述べたとおり、秘密管理を、秘密管理関数と他の関数の両方を実行する単一のＡＰＩとすることもできる。このようなＡＰＩは２つのヒープ２０２（１）および２０２（２）を維持することができ、特定の関数が記憶しているデータのタイプに応じて異なるヒープ使用することができる。
【００２８】
プログラム２０４は、ＡＰＩ３０２かまたはＡＰＩ３０４がプログラム２０４にエクスポーズする関数を呼び出すことによって、ＡＰＩ３０２またはＡＰＩ３０４を呼び出すことができる。呼び出された関数によってメモリ割当てが達成される場合、この呼び出された関数は、適当なヒープからメモリを割り当てるように構成される。
【００２９】
先に述べたとおり、ヒープのメモリは、そのヒープを構成することが知られているアドレス範囲に含まれるため、ヒープを使用してメモリを割り当てるときには、そのヒープのメモリを識別することができる。同様に、２つのヒープを使用するときには、それぞれのヒープを構成するアドレス範囲がすでに知られており、そのため、所与のアドレスがどのヒープのものであるか（またはメモリがヒープに割り当てられていない場合にはどのヒープのものでもないこと）を識別することができる。特定のメモリ位置が２つのヒープのうちのどちらのヒープに由来するのかを識別できることによって、２つの異なるクラスのデータが実質的に定義され、この区別を有利に使用して、異なるクラスのデータに異なるルールを適用することができる。例えば、ＡＰＩ３０２と３０４をともに、通常はＩ／Ｏ装置上に秘密データを送出してはならないことを理解する構成することができる。（例えば、秘密暗号鍵をネットワークポートに送ることは異常なふるまいを表す。）従って、ＡＰＩを構成する関数を、秘密ヒープ上のデータが異常な方法で使用されていることを、単純にデータが位置する場所をチェックすることによって認識するように構成することができ、これらの関数を、（例えば、警報を発し、警告メッセージを表示し、または要求されたタスクの実行を拒絶することによって）適切にふるまうように構成することができる。例えば、アドレスを引数としてとり、そのアドレスの内容をＩ／Ｏ装置に書き込む関数を、そのアドレスを秘密ヒープの既知のアドレス範囲と比較するように構成することができる。このアドレスが秘密ヒープの一部である場合、この関数は、この書込みの実行を拒絶することができる。
【００３０】
ＡＰＩ３０２および３０４の関数を、秘密ヒープ２０２（１）の中のデータの誤用を防ぐように構成することができるが、それでも、プログラマが１つのヒープから他のヒープへデータを転送することが可能であることに留意されたい。例えば、ａが秘密ヒープ２０２（１）上のアドレス、ｂが非秘密ヒープ２０２（２）上のアドレスである場合、プログラマは、常に、  
＊ｂ＝＊ａ
（この例ではＣプログラミング言語で書かれている）などの命令を実行することができる。この命令は、秘密データを非秘密ヒープにコピーする効果を有する。しかし、たとえこのような命令を発行できるとしても、秘密ヒープ上のデータの誤用に加担しないようにＡＰＩを構成することは、秘密ヒープからデータを転送する自分の意図を明示することを、プログラマに強制する。プログラマが明示的にデータを転送するこの要件は、秘密データを非秘密データとして処理するプログラマの意図を公然と認めるようプログラマに強制することによって、プログラマエラーを減らす有益な効果を有する。
【００３１】
図３は、秘密データの記憶に使用するヒープと非秘密データの記憶に使用するヒープの２つのヒープの場合を示しているが、より一般的には、システムを、任意の数のヒープを維持するように構成することができることに留意されたい。これらのヒープに記憶された異なるクラスのデータには異なるルールセットが適用される。どのヒープにデータを記憶するかを認識し、そのデータクラスに適用されるルールに従うようにＡＰＩを構成することができる。
【００３２】
（ヒープルールを執行するための例示的なＡＰＩ）
図４に、異なるヒープに適用される異なるルールを執行するのに使用することができる、ＡＰＩ３０２および３０４によってエクスポーズされる関数の例を示す。図４の例では、ＡＰＩ３０２が、秘密ヒープ２０２（１）に対して働く関数をエクスポーズし、ＡＰＩ３０４が、他のデータ（すなわち、非秘密ヒープ２０２（２）に記憶されたデータ、または秘密ヒープ２０２（１）の一部分でない他の位置に記憶されたデータ）に対して働く関数をエクスポーズする。
【００３３】
例えば、ＡＰＩ３０２は、暗号鍵に関係した関数、例えばcreatekey()、applysecret()およびdecrypt()をエクスポーズする。createkey()関数は、例えば、「ＳＥＣＲＥＴ」データ型のデータを記憶するのに十分な大きさの、秘密ヒープ２０２（１）のメモリの一部分を割り当て、鍵を生成し、割り当てられたメモリに鍵を記憶し、記憶された秘密データを指すポインタを返す。sign()関数は、例えば、秘密データを指すポインタおよびハッシュを指すポインタを引数としてとり、ハッシュおよび秘密データに基づいてディジタル署名を計算し、既知の位置へ署名を書き込む。decrypt()関数は、例えば、秘密データを指すポインタ、暗号文を含む文字列を指すポインタ、および解読された暗号文（「クリアテキスト（cleartext）」）を書き込む位置を指すポインタを引数としてとり、次に、秘密データを使用して暗号文を解読して、クリアテキストのために提供された位置にそれを書き込む。一実施形態では、decrypt()関数が、暗号文が位置していた位置を気にせず、秘密データに対して指定されたヒープにクリアテキストが位置することを要求する（これによってクリアテキストが区別なしに使用されることを防ぐ）。これらの関数の全ては秘密データを適切に利用する。すなわち、これらの関数は、秘密データを生成しまたは使用するが、Ｉ／Ｏ装置上に秘密データを送信しない。（「適切」とは「そのヒープに適用されるルールに従う」ことを意味する。先に述べたとおり、本発明は、特殊なヒープが秘密データを記憶する場合だけに限定されず、また、そのヒープに適用されるルールが、Ｉ／Ｏ装置上に秘密データを送信することを回避することである場合だけに限定されない）。
【００３４】
対照的に、ＡＰＩ３０４は、一般的なデータに対して働く関数、例えば、データをフォーマットしそれを標準出力ストリームに書き込むprintf()、または指定されたＩＰ（Internet Protocol）アドレスに任意のデータを送信するtransmit()をエクスポーズする。これらの関数がメモリアドレスを引数として受け取るときには、秘密ヒープ２０２（１）の一部をなす範囲にそのメモリアドレスが含まれるか否かを判定するようにこれらの関数を構成することができる。そのアドレスがその範囲に含まれる場合に、先に述べたように適切にふるまう（例えば警告を発し、要求されたタスクの実行を拒絶するなど）ように、これらの関数を構成することができる。
【００３５】
先に述べたように、秘密データに対するオペレーションを実行する関数と秘密データに対するオペレーションを実行しない関数とを別個のＡＰＩに分類する必要はない。多くの場合に、１つのＡＰＩが、秘密データに対するいくつかのオペレーションを実行し、非秘密データに対するいくつかのオペレーションを実行する複数の関数を含む。このような関数は、秘密ヒープと非秘密ヒープの両方を、それらが働いているデータのタイプに応じて使用することができる。
【００３６】
（特殊ヒープを使用するための例示的プロセス）
図５に、特殊ヒープを使用するときに実施される例示的なプロセスを示す。図５は、秘密データ用のヒープとその他のデータ用のヒープの２つのヒープがある例を示している。ただし、先に述べたように本発明は、２つのヒープがある場合、または秘密データを記憶するために１つのヒープが指定される場合に限定されない。
【００３７】
最初に、プログラムは、秘密データを管理する関数、例えば上述のcreatekey()関数を呼び出す（５０２）。このプログラムは、データ用の位置を秘密ヒープ上で割り当て、割り当てられた位置にデータを記憶する（５０４）。その後のある時点において、プログラムは、秘密データにとって適切でない方法でアドレスの内容を使用する関数にアドレスを渡す（５０６）。例えば、プログラムはprintf()関数にアドレスを渡す。次に、呼び出された関数は、そのアドレスをチェックして、そのアドレスが秘密ヒープの一部分であるかどうかを判定する。そのアドレスが秘密ヒープの一部分でない場合、その関数は要求されたアクションを普通に実行する。そのアドレスが秘密ヒープの一部分である場合、関数は、例えば、実行されようとしているアクションについてユーザに警告を発する、その関数の実行を拒絶するなど、適切なアクションをとる（５０８）。
【００３８】
（例示的なシナリオおよび使用）
マイクロソフト社のＮＧＳＣＢ（Next Generation Secure Computing Base）などの安全なコンピューティングシステムでは、プログラム中のどの情報が秘密に関わるものであるか、およびどの情報が信頼できない供給元から来たものであり、（搾取の試みなどの）予想外の内容を有するかもしれないので非常に慎重に処理しなければならないかについて、明確に考えることが有益である。１）大きすぎるパケットが実行スタックを傷つけ、不適当なコードを実行させる従来のバッファオーバラン、および２）ある秘密データが保護された空間から外部へコピーされるプログラマエラー、を防ぐことが望ましい少なくとも２種類の問題がある。これらの問題は、アプリケーションに対して異なるいくつかのヒープを提供して割り当て、正しいヒープから来た割当てにある型のデータを転送だけを可能にすることによって防ぐことができる。
【００３９】
通常、プロセスの空間から外部へデータを移動するシステムサービス（ファイルまたはネットワークへの書込み、プロセス間通信の実行など）は、呼出し元のアドレス空間内のどのデータアドレスがこの方法でエクスポーズするのに「合理的」または「安全」であるかを言うことができない。先に論じたとおり、本発明は、プログラムが、特に重要な秘密データを、システムが識別することができる領域に分離する方法を提供する。従って、本発明は、システム（およびシステムサービス）が、プログラムが秘密を漏えいしないことを「助ける」ことを可能にし、さらにプログラマエラーによって秘密がばらまかれる可能性を低減させる。言い換えると、本発明は、偶然に秘密を漏えいするコードを書くことをより困難にする。
【００４０】
好ましい一実施形態では、メモリ割当て関数が、呼出し元に、それらの割当てがどのヒープに由来しなければならないのかを明示的に指定するよう要求する。システムは、それぞれのヒープの仮想アドレス範囲を知っているので、それぞれのシステムサービスは、データに対する不適切なアクションの実行を拒絶することができる。一実施形態では、ＮＧＳＣＢトラステッドエージェント（trusted agent）が起動されるときに、それぞれのヒープの仮想アドレス範囲を予約することができる。必要ならば、起動時に、実行可能イメージを伴う情報に基づいて、ヒープのサイズを調整することができる。例えば、Windows（登録商標）ファイルシステム上の暗号化されていないファイルへ書き込むなどによって、保護された空間からデータを転送する関数は、暗号解読鍵を含むバッファからのコピーを拒絶することができる。同様に、保護された空間にデータを転送する関数は、信頼できない供給元から来るデータ、または保護された空間に適用される標準をデータが満たすことを保証できない状況の下で生成されたデータを、保護された空間に書き込むことを拒絶し、それによって保護された空間内のデータの完全性を保護することができる。データを暗号化する関数は、提供された鍵が、信頼できるデータを記憶するように指定されたヒープにない場合、実行を拒絶することができる。安全な記憶領域またはキーペアジェネレータからキーイング材料を取り出す関数は、それらが書き込む値が、秘密を記憶するように指定されたヒープに行くことを主張することができる。信頼性を特に保証しないデータを処理する関数は、信頼できるデータのために予約されたヒープにそのデータを書き込むことを拒絶することができる。これらの例に共通する論旨は、異なる関数が、ある種のパラメータの中にある情報の型について仮定することができることである。例えば、鍵をバッファに取り出し、そのバッファをソケット上に送信することにより情報を漏えいすること、または信頼できないデータを保護されたヒープに書き込むことにより保護されたヒープを破損することは、プログラムではできないことである。先に論じたとおり、プログラムは、これを意図的に実行することができるが、上記の機構が、エラーまたは事故によるこのような動作が実行されるのを妨げる。
【００４１】
以上の例は、単に説明目的で提供したものであり、これらを本発明を限定するものと解釈してはならないことに留意されたい。さまざまな実施形態に関して本発明を説明したが、本明細書で使用した語は、説明および例示のための語であって、限定のための語ではないことを理解されたい。さらに、特定の手段、材料および実施形態に関して本発明を記述したが、本発明は、本明細書に開示された詳細に限定されるものではなく、本発明は、添付の請求項の範囲に含まれるものなどの機能的に等価の全ての構造、方法および使用に拡張される。本明細書の教示の恩恵に浴した当業者は、本明細書の教示に対する数多くの変更を実施することができ、その態様において本発明の範囲および趣旨から逸脱することなく変更を実施することができる。
【図面の簡単な説明】
【００４２】
【図１】本発明の諸態様を実装することができる例示的なコンピューティング環境のブロック図である。
【図２】実行中のプログラムのためのメモリを割り当てることができるヒープのブロック図である。
【図３】実行中のプログラムに対して複数のヒープを使用できる環境のブロック図である。
【図４】異なるヒープへのアクセスを提供する、本発明の諸態様に基づくアプリケーションプログラミングインタフェース（ＡＰＩ）のブロック図である。
【図５】本発明の諸態様に基づく特殊ヒープを使用する方法の流れ図である。
【符号の説明】
【００４３】
２０２  ヒープ
２０４  プログラム
２０８  メモリ管理ＡＰＩ
３０２  秘密管理ＡＰＩ
３０４  他のＡＰＩ
【図１】
2005327255.tif 000003
【図２】
2005327255.tif 000004
【図３】
2005327255.tif 000005
【図４】
2005327255.tif 000006
【図５】
2005327255.tif 000007