メモリの保護メモリ領域に保存されたデータの整合性を検証するためのメモリセキュリティ回路を有する装置の一例を概略的に示す図である。
比較のために、ハッシュツリーを使用して、保護メモリ領域に保存されたデータの整合性を確認する例を示す図である。
比較のために、ツリーの各ノードがデータの整合性を確認するためのモノリシックカウンタを指定するカウンタ整合性ツリーの例を示す図である。
カウンタが、カウンタ間で共有されるメジャーカウント値と、各カウンタについて個別に指定されるそれぞれのマイナーカウント値との組み合わせとして指定される分割カウンタノードを含む、カウンタ整合性ツリーの例を示す図である。
カウンタ整合性ツリーのノードのアリティがルートノードに向かってツリーを上るにつれて減少する例を示す図である。
カウンタ整合性ツリーの1つのノードが複数のメジャーカウント値を指定し、各メジャーカウント値が、そのノードによって指定されたマイナーカウント値の異なるサブセットに対応する例を示す図である。
所与のデータブロックの保存済み認証コードがそのデータブロックとは別に保存されている例を示す図である。
メモリへの読み取りアクセスを制御する方法を示すフロー図である。
メモリへの書き込みアクセスを実行する方法を示すフロー図である。
まばらにポピュレートされたミラーカウンタ整合性ツリーの対応するノード内にマイナーカウンタのサブセットのための空間を割り当てることにより、分割カウンタノードのマイナーカウンタのサイズを増やす例を示す図である。
まばらにポピュレートされたミラーカウンタ整合性ツリーの対応するノード内にマイナーカウンタのサブセットのための空間を割り当てることにより、分割カウンタノードのマイナーカウンタのサイズを増やす例を示す図である。
複数のミラーカウンタ整合性ツリーが使用される例を示す図である。
メインカウンタおよびミラーカウンタの整合性ツリーの対応するノードに、ベースアドレスに対する同じアドレスオフセットを使用することを示す図である。
可変アリティと可変マイナーカウンタサイズを持つツリーの例を示す図である。
カウンタ整合性ツリーの様々な実装のパフォーマンスを比較したグラフである。
使用できるシミュレータの例を示す図である。
装置は、メモリに保存されたデータへのアクセスを制御するためのメモリアクセス回路と、メモリの保護メモリ領域に保存されたデータの整合性を検証するためのメモリセキュリティ回路とを有し得る。例えば、整合性検証は、攻撃者によって保護メモリ領域に保存されたデータを改ざんする攻撃者を検出するためのものであってもよい。例えば、メモリは、メモリアクセス回路を含む集積回路とは別の集積回路上のオフチップメモリであり得る。
整合性検証は、保存されたデータとメモリセキュリティ回路によって維持される整合性メタデータとの比較に依存する場合がある。例えば、保護メモリ領域にデータを書き込む場合、メモリセキュリティ回路は、保護メモリ領域に保存されたデータのプロパティに基づいて整合性メタデータを生成することができ、保護メモリ領域からデータを読み取る場合、メモリセキュリティ回路は、データが書き込まれて以後に変更されたかどうかを確認するために整合性メタデータを使用することができる。しかし、このような整合性メタデータには、保護メモリ領域のアドレス範囲全体を保護するための全てのメタデータを提供するためにかなりの量のストレージ空間が必要になる場合がある。攻撃者に対して脆弱ではない記憶装置ではデータを保持する容量は限られていることが多いため、実際には、保護メモリ領域自体に整合性メタデータの少なくとも一部を保存する必要があり得る。これにより、メタデータが攻撃に対して脆弱になるため、通常、同様に保護領域に保存されていてもよいさらなるメタデータを使用して、(対象となる実際のデータと同様の方法で)整合性メタデータ自体に読み取り時の整合性検証を行う必要があり得る。したがって、これは保護メモリ領域の「実際の」データの読み取りごとに対象となる実際のデータに加えて整合性メタデータの複数の読み取り、および整合性メタデータが有効かどうかを確認するための対応する比較をトリガすることがあり、保護メモリ領域のサイズの増加に伴い、システム全体のパフォーマンスに対する整合性検証のパフォーマンスの影響を制限することはますます困難になり得る。
以下で論じる技術では、メモリセキュリティ回路は、いくつかのノードを含むカウンタ整合性ツリーを維持することができる。各ノードは、保護メモリ領域のそれぞれのデータブロックに関連付けられている複数のカウンタを指定する。カウンタ整合性ツリーのノードは少なくとも1つの親ノードを含み、その親ノードによって指定されたカウンタの少なくとも1つは、さらなるデータブロック用のカウンタを提供するカウンタ整合性ツリーの子ノードを保存するデータブロックに関連付けられている。また、ノードは少なくとも1つのリーフノードを含み、少なくとも1つのカウンタは、カウンタ整合性ツリー以外のデータを保存するデータブロックに関連付けられている。
ツリー内の各カウンタは、対応するデータブロックの信頼性を確認するための認証コードを生成するために使用される。したがって、保護メモリ領域のターゲットデータブロックへのアクセスに応答して、メモリセキュリティ回路は、ターゲットデータブロックに関連付けられた保存済み認証コードを、ターゲットデータブロックとターゲットデータブロックに関連付けられているカウンタ整合性ツリーのターゲットカウンタとに基づいて生成される計算された認証コードと比較することにより、ターゲットデータブロックの整合性を検証することができる。なお、ターゲットデータブロックは、対象の「実際の」データを保存するデータブロックであり得るか、カウンタ整合性ツリー自体のノードの1つを保存するデータブロックであり得、これは何らかの他の「実際の」データブロックの整合性を確認するための検証プロセスの一部としてアクセスされ得る。
整合性ツリーの使用はリプレイ攻撃に対する防御に役立ち、リプレイ攻撃は、攻撃者が現在のデータ値とその有効な認証コードを一度に捕獲する攻撃形式であり(例えば、メモリ自体を読み取るか、メモリとデータソースとの間のインターフェースを監視することによる)、その後そのデータ値が最新ではなくなった後、古いデータブロックとそれに関連付けられた有効な認証コードを、メモリに保存されている正しい値に置き換えようとし、それが装置内の不正な挙動につながる可能性がある。あるノードからのデータが別のノードに基づいて計算された認証コードで保護される整合性ツリーを提供することにより、あるノードに関するデータおよび認証コードの古いペアと、親ノードから計算された認証コードとカウンタとの間の不一致から、古くなったデータのリプレイを検知することができる。整合性ツリーを実装する1つの方法は、カウンタ整合性ツリーとしての実装であり、これは、親ノードが各子ノードの認証コードの生成に使用されるカウンタを提供するように、ツリーがカウンタで構成されている種類の整合性ツリーである。ただし、カウンタの頻繁なオーバーフローを回避するために、カウンタには所定のビット数を設ける必要があり得る。これにより、ツリーノードごとに提供できるカウンタの数が制限されるため、カウンタ整合性ツリーを実装できる効率が制限される可能性がある。
以下で論じる技術では、カウンタ整合性ツリーのノードの少なくとも1つが分割カウンタノードであり、分割カウンタノードは、少なくとも2つのカウンタ間で共有されるメジャーカウント値と、少なくとも2つのカウンタの各々に対して個別に指定されるそれぞれのマイナーカウント値との組み合わせとして各々定義される、少なくとも2つのカウンタを指定する。したがって、メジャーカウント値は、分割カウンタノードによってカバーされるデータブロックの少なくとも2つに対応する2つ以上のカウンタの各々に共有される共通部分を指定し、それぞれのマイナーカウント値は、カウンタごとに異なる部分を各々指定する。
このような分割カウンタノードをカウンタ整合性ツリーで使用すると、より効率的なメモリパフォーマンスが可能になる。カウンタごとに個別に指定されたマイナーカウント値は、必要な全てのビット数を各カウンタについて完全に個別に提供する必要がある場合に比べて小さいため(一部のビットは、カウンタグループに1回提供される共有メジャーカウンタでカバーされるため)、これは、所与のサイズのデータブロック内に収まるマイナーカウント値の数が大きくなり、そのため、カウンタ整合性ツリーの単一ノード内でカウンタを指定できるデータブロックの数を効果的に増やすことができることを意味する。言い換えると、カウンタ整合性ツリーノードのアリティは大きくなる可能性がある(アリティとは、親ノードごとに提供される子ノードの数を指す)。保護メモリ領域の所与のサイズを想定すると、分割カウンタノードのアリティを増やすことができる場合、データブロックの整合性およびカウンタ自体の整合性を確認するための全てのカウンタを取得するためにトラバースする必要があるカウンタ整合性ツリーのレベル数は減少する可能性がある。これは、カウンタ整合性ツリーのトラバース中に生成されるメモリトラフィックが少なくなることを意味するため、保護メモリ領域の「実際の」データへのアクセスごとに必要とされる読み取り動作が少なくなることにより、パフォーマンスが向上する。
また、一部の実装では、メモリからのデータのサブセットを保存するためのキャッシュを有することができ、データアクセス待ち時間は、データをメモリ自体から読み取らなければならない場合に比べて、キャッシュ内のアクセスでは短くなる。分割カウンタノードでは、所与のサイズのデータブロックにより多くのカウンタを表すことができるため、これはより多くのカウンタを所定量のキャッシュ空間にキャッシュできることを意味し、所与のデータアクセスの整合性を確認するために必要なカウンタがキャッシュ内に存在する可能性が高まり、したがって、データが既にキャッシュされている場合には、メモリ内の保護メモリ領域へのより多くのアクセスを省略することができる。
実際には、所与の認証コードに通常必要とされるよりも少ないビットでマイナーカウンタを指定できるため、分割(メジャー−マイナー)カウンタの手法は、ツリーの各親ノードが子ノードの数のカウンタを指定するのではなく子ノードの数の認証コードを指定する代替の「ハッシュツリー」実装に比べて、効率的である傾向もある。認証コードの生成に使用される秘密鍵が不明である場合に(総当たりなどによって)所与のデータブロックに関連付けられた認証コード(ハッシュ)を推測または推測することが暗号的に実行不可能である、十分なレベルのセキュリティを提供するのに通常必要な各ハッシュのビット数を考えると、実際のツリーのアリティは、ハッシュツリーで実用的であるよりも、ツリーの分割カウンタノードでより大きくなる可能性がある。
したがって、整合性メタデータをカウンタ整合性ツリーとして実装し、ツリーの少なくともいくつかのノードを上記のように分割カウンタノードとして実装すると、カウンタ整合性ツリーは、ツリーの生成中および/またはデータの整合性検証のためのツリーの使用中により効率的にトラバースすることができ、システムのパフォーマンスが向上する。
メインカウンタ整合性ツリーの所与の分割カウンタノードに関連付けられたサイズ増加トリガイベントに応答して、メモリセキュリティ回路は、所与の分割カウンタノードのマイナーカウンタのサイズを増やし、少なくとも1つのミラーカウンタ整合性ツリーの対応する分割カウンタノード内の所与の分割カウンタノードのマイナーカウンタのサブセットを割り当てることができる。これにより、より大きなマイナーカウンタを保存するために必要な任意の追加の空間をミラーカウンタ整合性ツリーの対応するノード内に収容できるため、そのノードのアリティ(そのノード下の子ノードの数)を減らすことなく、メインツリーの特定のノードのマイナーカウンタのサイズを増やすことができる。マイナーカウンタのサイズは、サイズ増加トリガイベントが検出されたメインカウンタ整合性ツリーの選択されたノードで増やすことができるが、メインカウンタ整合性ツリーの全てのノードで増やす必要はない。したがって、ミラーカウンタ整合性ツリーは、ミラーカウンタ整合性ツリーの全てのノードに有効なデータを持たない、まばらにポピュレートされたツリーであり得る。この手法は、メモリトラフィックがメモリアドレス空間全体に均等に分布しない(一部のブロックが他のブロックよりも頻繁にアクセスされる)ため、有用であり得る。したがって、この手法により、各ノードはできるだけ小さなマイナーカウンタサイズを使用して開始できるようになり、所与のデータブロックの整合性を検証するときにトラバースする必要があるツリーのレベル数を減らすが、頻繁にアクセスされるメモリ領域に相当するノードについては、ミラーツリーを使用してカウンタサイズを増やして追加のカウンタを収容し、オーバーフローの可能性を減らし、パフォーマンス集中型の再暗号化または必要なマイナーカウンタのオーバーフローでトリガされる認証コードの再計算動作の可能性を減らすことができることにより、パフォーマンスを向上させる。したがって、可変マイナーカウンタサイズの手法は、ツリーの所与のノードに対して所定の固定されたマイナーカウンタサイズを持つツリーよりも全体的に優れたパフォーマンスを提供できる。
装置は第2のメモリを有してもよく、メモリセキュリティ回路は、メインカウンタ整合性ツリーのルートノードを指定するか、またはメインカウンタ整合性ツリーのルートノードの整合性を検証するための情報を指定するルート検証データを第2のメモリに保存してもよい(第2のケースでは、ルートノード自体が保護メモリ領域に保存されることがある)。第2のメモリは信頼の境界内にある可能性があるため、攻撃に対して脆弱ではない。例えば、第2のメモリはオンチップメモリであり得、保護メモリ領域はオフチップメモリにあり得る。ルートノードは、ツリーの他の全てのノードの祖先ノードであるノードである。したがって、ルート検証データにより、保護メモリ領域内にあるカウンタ整合性ツリーの任意の部分を、攻撃に対して脆弱ではない信頼できるデータに基づいて認証することが可能になる。場合によっては、第2のメモリに保存されているルートノード自体が、上述したように分割カウンタノードであり得る。あるいは、モノリシック(非分割)カウンタを使用してルートノードを実装できる。また、ルートノードの整合性を検証するために第2のメモリに保存される情報は、ルートノード自体ではなくてもよく、保護メモリ領域内に保存されたルートノードから導出された認証値と比較するための保存済み認証値を含んでもよく、および/またはルートノードから導出される認証値を計算するために使用される保存済みカウンタを含んでもよい。ミラーカウンタ整合性ツリーが割り当てられ、ミラーカウンタ整合性ツリーのルートノードがポピュレートされた場合、第2のメモリは、ミラーカウンタ整合性ツリーのルートノードの整合性を検証するためのルート検証データを保存することもでき、またはミラーカウンタ整合性ツリー自体のルートノードを保存することもできる。
したがって、ターゲットデータブロックにアクセスすると、メモリセキュリティ回路は1つ以上の検証確認を実行して、ターゲットカウンタおよびルートノード(およびメインカウンタ整合性ツリーの全体的なサイズによっては介在ノード上の1つ以上の介在カウンタ)を含むメインカウンタ整合性ツリーのブランチ上のカウンタの整合性を検証し、それらの検証確認の少なくとも1回は、第2のメモリに保存されているルート検証データに依存する。
保護メモリ領域のターゲットデータブロックが更新されると、メモリセキュリティ回路はターゲットカウンタを更新し、ターゲットデータブロックに書き込まれた更新データと更新されたターゲットカウンタの両方に基づいてターゲットデータブロックに関連付けられている保存済み認証コードを再計算してもよい。したがって、ターゲットデータブロックが更新されるたびに認証コードの計算に使用されるターゲットカウンタを更新することにより、認証コードの計算が新鮮になり、認証コードの生成に使用される秘密鍵の推定が難しくなる。
カウンタの更新は、カウンタ値の繰り返しを回避し、かつカウンタの可能な全ての値が既に使用されているときに検出できる一連の更新を提供する任意の方法で行うことができる(データの暗号化または認証方法に対する何らかの他の変更をせずに同じカウンタ値を再利用することは、リプレイ攻撃が成功するリスクを生じる可能性がある)。比較的単純な手法は、ターゲットデータブロックの対応するデータが更新されるたびにターゲットカウンタを増分することにより、カウンタを更新することであり得る。あるいは、他の実装では、対応するデータの更新ごとにカウンタを非単調に更新することができる(例えば定数を使用してXOR演算を適用することにより、単調に増加する参照カウンタを変換して非単調に増加するカウント値のシーケンスを得、攻撃者がカウンタの変動パターンを判断しにくくするために、更新のたびにカウント値をターゲットカウンタに書き込む)。
カウンタがオーバーフロー(以前に使用されたカウンタ値に戻る)した場合には、オーバーフローによって、データの暗号化に使用される暗号鍵の変更、または認証コードの生成に使用される秘密鍵もしくは他のパラメータの変更など何らかの他のアクションがトリガされ、暗号化/認証プロセスの何らかの他のパラメータが変更されているため、古いカウンタ値を再利用するのがより安全になる場合がある。
ターゲットデータブロックに関連付けられたターゲットカウンタは保護メモリ領域内のさらなるデータブロックに保存される可能性があるため、カウンタの更新には、保護メモリ領域内の別のデータブロックへの追加の書き込みアクセスが必要になる場合があり、したがって、更新されるデータブロックに関連付けられたさらなるカウンタが必要になり、それ自体がさらなる書き込みアクセスなどをトリガする場合がある。したがって、元の書き込みアクセスは、一連の連続したカウンタ更新と認証コードの再計算をトリガする可能性があり、ルートに到達するまでツリーをトラバースする。
カウンタ整合性ツリーの全てのノードが分割カウンタの手法を使用することは必須ではない。例えば、保護メモリ領域内で保護されるデータブロックの総数は、カウンタ整合性ツリーに実装されているアリティ(親ノードごとの子ノードの数)の正確な累乗ではない場合があり、その場合には、少数のモノリシックカウンタを保存すれば必要なアリティを提供するのに十分である可能性があるため、アリティが低く、分割カウンタの手法を使用しないノードも存在し得る。したがって、全てのノードで分割カウンタを使用する必要があるわけではない。
分割カウンタノードとして実装されているノードについては、対応するターゲットデータブロック内の対応するデータへの書き込みのために分割形式で実装されたターゲットカウンタを更新する必要がある場合、メモリセキュリティ回路はターゲットカウンタに対応するマイナーカウント値を更新する。また、メモリセキュリティ回路は、ターゲットデータブロックの更新されたデータ、対象のターゲットカウンタに対応する対応するメジャーカウント値、および対象のターゲットカウンタに対応する更新されたマイナーカウント値に基づいて、ターゲットデータブロックに関連付けられている保存済み認証コードを再計算してもよい。マイナーカウント値の更新がオーバーフローをトリガしない場合、同じメジャーカウント値をターゲットデータブロックと共有する他のデータブロックに関連付けられた他の認証コードを更新する必要はない。
ただし、マイナーカウント値の更新によりオーバーフロー(以前に使用されたマイナーカウント値の再利用)が発生する場合、メモリセキュリティ回路は、ターゲットカウンタ対象の対応するメジャーカウント値を更新してもよい。カウンタのメジャーカウント値を共有するターゲットデータブロック以外のデータブロックがいくつかあるため、メジャーカウント値を更新すると、以前に保存された認証コードは、メジャーカウント値、それらのデータブロックのデータ、およびマイナーカウンタから計算された認証コードともはや一致しなくなることを意味する。したがって、メモリセキュリティ回路は、ターゲットデータブロック自体の保存済み認証コードの再計算に加えて、対応するメジャーカウント値を共有するカウンタに関連付けられている他のデータブロックの各々に関連付けられた保存済み認証コードも再計算できる。したがって、時には、それぞれのマイナーカウンタ間でメジャーカウント値を共有することは、ターゲットデータブロック自体以外のブロックの認証コードの追加計算が必要になることを意味する場合がある。しかし、このパフォーマンスペナルティはほとんど発生せず、一方で分割カウンタの手法を用いてツリーノードのアリティを増加させることによるパフォーマンスの向上は、カウンタツリーの各トラバースの高速化に役立ち、平均すると分割カウンタの手法の方がパフォーマンスが優れている。
また、少なくとも1つのミラーカウンタ整合性ツリーの所与のノードのマイナーカウント値のオーバーフローに応答して(または、閾値の超過など予め決められた条件を満たした所与のノードのマイナーカウンタのオーバーフロー率に応じて)、メモリセキュリティ回路は、そのノードのマイナーカウンタのサイズを増やし、マイナーカウンタのサブセットを少なくとも1つのミラーカウンタ整合性ツリーの対応するノードに割り当てることもできる。すなわち、マイナーカウンタがオーバーフローする(または頻繁にオーバーフローする)場合、これは、マイナーカウンタの現在のサイズが小さすぎるという指標になり得、したがって、マイナーカウンタのサイズを増やして同じブロック内の他のマイナーカウンタが頻繁にオーバーフローする可能性を減らすために有用であり得る。マイナーカウンタのオーバーフローに応答してマイナーカウンタのサイズを常に大きくすることは必須ではなく、場合によっては所与のノードのマイナーカウンタサイズの増加をトリガするためにいくつかの条件を満たす必要があり得、条件の1つはそのノードのマイナーカウンタのオーバーフローであり得る。マイナーカウンタのオーバーフローの比率は、例えば時間(一定期間内のオーバーフロー数)、またはメモリアクセス数(所定のメモリアクセス数に対して検出されたオーバーフロー数)、またはメモリへの書き込み動作数に対する比率など、様々な方法で監視することができる。マイナーカウンタサイズは、データの再暗号化または認証コードの再計算の比率が設定された閾値を超えた場合にも増加する可能性がある(再び、データの再暗号化または認証コードの再計算の比率を時間、メモリアクセス数、またはメモリへの書き込み動作の数に対して定義できる)。
分割カウンタノードは、親ノードとリーフノードの両方を含むカウンタ整合性ツリーの任意のノードに設けることができる。ただし、少なくとも1つの親ノードが分割カウンタノードであると特に有用であり得る。これにより、所与のサイズの保護メモリ領域をカバーするために必要なツリーのレベルが少なくなるように、ツリーのより高速なファンアウトが可能になる。いくつかの実装では、メモリセキュリティ回路は、カウンタ整合性ツリーの異なるレベルに少なくとも2つの分割カウンタノードを含むカウンタ整合性ツリーを維持することができる。
いくつかの実装では、カウンタ整合性ツリーの各ノードは同じアリティを有することができ、すなわち、各ノードは同数のデータブロックまたは子ノードのカウンタを指定できる。ただし、ツリーの少なくとも2つのノードで、異なる数の子ノードのカウンタを指定することもできる。
特に、ツリーの上位にある(すなわち、ルートノードに近い)ノードが、ルートから離れていてツリーのリーフに近いノードよりも低いアリティを有するように、メインカウンタ整合性ツリーの少なくとも一部を実装すると有用であり得る。したがって、ツリーのアリティはレベルごとに可変であり得、ツリーをトラバースしてルートノードに近づくにつれて減少し得る。
例えば、メインカウンタ整合性ツリーは、第1の数のデータブロックのカウンタを指定する第1の分割カウンタノードと、第1の数よりも大きい第2の数のデータブロックのカウンタを指定する第2の分割カウンタノードで構成することができ、ここで、第1の分割カウンタノードは第2の分割カウンタノードの親ノードである。子に対する親ノードのアリティを減らすことにより、子ノードに比べて親ノードのカウンタが少なくなるため、ビット数の大きいカウンタを含む空間が増える。したがって、第1の分割カウンタノードによって指定されたマイナーカウント値は、第2の分割カウンタノードによって指定されたマイナーカウント値よりも大きいビット数を有し得る。ツリーの上位レベルの各ノードはツリー下位のノードよりも広範囲のアドレスをカバーするために、ツリーのルートに向かうにつれてツリーの各レベルへの書き込みトラフィックの量は指数関数的に増加する傾向があるため、これは非常に有用である。アリティを小さくし、マイナーカウント値を大きくすることで、ルートノードに向かってツリーを上昇するにつれて、これらの上位レベルでカウンタオーバーフローが発生する可能性が低くなり、上位レベルのノードで認証コードを再計算する必要性の頻度が下がる。したがって、下位レベルで高いアリティを提供し、上位レベルで低いアリティを提供することにより、個々の読み取り動作の待ち時間およびカウンタオーバーフローが発生する場合の待ち時間の両方を考慮するとパフォーマンスのより良いバランスを提供することができる。
同様に、祖父母ノード、親ノードおよび子ノードをそれぞれ含むツリーに3つ以上のレベルがある場合、祖父母ノードが親ノードよりも少ないカウンタを指定できる(より少ない数の子ノードをカバーする)ように、祖父母ノードは親ノードに比べてさらに低いアリティを有することができ、祖父母ノードのマイナーカウント値は親ノードのマイナーカウント値よりも多いビット数を有することができる。したがって、親ノードに対応する第1の分割カウンタノードと上記子ノードに対応する第2の分割カウンタノードでは、3番目の分割カウンタノードを含むさらなる祖父母ノードが第3のデータブロック数のカウンタを指定することができ、これは、第1の(親)分割カウンタノードに使用される第1の数よりも小さくなる。
いくつかの実装では、ツリーの各ノードのアリティは、正確な2の累乗になり得る。したがって、メインカウンタ整合性ツリーの各ノードは、例えば8、16、32または64など、正確な2の累乗であるデータブロックの数のカウンタを指定できる。
しかし、一実装では、メインカウンタ整合性ツリーの少なくとも1つのノードが、例えば36または48などの正確な2の累乗以外のデータブロックの数のカウンタを指定する場合がある。すなわち、少なくとも1つの分割カウンタノードのアリティは、正確な2の累乗以外の値になる場合がある。メモリ空間は通常、アドレス計算算術を単純化するために2の累乗単位のアドレスに対応するブロックで構成されているため、2の累乗ではない数のデータブロックに対応するツリーノードを使用することは、熟練者にとっては非常に直感的であり得る。しかし、2つの隣接する2の累乗の間にあるアリティを提供することで、パフォーマンスのバランスが向上することがよくあることが認識されており、これは、2番目に大きい2の累乗に対応するアリティを有するツリーノードを実装すると、各カウンタのサイズが小さくなりすぎ、実行時間の大半を占めるかなりの数のオーバーフローが発生する可能性があるが、2番目に小さい2の累乗を使用すると、カウンタにビットが過剰に供給される可能性があり、オーバーフローの可能性は無視できるほど低いがカウンタのビットはほとんど使用されないためである。したがって、しばしばカウンタ整合性ツリーの所与のノードがカバーするデータブロックの数に2の累乗ではない数を使用すると、オーバーフローの可能性に対して読み取り/書き込みアクセスでトラバースするツリーレベルの合計数のバランスがとれ、動作期間全体で平均してパフォーマンスが向上する場合がある。ツリーノードに2の累乗ではないアリティを使用すると、カウンタ整合性ツリーの所与のノードを保存するアドレスを決定するためのアドレス計算算術が複雑になる可能性があるが、この追加のオーバーヘッドは、オーバーフローの可能性に対してツリーをトラバースするために必要なメモリアクセス数のバランスがとれるというパフォーマンスの追加のメリットによって解消され得る。
いくつかの例では、メモリセキュリティ回路は、保護メモリ領域のターゲットデータブロックと同じキャッシュラインからターゲットデータブロックの保存済み認証コードを読み取ることができる。キャッシュラインはメモリアドレス空間の単位であり、メモリによる単一のデータアクセスとして返すことができる。保存済み認証コードを同じキャッシュライン内のターゲットデータ自体と一緒に保存することにより、保存済み認証コードを読み取ってターゲットデータブロックの計算された認証コードと比較するために2回目のメモリアクセスを実行する必要がなくなる。
しかしながら、他の実装では、保存済み認証コードはターゲットデータブロックとは別のキャッシュラインに保存され得る。例えば、いくつかのメモリチップは、一次記憶領域内のデータに関連付けられたエラー検出/訂正コードを保存するための二次記憶領域を提供することができる。そのようなメモリチップは、一次データとそれに関連するエラー検出/訂正コードの両方を、それらが別々のキャッシュラインに保存されている場合でも、メモリアクセスに応答して効率的に返すように設計できる。したがって、いくつかの実装では、保存済み認証コードは、エラー検出/訂正コードで使用するために設計されたメモリチップの二次保存領域に保存され得る。
保存済み認証コードと、アクセスされているターゲットデータブロックの計算された認証コードとの不一致が検出されると、メモリセキュリティ回路がセキュリティ違反応答をトリガすることがある。セキュリティ違反応答は、メモリへのアクセスの成功を防げるため、または攻撃の可能性に対する対策をとるためのいくつかの動作のいずれかであり得る。例えば、セキュリティ違反応答には、次のいずれかが含まれ得る。ターゲットデータブロック内のデータアクセスの復号化を許可する暗号鍵へのアクセスを拒否する;ターゲットデータブロックへのアクセス要求を拒否する;ターゲットデータブロックをダミーデータ、ランダムデータ、またはターゲットデータブロックの以前の内容とは無関係の他のデータで上書きしてそのデータへのアクセスを防ぐ;例外を発生させオペレーティングシステムなどのソフトウェアプロセスをトリガして攻撃に対する対策を講じる;保護メモリ領域内の全てのデータ(ターゲットデータブロックだけではない)をそれが侵害された場合に上書きまたは消去する、および/または装置またはメモリを無効化して装置またはメモリのさらなる正常使用を防げる(例えば、攻撃の対象となった後メモリまたは装置の溶融接続による焼損などの物理的対策を講じてデバイスの正常使用を防げる)。セキュリティ違反が識別されたときに実行されるアクションの正確な詳細は、実装ごとに異なり得る。
メモリセキュリティ回路は、保護メモリ領域のデータブロックに書き込まれたデータを暗号化し、保護メモリ領域のデータブロックから読み取られたデータを復号化する暗号化/復号化回路を有してもよい。したがって、データは、保護メモリ領域からデータを読み取ることができる攻撃者に平文で公開されない場合がある。カウンタ整合性ツリーは、保護メモリ領域にあるデータの改ざんを検出し、かつ攻撃をリプレイする手段を提供することにより、さらなる保護を提供する。保護メモリ領域に書き込まれるカウンタ整合性ツリーの任意のノードも、「実際の」データ自体と同様の方法で暗号化および復号化され得る。
一部の実装では、メモリセキュリティ回路による制御の対象となるメモリにマッピングされた全てのアドレス空間が保護メモリ領域と見なされるため、そのメモリへの全てのアクセスは、暗号化、復号化、およびカウンタ整合性ツリーを用いた整合性検証の対象となり得る。また、メモリアクセス回路は、同じ保護の対象ではない、別個のメモリユニットなど、少なくとも1つの他のメモリへのアクセスを制御してもよい。あるいは、同じメモリデバイス内で、メモリ内の異なるアドレス範囲を保護領域と非保護メモリ領域にそれぞれマッピングすることができる。非保護メモリ領域では、メモリアクセス回路は、メモリセキュリティ回路によって提供される保護のいずれかとは無関係に、その領域のデータへのアクセスを制御でき、例えば、暗号化/復号化を必要とせず、カウンタ整合性ツリーと認証コードに基づく整合性検証を必要としない。したがって、非保護メモリ領域へのアクセスは、カウンタ整合性ツリーとは無関係に制御できる。例えば、攻撃者から保護する必要のない非機密データが存在する場合がある。そのデータを非保護メモリ領域に書き込むことで、整合性ツリーデータと認証コードを読み書きしてデータの信頼性を検証するために追加のメモリアクセスを実行する必要がないため、パフォーマンスが向上する。
上記技術は、ハードウェアでメモリセキュリティ回路の機能を提供する特注の回路を備えた物理デバイスに実装できる。したがって、暗号化または復号化または整合性検証動作はハードウェアで提供されるメモリセキュリティ回路によって自動的に実行できるため、処理装置で実行するソフトウェアは、これらが実行されていることを認識する必要はない。したがって、ソフトウェアが保護メモリ領域にマッピングされたアドレスにデータを書き込むように命令すると、メモリセキュリティ回路はデータをメモリに書き込む前に暗号化し、メモリが攻撃者によって侵害されていないというカウンタ整合性ツリーに基づいて、対応するカウンタ整合性ツリーノードの生成および/または検証を制御できる。同様に、ソフトウェアによる保護メモリ領域の読み取りでは、メモリセキュリティハードウェアは、読み取りデータの復号化と、読み取りデータがまだ有効であることを検証するためのカウンタ整合性ツリーノードの確認を制御できる。
しかしながら、他の例では、暗号化/復号化、保存済み認証コードおよびカウンタ整合性ツリーの生成、ならびに保存済み認証コードおよびカウンタ整合性ツリーに基づく整合性検証動作は装置内の汎用処理回路で実行されるソフトウェアによって行われる場合があり、この装置は、このようなメモリセキュリティ動作を自動的に実行するためのハードウェアを備えていない。例えば、ソフトウェアは、オペレーティングシステムやハイパーバイザーなどのプラットフォームレベルのコードであり得、その制御下で実行される他のアプリケーションをサポートする場合がある。例えば、仮想マシンまたはシミュレータプログラムは、ハードウェアが実際にメモリセキュリティ回路を備えているかのようにアプリケーションコードを実行することができるが、保護メモリ領域にマッピングされたアドレスへのメモリアクセスを検出し、そのようなアクセスに対して、保護メモリ領域に実際にデータが書き込まれる前に、データのさらなる暗号化または復号化、あるいはカウンタ整合性ツリーを維持し保存済み認証コードとカウンタ整合性ツリーに基づいてデータの整合性を検証するための動作を実行することができる。したがって、いくつかの例では、この技術は、データ処理装置を制御して上記方法を提供するためのコンピュータプログラムを保存する記憶媒体を提供し得る。コンピュータプログラムは、ネットワーク経由でダウンロードするなど、非一時的な形式で記録することもできる。
図1は、プログラム命令を実行してデータ処理動作を実行するための少なくとも1つのプロセッサコア6を含む集積回路またはシステムオンチップ4を含むデータ処理システム2の例を概略的に示す。図1は1つのプロセッサコアのみを示しているが、場合によってはシステムオンチップ4は複数のプロセッサを備えている場合がある。各プロセッサコアまたはプロセッサコアクラスタにはキャッシュ8(または複数レベルのキャッシュ8、10)があり得る。メモリコントローラ12は、システムオンチップ4とは別個の集積回路上にあるオフチップメモリ14へのアクセスを制御するためのメモリアクセス回路として機能する。オンチップのデータへのアクセスは攻撃者によって改ざんが困難であり得るが、システムオンチップのエッジは信頼境界として機能し、その境界を超える任意のデータは、メモリコントローラ12とオフチップメモリ14との間で物理チャネル16上のデータを傍受することにより、またはデータがオフチップメモリ14に保存されている間にデータを読み取りまたは変更することにより、攻撃に対して脆弱になり得る。図1は、信頼境界がシステムオンチップのエッジに対応する例を示しているが、他の場合にはシステムオンチップ内に信頼境界があり得、信頼境界を超えたデータは潜在的な攻撃にさらされる可能性がある。
システムオンチップ4は、システムに物理的にアクセスし、かつマイクロプロセッサとオフチップシステムメモリ14との間で交換されているデータまたはコードを監視および/またはリプレイする能力を有する悪意のある敵からオフチップメモリ14の保護メモリ領域22に保存されたデータを保護するために提供されるメモリセキュリティユニット20を含み得る。保護メモリ領域22は、保護されるデータ24と、データ24の検証に使用される整合性ツリーメタデータ26とを含む。非保護メモリ領域28もオフチップメモリ14に設けられ、非保護領域に保存されたデータ30はメモリセキュリティユニット20によって保護されず、攻撃者によって自由にアクセスおよび改変される。いくつかの実装では、保護メモリ領域22および非保護メモリ領域28へのアドレスのマッピングはハードウェアによって固定されることがあるため、オペレーティングシステム、またはプロセッサコア6によって実行される他のソフトウェアは、保護メモリ領域22または非保護メモリ領域28にどのアドレスをマッピングするかを変更できない。あるいは、アドレスマッピングを制御するオペレーティングシステムが信頼できる場合、保護領域または非保護領域にマッピングされるアドレスを制御するアドレスマッピングは、ソフトウェアの制御下でプロセッサによって変更され得るため、保護領域と非保護領域はオフチップメモリ14の同じ物理的場所に常にマッピングする必要はない。実装によっては、オフチップメモリ14に非保護メモリ領域28がない場合があり、この場合には、オフチップメモリ全体を保護メモリ領域22と見なすことができる。
メモリセキュリティユニット20は、オフチップメモリ14に書き込まれるデータを暗号化し、かつオフチップメモリから読み戻されたデータを復号化するための暗号化/復号化回路32を含む。これにより、オフチップメモリ14から読み取られるデータまたはオフチップメモリ14に保存されるデータを悪意のある観察者が平文で見ることを防ぐことによってプライバシーを提供する。暗号化および復号化で使用される暗号鍵は、システムオンチップ上のオンチップメモリ(例えばSRAM)34内またはメモリセキュリティユニット20自体内に保存することができる。暗号化と復号化には任意の既知の技術を使用してもよく、暗号鍵を保護するために任意の既知の手法が使用できる。
メモリセキュリティユニット20は、以下で一般に検証回路36と呼ばれる整合性ツリー生成および検証回路36も含む。検証回路36は、保護メモリ領域に整合性ツリー26を維持する役割を担う。整合性ツリーは、保護領域22に現在保存されているデータが、その領域に書き込まれたときと同じであるかどうかを検証するためのいくつかの情報を提供することができる。データの整合性確認は、例えば、AES−GCMやSHA−256などの一方向暗号化関数を用いて保存されたデータから生成され得るメッセージ認証コード(MAC)を用いて実現でき、これは、認証コードの生成に使用された秘密鍵が不明な場合に、攻撃者が総当たりによって特定のデータ値に関連付けられた認証コードを推測することが計算的に実行不可能になる関数を使用する。認証コードは、保護メモリ領域22内のデータ24と一緒に、または別のデータ構造に保存できる。あるデータ値について保存されたMACを、保存されたMACの生成に使用した同じ一方向関数を使用して、保存されたデータから導出される計算されたMACに対して確認し、保存されたMACと計算されたMACの間に不一致が検出された場合、これはデータが改ざんされていることを示し得る。
ただし、全ての攻撃を防ぐには、MACを提供するだけでは不十分な場合がある。別のタイプの攻撃は、システムに物理的にアクセスする悪意のある人物が、バス上で以前に観測された暗号化データとMACの合法的な組み合わせを保存し、システムの動作を侵害するために古くなった値で所与のメモリ位置のデータを破壊する目的で後にバスでこれらをリプレイするリプレイ攻撃であり得る。そのようなリプレイ攻撃は整合性ツリー26を使用して防止することができ、整合性ツリー26は、ツリーの各リーフノードが整合性データを提供して保護メモリ領域22のデータブロック24の1つが有効であることを検証し、リーフノードの親ノードがさらなる整合性データを提供してリーフノード自体が有効であることを確認する、ノードのツリー構造を提供する。ツリーのさらなる親ノードを使用して、親ノード自体を確認してもよく、これはツリーをツリーのルートまでトラバースしながら続行され、その後最終的な検証のソースを提供することができる。オンチップメモリ34に保存されたルート検証データ38は、ツリー自体のルートノードをオンチップに保存することにより、または保護メモリ領域に保存されたルートノードの認証を可能にする他の情報を保存することにより、ツリーのルートが真正であることを検証するために使用され得る。
メモリセキュリティユニット20は、特定のデータブロックを確認するのに必要な整合性ツリー26のノードが保護メモリ領域22に位置するアドレスを計算するためのアドレス計算回路40を有してもよい。オプションで、メモリセキュリティユニット20はまた、オフチップメモリ14から再度読み取らなければならない場合よりも高速なアクセスのために、整合性ツリーの最近使用されたノードをキャッシュするキャッシュ42を有してもよい。代替として、メモリセキュリティユニット20は、プロセッサコア6によっても使用できるキャッシュ10の1つにアクセスすることができ、したがって、共有キャッシュ10内の整合性ツリー26からデータをキャッシュすることもメモリセキュリティユニット20の動作を高速化するのに役立ち得る。
整合性ツリーを実装できる方法はいくつかある。図2は、比較のために、整合性ツリー26を各データブロックのハッシュ(MAC)から構築されたハッシュツリーとして実装する第1の例を示す。図2に示すように、各データブロック50は、データブロック50の内容にMACハッシュ関数54を適用することにより計算された対応するMAC52を有する。MACハッシュ関数54は、攻撃者にとって秘密鍵を推測することがより困難になるように新鮮さ(MACがデータおよび秘密鍵から導出される方法の変化)を提供するために、データブロックの更新ごとに更新されるカウンタ56にも依存する。この手法では、各MAC生成に使用されるカウンタ56は、別個のデータ構造でハッシュツリー26とは別個に保存されてもよい。カウンタを保存するために使用されるデータブロックは、それ自体がMACを使用して保護されたデータブロック50の一部であってもよい。あるいは、対応するデータブロックのMAC認証の失敗が生じるためカウンタの改ざんが依然として検出できるため、カウンタは非保護メモリ領域28に保存され得る。
データブロックの所定のグループについて計算された全てのMAC52は、整合性ツリー26のリーフノード60内に集められ、リーフノードは、アドレス空間の所定の範囲をカバーするMACを指定する。次いで、ツリーのリーフノード60の整合性は、リーフノード60の内容に基づいてさらなるMAC62およびさらなるカウンタ64を計算して、整合性ツリー26の非リーフノード66内の他のリーフノード60からのMACと共にそれ自体が保存される別のMACを生成することによって保護できる。この非リーフノード66は、MACが非リーフノード66に保存されている各リードノード60の親ノードとして機能する。したがって、各親ノードは、各子ノードに保存された全てのMACがカバーする合計メモリと同じサイズのメモリブロックを保護するためにMACを保存する。例えば、図2の場合、ツリーは8進ハッシュツリーであるため、各親ノードは8つの子ノードを有し、その子の1つがカバーするメモリ領域のサイズの8倍のメモリ領域をカバーする。同様に、各非リーフノードについて、同じMAC計算関数を非リーフノードに適用するが、その非リーフノードに固有の別のカウンタを使用して、さらなるMACを計算する。単一のMACで保護された親ノードに子ノードのMACを合わせてグループ化し続けることにより、最終的に保護メモリ領域22全体をルートノード66−Rに縮小することができ、ルートノード66−Rは、保護メモリ領域22全体を共にカバーするいくつかの子ノードのMACを保存する。必要なツリーのレベル数は、保護メモリ領域のサイズに依存し得る。ルートノード66−Rの信頼性は、ルート検証データ38としてオンチップメモリ34にルートノード自体を保存するか、図2に示すようにルートノードのMACをさらに計算して、オンチップメモリ34にルート検証データ38としてそのMAC68を保存することで確認できる。
したがって、データ値にアクセスしなければならない場合、対応するデータブロック50には、そのMACを生成するために使用されたのと同じMAC関数54が適用され、結果はツリーの対応するリーフノード60に保存されているMACと比較され、次に、ルートノードに到達しルートノードも検証されるまで、親ノードから取得したMACに基づいて検証される連続する各子ノードでツリーがトラバースされる。ターゲットデータブロック50からルートノードに戻るブランチ上の各ノードの検証が全て成功した場合、データアクセスが許可される。各カウンタ56は、対応するデータブロックが更新される(書き込まれる)ときに増分され、その結果、データブロックとそのMACとの間のマッピングは時間と共に変化する。
図2に示す手法の問題は、特定のデータ値が与えられているが秘密鍵の知識がない場合に、攻撃者が対応するMACを推測したり総当たりで解読したりできることが計算的に実行不可能である十分なセキュリティを提供するために、各MACが、例えば64ビットなど、かなり大きな数のビットを必要とし得ることである。これにより、1つのキャッシュラインに収まるMACの数が制限される場合がある。例えば、キャッシュラインサイズが512ビットの場合、8つの64ビットMACが各キャッシュラインに収まるため、ツリーの各ノードは8つの子ノードを持つように制限される。8進ハッシュツリーを使用すると、保護メモリ領域のサイズが大きくなるにつれて、リーフノードからルートまでトラバースする必要があるツリーのレベル数が比較的大きくなり得る。単一のデータブロック50が改ざんされていないことを検証するためにアクセスする必要のある各キャッシュラインは、オフチップメモリ14とメモリコントローラ12との間に余分なメモリトラフィックを追加するため、パフォーマンスに影響を与える可能性がある。同様に、オフチップメモリ内でデータが更新された後、リーフノードでカウンタが増分されると、そのメモリブロックに対応する上位ノードで全てのMACを更新する必要があり得、これは、1つのノードに関連付けられたカウンタを増分するたびに、親ノードの対応するMACを再計算および更新する必要があり得、次に、そのノードに関連付けられたカウンタの増分がトリガされる可能性があり、したがって上位から2番目の親ノードに保存されているMACの再計算が必要になり、カウンタへのさらなる増分がトリガされ、ルートに到達するまで同様に続くためである。ツリーのアリティが低いほど、所与のサイズのメモリ領域を保護するためにトラバースする必要があるレベル数が大きくなるため、パフォーマンスへの影響が大きくなる。
図3は、ハッシュツリーの代わりにカウンタツリーを使用して整合性ツリー26を実装する代替法を示す。この場合、各ノードは、ツリーの次のノードでブロックを認証するために使用される全てのMACを提供するツリーの所与のノードではなく、代わりにツリーの現在のノードの各子ノードに個別のカウンタを定義する。整合性ツリー26自体の一部ではない保護メモリ領域22の各データブロック50は、MAC80によって保護され、MAC80は、データブロック50の内容と、カウンタ整合性ツリー26のリーフノード84から読み取られるカウンタ82とに基づいて計算される。リーフノード84は、異なるデータブロック50に各々対応するいくつかのカウンタを指定してもよい。この例では、所与のデータブロック50に対して計算されたMAC80は、対応するデータと同じキャッシュライン内に保存される。これは必須ではなく、他の例では、MACは対応するデータとは別に保存され得る。ツリーの各リーフノード84について、リーフノード84の内容と、リーフノード84の親ノードとして機能する非リーフノード88から読み取られたカウンタ86とに基づいて、同様のMAC80が計算される。各非リーフノード88は、複数の子ノード84に使用されるカウンタを提供する。同様に、ツリーの各レベルで、所与の子ノードのMAC80を計算するために使用されるカウンタ86は、その子ノードの親ノードに対応するデータブロック88からルートノード88‐Rまで読み取られる。メモリセキュリティユニット20のアドレス計算回路40は、対象となる所与のターゲットデータブロックについて、関連するカウンタを提供する整合性ツリー26の必要なノードを他のどのデータブロックが保存するかを識別する。最終的に、ルートノード88−Rに到達し、ルートノードのMAC80がルートノードの内容とルートカウンタ89の関数として計算される。ルートカウンタ89は、ルート検証データ38としてオンチップメモリ34に保存され得る。あるいは、ツリーのルートノード88−R全体をオンチップメモリのルート検証データに保存してもよく、この場合、このルートノードのMACをさらに計算する必要はない。
要約すると、図3に示すカウンタツリーでは、ツリーの各レベルで、ツリーの親ノードから読み取られたカウンタを使用して計算される同じキャッシュラインに保存されたMACを使用して、カウンタキャッシュラインの整合性が確保される。
各カウンタは、対応するデータブロックが書き込まれるたびに増分または更新される。例えば、非整合性ツリーデータを提供するデータブロック50が更新されると、ツリーのリーフノード84の1つで対応するカウンタが増分される。次に、これはリーフノード84に関連付けられたMAC80の再計算を必要とし、それがツリーの上位から2番目の親ノード88内のカウンタの増分をトリガし、同様にしてルートまでさかのぼる。
カウンタの1つがオーバーフローした場合、例えばカウンタの最も正の値から最も負の値またはゼロにラップアラウンドすると、以前のカウンタ値の1つが繰り返される可能性があるため、リプレイ攻撃が可能になるリスクがある。この場合、メモリセキュリティユニット20は暗号化回路32で使用される暗号鍵を更新することができるため、これはまた、平文で見られる特定のデータ値と、暗号化されたデータ値およびカウンタに基づいて生成されたMACとの間の異なるマッピングを強制する。しかしながら、そのように暗号鍵が変更されると、保護メモリ領域22の全てのデータを古い鍵を使用して復号化し、新しい鍵を使用して再暗号化してからメモリに書き戻す必要があるため、暗号鍵の更新は高価になる可能性がある。これは、大量の読み取りと書き込みを必要とする可能性があるため、パフォーマンスの点で高価な動作になり得る。保護メモリ領域22のそのような完全な再暗号化が必要とされる頻度を減らすために、そのようなオーバーフローを稀にするのに十分なビット数を有するカウンタを各データブロックに提供することが望ましい。例えば、図3に示す手法では、各512ビットキャッシュラインにはMACに使用される64ビットがあり、これにより、各々56ビットの8つのカウンタに分割できるカウンタに448ビットが残る。各カウンタのサイズを小さくすると、1つのキャッシュラインに収まるカウンタを増やすことができるが、これにより、パフォーマンスに影響を与える可能性のあるオーバーフローが頻繁に発生する。したがって、図3に示す手法は、ツリーのアリティ(図3の例では8のアリティ)を制限する傾向もあり、ツリーがファンアウトできる速度を制限し、ツリー全体で所定のサイズの保護メモリ領域22をカバーするためにトラバースする必要があるレベル数を増やす。
図4は、図2および図3に示される例と比較してパフォーマンスを改善するためにメモリセキュリティユニット20で使用され得る分割カウンタ整合性ツリー26を示す。カウンタツリーは、図3のようにリーフノード84と非リーフノード88の同様の配置を有し、各親(非リーフ)ノード88は、その子ノードの各々に対してMAC80を計算するためのカウンタを提供し、リーフノード84は、他の非整合性ツリー関連データブロック50のMACを計算するためのカウンタ82を提供する。ただし、図4では、ツリーの少なくともいくつかのノードが分割カウンタの手法を使用しており、ツリーのそのノードのカウンタは、メジャーカウント値95と多数のマイナーカウント値97を使用して分割形式で表されている。各マイナーカウント値97は、ツリーのそのノードがカバーするデータブロックの1つに対応する。所与のデータブロックの実際のカウンタは、メジャーカウント値95(そのノードがカバーする全てのブロック間で共有される)とそのデータブロックに指定された特定のマイナーカウント値97との組み合わせによって定義される。例えば、ブロック0のカウンタは、ブロック0用に選択された特定のマイナーカウント値と連結されたメジャーカウント値に対応でき、ブロック1のカウンタは、ブロック1用に選択された特定のマイナーカウント値と連結された共有メジャーカウント値に対応でき、以下同様である。したがって、MAC80が所与のデータブロックについて計算されるとき、MAC関数54は、親ノードからの共有メジャーカウンタ95および特定のデータブロックのために選択されたマイナーカウンタ97の1つと共にデータブロックの内容に適用される。各マイナーカウンタ97は、対応するデータブロックの更新ごとに増分される。共有メジャーカウンタ95は、対応するマイナーカウンタ97のセットのいずれかがオーバーフローすると増分される。
この分割カウンタの手法を使用することにより、各データブロックに提供されるカウンタの全体的なサイズは比較的大きくなるが、各データブロックに個別のカウンタが存在するため、攻撃者は所与のデータブロックに適用されるカウンタ値を推測しにくくなる。例えば、64ビットMACを使用する512ビットキャッシュラインには、64ビットメジャーカウンタと32の12ビットマイナーカウンタを備え、各データブロックに76ビットカウンタを効果的に提供することができる。したがって、メジャーカウンタと十分に大きい1つのマイナーカウンタの合計ビット数を提供することで、保護メモリ領域全体の再暗号化を必要とするカウンタオーバーフローの可能性を減らすことができる。
しかしながら、1つの親ノードがカバーできる子ノードの数はマイナーカウンタの数に依存し、図4に示す手法のマイナーカウンタは図3に示すモノリシックカウンタよりも小さいため、これは、キャッシュラインの任意の所与のサイズに対して親ノードごとに多数の子ノードを許可するように、ツリーのアリティを大幅に増やせることを意味する。図4の例では、ツリーの分割カウンタノードのアリティは32である。これは、ツリーのファンアウトがはるかに大きいため、所定量のメモリをカバーするために必要なレベルが少ないことを意味する。図4のリーフノード84が示すように、ツリーの全てのノードが分割カウンタの手法を使用することは必須ではなく、例えば、一部は図3に示すモノリシックの手法をなおも使用できるため、異なるアリティ(例えば図4の例では8)を有し得る。これは、保護メモリ領域全体のサイズが、分割カウンタノードで使用されるアリティの正確な累乗に対応するブロック数にマッピングされない場合に役立ち、この場合アリティの低いノードが必要になることがある。
図5に示すように、アリティは各分割カウンタノードで同じである必要はない。実際、ツリーがルートノードに向かって上にトラバースされるにつれてアリティを減らすことは有用である。これは、ツリーがルートノードに向かって上昇するにつれて書き込みトラフィックが指数関数的に増加するため、カウンタがオーバーフローする可能性が高くなるためである。ツリーの上位レベル(ルートに近い)を、下位レベル(リーフに近い)よりも低いアリティで実装することにより、全体的なパフォーマンスを向上させることができる。例えば、図5は、48個の8ビットマイナーカウンタを備える48進ノード100、36個の10ビットマイナーカウンタを備える36進の親ノード102、および32個の12ビットマイナーカウンタを有する32進の祖父母ノード104を示す。ツリーを上るマイナーカウンタのサイズを大きくすることで、カウンタオーバーフローのためにメモリの大きな領域でMACを再計算しなければならない回数を減らすことができる。もちろん、図5に示すメジャーカウンタ、マイナーカウンタ、およびMACの特定のサイズは単なる一例であり、これらのサイズは利用可能なキャッシュラインサイズと特定のシステムの要件に応じて変更できる。
図5に示すように、ツリーのノードのいくつかは、例えば図5に示す36進または48進ノードなど、正確な2の累乗ではないアリティを有する場合がある。これは例えばアドレスビットのサブセットに基づいてインデックスを作成する代わりにルックアップテーブルを使用するなど、より複雑なアドレス計算回路40が必要となる可能性があるが、2の累乗ではないアリティを使用することは、オーバーフローの可能性と各読み取り/書き込みでトラバースする必要があるツリーレベルの数とのバランスが向上するために有用であり得、これにより、より複雑なアドレス生成にもかかわらず、全体的なパフォーマンスが向上する。
図4および図5の例では、ツリーの各分割カウンタノードは、そのノードの全ての子ノードの全てのマイナーカウンタで共有される単一のメジャーカウンタ95を指定する。ただし、図6に示すようにこれは必須ではなく、場合によってはツリーの所与のノードは、マイナーカウンタ97の一部に各々対応する複数のメジャーカウンタ95を指定できる。ノードごとに追加のメジャーカウンタを指定すると、キャッシュラインの所与のサイズで提供できるマイナーカウンタ数を減らすことができるが、場合によってはメジャーカウンタが増分されるときにMACを再計算しなければならない同じメジャーカウンタを共有するデータブロック数が少なくなるため、マイナーカウンタがオーバーフローするときのオーバーヘッドを減らすためにこれが望ましい場合がある。
図4と図5の例では、データブロックに関連付けられたMAC80をデータ自体と同じキャッシュラインに保存しているが、図7に示すようにこれは必須ではなく、他の実装では、MACによって保護されているデータブロックまたは整合性ツリーノードを提供するキャッシュライン112から別のキャッシュラインにMAC80を保存できる。例えば、MAC80は、ECCを保存するための専用領域を有するメモリチップのエラー訂正コード(ECC)領域に保存できる。
図8は、オフチップメモリ14からデータを読み取ることを要求するための読み取りアクセスを処理する方法を示す流れ図である。読み取りアクセスは、例えば、プロセッサコア6によって実行されるロード命令、またはキャッシュコントローラによって開始されるキャッシュプリフェッチ要求などによってトリガされ得る。ステップ200で、メモリコントローラ12が読み取りアクセス要求を受信する。ステップ202で、メモリコントローラは、読み取りアクセス要求のアドレスによって指定されたターゲットデータブロックが保護メモリ領域22にマッピングされているかどうかを判定する。ターゲットアドレスが非保護メモリ領域28にマッピングされている場合、ステップ204で、読み取りアクセスは整合性ツリー26とは無関係に整合性検証なしで進められ、いずれの復号化も実行せずにデータを読み取る。オフチップメモリから読み取られたデータは、プロセッサコアおよび/またはキャッシュに返される。
ターゲットアドレスが保護メモリ領域22のデータブロックにマッピングされている場合、ステップ206で、検証回路36は、ツリーがツリー26のルートノードまでトラバースされるにつれて、ターゲットデータブロックおよびターゲットデータブロックと同じブランチにあるカウンタ整合性ツリーの1つ以上の祖先ノードから読み取られたデータに対して整合性検証を実行する。関連する整合性ツリーブランチ上の各データブロックについて、整合性ツリー検証回路36は、関連データブロックに保存されたデータの関数である計算されたMACと、ツリーの親ノードによって指定されたその対応するカウンタを計算する。親ノードが分割カウンタノードである場合、そのカウンタは、共有メジャーカウンタと、その親ノードがカバーするメモリブロック内の関連データブロックの位置に応じて親ノードから選択される選択マイナーカウンタとの組み合わせによって定義される。計算されたMACを確認されているデータブロックの保存済みMACと比較し、ステップ208で、ターゲットブロックとカウンタ整合性ツリーの1つ以上の祖先ノードの各々について保存済みMACと計算されたMACが一致するかどうかを判定する。ステップ206で試験したデータブロックのいずれかの保存済みMACと計算されたMACの間に不一致がある場合、ステップ210で、セキュリティ違反応答をトリガし、例えば、セキュリティ違反を処理するオペレーティングシステムにトラップする、オフチップメモリ14へのアクセスを不能にする、またはメモリへの継続的なアクセスを防ぐために電気接続を介した溶断などの物理的な対策を講じる。試験したブロックのいずれにも不一致が検出されない場合には、ステップ212でデータアクセスが許可されるため、元のターゲットデータブロックから読み取られたデータは暗号化/復号化回路32によって復号化され、復号化された形式で返されてプロセッサまたはキャッシュの1つで使用される。
したがって、ステップ206での検証は、整合性ツリーの各ステップを確認するために、保護メモリ領域内の異なるデータブロックの一連の検証を必要とする場合がある。このような検証に必要な読み取りは任意の順序でトリガでき、同様に、各読み取りデータブロックの予想されるMACを計算し、保存済みMACと比較するための対応する検証計算を任意の順序で行うことができる。一部の実施形態では、元のターゲットデータブロックの読み取りが別のデータブロックの読み取りをトリガして、そのターゲットデータブロックのターゲットカウンタを取得でき、この読み取り自体がさらに読み取りをトリガすることがあり、実際にはターゲットデータブロックから順番に読み取りが発生し、ルートノードまでツリーの各上位レベルに対してさらなる読み取りを連続してトリガするが、これは必須ではない。読み取りアクセス要求によって指定されたターゲットデータブロックを識別する読み取りターゲットアドレスが提示される他の例では、アドレス計算回路40は、ターゲットデータブロックの整合性検証に必要な整合性ツリーの各ノードのアドレスに読み取りターゲットアドレスをマッピングすることができるため、いくつかの並行読み取りを発行したり、ツリーノード祖先のシーケンスとは異なる順序でツリーの読み取りの一部をトリガしたりすることができる。したがって、読み取りアクセスでは、ツリー内の必要な検証の各々が実行される順序は重要ではない。
図9は、メモリコントローラ12およびメモリセキュリティユニット20によるオフチップメモリ14への書き込みアクセスを制御する方法を示すフロー図を示す。ステップ250で、メモリコントローラ12は、オフチップメモリ14にマッピングされたアドレスを指定する書き込みアクセスを検出する。書き込みアクセスは、例えば、プロセッサコア6によって実行される保存命令、またはキャッシュコントローラによってトリガされるキャッシュライトバックによってトリガされ得る。ステップ252で、メモリコントローラは、書き込みアクセス要求によって指定されたアドレスが保護メモリ領域22にあるターゲットデータブロックを識別するかどうかを判定する。識別しない場合、メモリセキュリティユニット20によって提供される保護はここでも必要ないため、ステップ254で、暗号化が適用されずいかなる整合性検証も実行されることなく、書き込みデータをターゲットデータブロックに書き込む。また、整合性ツリー26への修正は不要である。
ステップ252で、ターゲットデータブロックが保護領域22にあることが判明した場合、ステップ262で、整合性ツリー生成回路36は、書き込みアクセス要求による書き込みアクセスを受けるターゲットデータブロックに関連付けられたカウンタが、整合性ツリー26の分割カウンタノードによって定義されるかどうかを判定する。定義されない場合、ステップ264で、ターゲットブロックに関連付けられたモノリシックカウンタを増分する。増分は、カウンタの現在の値に1を追加することに対応できるか、または各カウンタが取得する既知のシーケンスで現在の値から次の値にカウント値を切り替えることに対応できる。ステップ266で、整合性ツリー生成回路36により、カウンタの増分がオーバーフローを引き起こしたかどうかを判定し、オーバーフローでカウンタは以前に使用された値に折り返す。オーバーフローが発生した場合、これは、保護メモリ領域22全体のグローバル暗号化またはMAC計算に影響するパラメータが最後に更新されてから、ターゲットブロックに提供できる全ての可能なカウント値が使用されたことを意味する。したがって、ステップ268で、保護メモリ領域22の全てのデータブロックに使用されるグローバル暗号鍵またはMAC生成オペランドを更新する。暗号鍵が更新されるため、これは、保護メモリ領域22の全てのデータを読み取り、暗号化/復号化ロジック32で復号化してから、新しい鍵で再暗号化し、保護メモリ領域22に書き戻す必要があることを意味する。鍵は同じままであるがカウンタ以外のMAC生成オペランドが更新された場合、この再暗号化は不要である。再暗号化が実行されるかどうかに関係なく、MACの生成に使用される関数が変更されるか、MACの計算に使用される暗号化データが変更されるため、カウンタ整合性ツリーとMACを保護メモリ領域全体について再計算しなければならない。したがって、ステップ268の動作はパフォーマンスの点で比較的高価であるが、ビット数が十分なカウンタではこれらのイベントは稀である。
ステップ266でオーバーフローが発生しなかった場合、保護領域全体のMACおよびカウンタを再計算する必要はない。代わりに、ステップ270で、ターゲットデータブロックに対応するMACを、書き込みデータアクセスで指定された書き込みデータの新しい暗号化バージョンと、ステップ264で得られた増分されたモノリシックカウンタとに基づいて再計算し、再計算されたMACは、保護領域22に、例えばデータ自体と同じキャッシュラインに保存される。ステップ264でカウンタが更新されたため、更新されたカウント値をツリーの上位レベルにあるリーフノードまたは親ノードに書き込む必要があるため、ステップ272で、その上位ノードのアドレスを指定するとともに書き込まれるカウンタの更新された値を指定するさらなる書き込みアクセスをトリガする。したがって、これは、そのさらなる書き込みアクセスのために図9の方法を実行するさらなるインスタンスをトリガする可能性がある。
一方、ステップ262で、元の書き込みアクセスで指定されたターゲットデータブロックのカウンタが、整合性ツリーの分割カウンタノードで定義されると判定された場合、方法はステップ274に進む。ステップ274で、整合性ツリー生成回路36は、ターゲットデータブロックに対応して選択されたマイナーカウンタを増分する。これは、元の書き込み要求によって書き込まれているターゲットブロック専用の特定のマイナーカウンタである。ステップ276で、この増分によりマイナーカウンタがオーバーフローしたかどうかを判定する。オーバーフローしなかった場合、ステップ278で、元の書き込み要求の暗号化された書き込みデータ、ターゲットブロックと同じメジャーカウンタを使用する他の全てのブロックとの間で共有される共有メジャーカウンタ、およびステップ274で選択された特定のマイナーカウンタの増分バージョンに基づいて、ターゲットデータブロックのMACを再計算し、結果のMACは、暗号化された書き込みデータに関連してメモリに保存される。
ステップ276でマイナーカウンタのオーバーフローが発生する場合、ステップ280で、ターゲットブロックの親ノードの共有メジャーカウンタを増分する。ステップ282で、メジャーカウンタがオーバーフローしたかどうかを判定する。オーバーフローしなかった場合、ステップ284で、ターゲットデータブロックとメジャーカウンタを共有する他の各ブロックについてMACを再計算し、再計算されたMACはそれらのブロックの各々についてメモリに保存される。他のブロックの各MACは、それらのブロックに保存されている現在のデータ(MACを再計算するためにメモリから読み取られる)、およびそれらの他の各ブロックの増分メジャーカウンタならびに特定のマイナーカウンタに基づいて計算される。すなわち、他の各ブロックは、マイナーカウンタの異なる1つであるが同じ増分メジャーカウンタを使用する。オーバーフローしたマイナーカウンタを有するノードが整合性ツリーのリーフノードである場合、MACが再計算された他の各ブロックに関連付けられたデータは、MACを再計算する前に新しいカウンタで再暗号化される。親ノードが非リーフノードである場合、他のブロックのデータを再暗号化する必要はない。ステップ284の後、ステップ278を上記と同じ方法で実行し、ターゲットブロックの新しい暗号化された書き込みデータ、増分された共有メジャーカウンタ、およびターゲットブロックに固有の増分されたマイナーカウンタに基づいてターゲットブロックのMACを再計算する。ステップ284が実行されたかどうかに関係なく、ステップ278に続いて、方法は再びステップ272に進み、さらなる書き込みアクセス要求をトリガして、ステップ274またはステップ280から生じる増分されたカウンタを更新する。一方、ステップ282でメジャーカウンタがオーバーフローした場合、状況はステップ266と同様であるため、再びステップ268でグローバル更新動作を実行して、暗号鍵またはMAC生成オペランドを更新し、その後、保護メモリ領域22の再暗号化を必要に応じて実行し、新しく更新されたパラメータについて整合性ツリー26を完全に再計算する。図9の方法は、ルートノードのMACが更新され、ルートノードカウンタ89が増分されると終了する。
図9では、理解を容易にするために、ステップ270/278/284および272のそれぞれで再計算されたMACと増分されたカウンタをメモリに書き込む個別の書き込みを示しているが、所与の親ノードのMACがその親ノードの子ノードに関連付けられたカウンタと同じキャッシュラインに保存される実施形態では、MACおよびカウンタの更新は、単一のキャッシュラインに必要な全ての更新が準備されるまでメモリセキュリティユニット20内にバッファリングされるため、更新されたキャッシュラインをオフチップに書き込むためには単一の書き込み要求のみが必要である。同様に、異なる非整合性ツリーのターゲットデータブロック50への複数の書き込み要求が並行して実行されている場合、異なるターゲットデータブロック50のカウンタ更新の一部では、同じ整合性ツリーノード内の異なるカウンタを更新する必要があり得るため、メモリシステムユニット20内のカウンタ更新をバッファリングすることにより、1つのキャッシュラインにおけるそのような複数のカウンタ更新をオフチップメモリ14への単一の書き込みトランザクションで実行することが可能になる。したがって、カウンタおよびMAC更新を実行するためにオフチップメモリ14に対してトランザクションが開始される正確な方法は、実装ごとに異なり得ることが理解されよう。
所与のノードのマイナーカウンタ97をできるだけ小さくすることが望ましい場合があり、これにより、メモリの同じ領域を保護するためのカウンタツリーのレベル数を減らすことが可能になり、ツリートラバース中のメモリトラフィックを削減し、その後のパフォーマンスの改善につながる。さらに、カウンタキャッシュラインごとのマイナーカウンタの数が多いほど、キャッシュ可能性が向上し、ツリートラバース中にカウンタをフェッチするメモリアクセス数が減る(トラバースはキャッシュでヒットするまで続くため)。
一方、リーフノードでのマイナーカウンタのオーバーフローは、MAC、ならびにオーバーフローのために増分されたメジャーカウンタを使用して暗号化および認証されるメモリ内の全てのキャッシュラインの再暗号化および再計算を意味する。整合性ツリー自体は非暗号化形式で保存される可能性があるため、非リーフノードでのマイナーカウンタのオーバーフローはMAC再計算のオーバーヘッドのみを引き起こす。しかしながら、親ノードのマイナーカウンタは、子ノードの任意のマイナーカウンタへの書き込み時に増分されるため、ツリーを上に行くにつれて書き込み数が増え、オーバーヘッドが増加する可能性がある。したがって、小さなマイナーカウンタが提供する小さなフットプリントと優れたキャッシュ可能性の特性は、再暗号化とMAC再計算のオーバーヘッドを管理できる場合にのみ、整合性保護のためにメモリトラフィックのオーバーヘッドを削減するのに有効である。所与のノードのマイナーカウンタサイズが固定されている場合、これらの競合する要求を調整することは困難である。
この目的のために、本発明者らはツリーのアリティに影響を与えずにマイナーカウンタのサイズを変更する機構を提案する。これを図10〜図13に例示する。メモリに頻繁に書き込まれる傾向があるキャッシュラインの場合、ツリーのアリティに影響を与えることなく、マイナーカウンタサイズが動的に増加する。高アリティのコンパクトツリーには、整合性保護のためのメモリアクセスが少ないというメリットがあり、頻繁に書き込まれるキャッシュラインだけの大きなマイナーカウンタは、再暗号化とMAC再計算のオーバーヘッドを確認するのに役立つ。この挙動を達成するために、カウンタキャッシュのカウンタキャッシュラインのMACから少数のビットを盗み、マイナーキャッシュのサイズを示すために使用する。これらのビットの最小値(00)は、最小のマイナーカウンタサイズ(図10〜図13の例では3ビット)を示すために使用できる。
図10に示すように、メモリセキュリティユニット20は、全てのカウンタが最小サイズ(例えば3ビット)のものであるメインカウンタツリー26を構築することにより開始する。各ノードのマイナーカウンタのサイズは、サイズフィールド402で示され、このフィールドは、この例ではMACのサイズを64ビットではなく62ビットに減らすことによって2ビットが利用可能になる。別の方法は、サイズフィールド402のスペースを確保するために、MACのサイズを縮小する代わりにメジャーカウンタのサイズを縮小することである。この時点で、マイナーカウンタサイズを増やす必要がある場合に追加のミラーノードを収容するミラーツリー400はまだ存在しない可能性があり、ミラーツリー400は、以下で説明するように必要に応じて割り当てることができる。あるいは、ミラーツリー400用の空間は既にメモリに割り当てられていてもよいが、ミラーツリー400はまだポピュレートされていなくてもよい。
メインカウンタツリー26は上記実施形態と同じ方法で使用され、関連するMACを、データブロックの内容に基づいて計算されたMAC、ならびにそのデータブロックに関連付けられた親ノードから取得されたメジャーカウンタおよびマイナーカウンタと比較することにより、所与のデータブロックの整合性を検証する。ツリーを上にトラバースする各ノードの複数の整合性確認をルートまで実行して、各カウンタ自体が有効であることを確認できる。ルートノードの整合性を検証するためのルート検証情報89は、上述のようにオンチップメモリに保存されてもよい。データブロックへの書き込み時に、関連するリーフノードカウンタが増分され、そのノードのMACが再計算される。
これは、メインツリーの所与のノード88のマイナーカウンタのサイズを増やすことが有用であり得ることを示すサイズ増加トリガイベントが検出されるまで続く。様々なイベントをサイズ増加トリガイベントとして扱うことができる。例えば、サイズ増加トリガイベントは、所与のノードで検出されたマイナーカウンタのオーバーフローであり得る。また、サイズ増加トリガイベントは、所与のノードのマイナーカウンタのオーバーフローの閾値を超える比率、または何らかの他の条件を満たすオーバーフローの割合であり得る。また、一般に、所与のツリーノードで検出されたオーバーフロー、再暗号化またはMAC再計算の頻度またはパターンに関するメトリックを監視し、マイナーカウンタのサイズを増やすかどうかを決定するために使用できる。別の例では、サイズ増加トリガイベントは、保護領域の関連サブセットに関連付けられたメモリトラフィックのレベルが閾値よりも大きいことを検出することを含むことができ、保護領域の関連サブセットは、関連するサブセット内の任意のターゲットブロックの整合性検証が所与の分割カウンタノードに依存する保護領域の一部を含む。例えば、メモリセキュリティユニット20は、保護領域の特定の部分に関連付けられたメモリトラフィックの量を監視することができる。ツリーの上位レベル(ルートに近い)のノードは、通常、カウンタがより多くのデータブロックの整合性確認に関与するため(ツリーをトラバースする各連続カウンタを検証するために必要なMAC計算のシーケンスに起因する)、下位レベルのノードに比べて保護領域のより大きな部分に関連付けられる。したがって、ツリーの所与のノードに依存して整合性が検証される部分へのトラフィックが大量にある場合、対応するノードのマイナーカウンタサイズは大きくなる可能性がある。例えば、メモリトラフィックの監視は、プロセッサコア6の最終レベルキャッシュ10からオフチップメモリ14への書き込み数の追跡に基づくか、独自の内部キャッシュ42からオフチップメモリ14へのメモリセキュリティユニット20による書き込み数の追跡に基づくことがある。
したがって、一般に、メモリセキュリティユニット20は、メインツリー26の所与のノード内のマイナーカウンタが小さすぎることを示すサイズ増加トリガイベントを識別することができる。マイナーカウンタのサイズを大きくする必要があることが識別されると、メモリセキュリティユニット20は、メインツリー26に、等しいサイズの1つ以上のミラーサブツリー400を割り当てる。メインツリーの識別されたノード内の全てのマイナーカウンタのマイナーカウンタサイズは、最小サイズの整数倍(図11の6ビットなど)に増加し、そのノードのマイナーカウンタの小数fのみが元の場所(例えば、図11のf=0.5)に保存される。そのノードの残りのマイナーカウンタは、ミラーツリー400の対応するノードに割り当てられ、ミラーツリー400は、メインツリーのメインノードに使用されるオフセットと同じミラーツリー400内のオフセットに位置する。メインノードのサイズフィールド402は更新されて、そのノードのマイナーカウンタのサブセットが実際にミラーツリー400の対応するミラーノード404に保存されていることを示す。
図11は、メインツリーのノードN127がより大きなマイナーカウンタを必要とする例を示す。したがって、マイナーカウンタは6ビットカウンタに増加し、これは、ノードN127の128個の子ノードN127_0〜N127_127に関連付けられた128個のマイナーカウンタのうち64個を保存するための空間しかないことを意味する。したがって、ノードN127のフィールド402のサイズフィールド値0b01は、マイナーカウンタ0〜63がそのノード自体に保存されているが、マイナーカウンタ64〜127はミラーツリー400の対応するミラーノードN127’に保存されていることを識別する。
ミラーツリー内の新たに割り当てられたノードを使用して、所与のメインツリーノードのマイナーカウンタのサイズを増やす場合、メモリセキュリティユニット20は以下のステップを実行してもよい。
1.オーバーフローしたばかりのマイナーカウンタを、オーバーフロー前の値にロールバックする。
2.ここで、マイナーカウンタは、メインノードおよび少なくとも1つのミラーノード内の各Nビットのマイナーカウンタについて、サイズ増加前にMビット、サイズ増加後にNビットを有し、
オーバーフロー前に、マイナーカウンタのM最下位ビットと、対応するマイナーカウンタの値とを等しく設定し、
マイナーカウンタの(N−M)最上位ビットと、所与のメインツリーノードのメジャーカウンタの(N−M)最下位ビットとを等しく設定する。
3.所与のメインツリーノードのメジャーカウンタを、(N−M)ビットだけ右にシフトする(これにより、マイナーカウンタにシフトされたビットはシフトアウトされ、(N−M)先行0がメジャーカウンタの残りのビットに接頭辞を付与する)。
4.次に、再びオーバーフローしたマイナーカウンタを増分する。
例えば、4ビットのメジャーカウンタと4個の2ビットのマイナーカウンタを有するノードを考えてみる(単純化するためにより小さいカウンタサイズを使用する)。さらに、カウンタは次の(バイナリ)値を有すると仮定する。
Major C. Minor C's
0101 01 10 11 00
(Major C;メジャーカウンタ、Minor C’s:マイナーカウンタ)
ここで、サイズ増加イベントによってマイナーカウンタが4ビットに増加する場合(4番目のマイナーカウンタが11−>00にオーバーフローしたため)、更新されたメインツリーノード(Main tree node)とミラーノード(Mirror node)は次のようになる。
Main tree node: Mirror tree node:
Major C. Minor C's Major C. Minor C's
0001 0101 0110 0001 0111 1000
ここで、N=4、M=2であるため、(N−M)=2、すなわち、全てのマイナーカウンタに2ビットを追加した。したがって、全てのマイナーカウンタにメジャーカウンタの2個の最下位ビットで接頭辞を付与し、メジャーカウンタに2個の0で接頭辞を付与する。
このような操作により、メジャーカウンタ:マイナーカウンタの組み合わせは、影響を受けるノード内の他の全ての(オーバーフローしていない)マイナーカウンタについては不変であるため、コストのかかる再暗号化/MAC再計算が回避される。
したがって、ノードN127の子ノードN127_0のMACを認証する場合、マイナーカウンタは親ノードN127自体から選択できるが、ノードN127の異なる子ノードN127_127のMACを認証する場合、マイナーカウンタはミラーノード127’から読み込まれることがある。メインノードN127とミラーノードN127’は両方ともメインツリーで同じ親ノードを共有するため、同じメジャーカウンタとマイナーカウンタ(この例ではルートノードから取得)を使用して、メインノードN127およびミラーノードN127’の両方に関連付けられたMACを計算する。各ミラーノード404は、メインツリーのノード88と同じレイアウトを有してもよいが、ミラーノード404の全マイナーカウンタおよび対応するメインノード88間で共有されるメジャーカウンタ95は、メインノード88自体で指定され得るため、メジャーカウンタフィールド95をミラーノード404で使用する必要はない。
図11に示す他のノード(ルートノード、N0、N127_0、N127_127)については、マイナーカウンタのサイズを増やす必要がまだないため、ミラーツリー内の対応する場所406はまだポピュレートされていない。ミラーツリー400はまばらにポピュレートされた構造であり、メインツリー26と同じサイズの完全なツリーを収容するためにメモリ内の空間が割り当てられているが、メインツリーのどのノード88でメモリトラフィックが最も多いかに応じて、ミラーツリー400の選択されたノードのみが満たされ、そのようにしてオーバーフローの頻度を減らすために各マイナーカウンタに追加のビットが必要であると判定される。したがって、各ノードのアリティを可能な限り高くするために、必要以上に大きいサイズのマイナーカウンタを不必要に割り当てる必要はないが、頻繁にアクセスされるメモリ領域では、対応するノードに、アリティを犠牲にすることなくより大きなカウンタを与え、データの再暗号化やMACの再計算を頻繁に行わなければならないことによるコストのかかるパフォーマンスオーバーヘッドを削減することができる。メインツリーのルートノード402にミラーツリー400のミラーノードが割り当てられている場合、オンチップメモリのルート整合性検証情報89は、ミラーツリー400のルートノードの整合性を検証するための情報も指定することができる。メインツリーのルートノード402がミラーノードを必要としない場合、ミラーツリー400の任意のノードは、メインツリー26の親ノード、または親ノードがマイナーカウンタを展開している場合にはその親ノードに対応するミラーノード404で指定された情報に基づいて、その整合性を検証することができる。
図12に示すように、場合によっては複数レベルのマイナーカウンタサイズがサポートされることがあり得るため、メインツリーの所与のノードでサイズ増加トリガイベントが検出されるたびに、マイナーカウンタサイズをメモリセキュリティユニット20でサポートされる2番目に大きいサイズに増やすことができる。例えば、図12では3つのレベルがサポートされており、カウンタサイズフィールド0b00、0b01および0b10は、それぞれ3ビット、6ビット、または12ビットのカウンタサイズを示す。マイナーカウンタサイズが、サポートされる最小カウンタサイズの2倍を超えるメインツリーのノードの場合、そのノードの子ノードの全てのマイナーカウンタに対応するために、複数のミラーツリーに追加のミラーノードが必要になる場合がある。例えば、図12のノードN0_127の場合、サイズフィールド値0b10は、12ビットマイナーカウンタが使用されることを示しているため、128個の3ビットマイナーカウンタに以前に割り当てられた空間に収まるのは32個の12ビットマイナーカウンタのみである。したがって、ノードN0_127の子ノードの残りの96個の12ビットマイナーカウンタは、図12に示すように、さらに3つのミラーツリー400の3つの対応するノードN0_127’、N0_127’’、N0_127’’’に分散され得る。対照的に、6ビットのマイナーカウンタが使用される図12のノードN0の場合、唯一の対応するノードN0’を第1のミラーツリー400に割り当てればよく、第1のミラーツリー400は、必要な128個のマイナーカウンタを保存するのに十分であるため、ミラーツリー2および3のノードN0’’、N0’’’はポピュレートされない。後でノードN0で別のサイズ増加トリガイベントが発生する場合には、マイナーカウンタサイズが12ビットに増分され、この時点でノードN0’’およびN0’’’がポピュレートされるようになる可能性がある。追加のミラーカウンタ整合性ツリーの各々は、任意のノードに初めてそのミラーノードの1つをポピュレートする必要があるメモリ内に、割り当てられた空間を有する(例えば、図12のミラーツリー2および3は、メインツリーのノードN0_127のマイナーカウンタサイズが12ビットに増加したときに割り当てられた可能性がある)。
図13に示すように、メモリセキュリティユニット20は、メインツリー26および1つ以上のミラーツリー400のためにメモリ内の空間を割り当ててもよい。メインツリー26の場合、ツリーの各ノード88には、メインツリーベースアドレス410に対する対応するオフセットが割り当てられる。各ミラーツリー400について、メモリセキュリティユニット20は、メインツリー26に割り当てられるのと同じ量の空間を割り当ててもよく、ミラーツリーの各ミラーノード404は、ミラーツリーベースアドレス412に対して、メインツリー26の対応するメインノード88に使用されるオフセットと同じオフセットに位置する。例えば、図13に示すように、メインツリーベースアドレス410とメインノードN0_127のアドレスとの間のメインオフセット414は、ミラーツリーベースアドレス412と対応するミラーノードN0_127’のアドレスとの間のミラーツリーオフセット416に等しい。メインノードN0_127のカウンタサイズを拡張する必要性がまだ識別されているかどうかに依存して、ミラーツリーオフセット416で指定されたオフセットの実際のメモリ位置は、実際にはカウンタで満たされていない可能性がある。したがって、メモリ内のミラーツリー400に割り当てられた空間はまばらにポピュレートされている可能性があり、この空間のいくつかの部分は所与の時間未使用である可能性がある。
例えば、セキュアメモリの保護領域1GBを有するシステムを整合性ツリーで保護すると考える場合、その保護領域をカバーするノードを保存するために必要な合計メモリは、各メインツリーノードで128個の3ビットマイナーカウンタを使用すると約8MBであり得る(メジャーカウンタのサイズ、図10の例に示すサイズおよびMACフィールドを使用する場合であるが、明らかに他のサイズも可能である)。したがって、ベースツリーのサイズは約8MBであり得る。マイナーカウンタサイズのジャンプごとに、同じサイズ(8MB)のまばらにポピュレートされたミラーサブツリーを構築する。したがって、図12に示すようにさらに3つのミラーツリーが構築される場合でも、合計の空間は約32MBのままである。比較すると、固定されたサイズカウンタを用いる図3の手法では、約150MBのフットプリントを有する静的カウンタツリーが構築され得る。したがって、図10の手法で追加のミラーツリーを構築することに関連するオーバーヘッドははるかに少なくなる。メモリは書き込み頻度の均等な分布で書き込まれないため、一部の領域の保護は小さなマイナーカウンタで対応でき、また、ミラーツリーを使用して、ノードごとのアリティを犠牲にすることを必要とせずに、選択されたノードのマイナーカウンタサイズを増やすことができる。また、ミラーツリーを使用する可変マイナーカウンタサイズの手法は、サポートされる所与の最大マイナーカウンタサイズ(例えば32ではなく128)に対して各ツリーノードのアリティを大きくでき、メモリの所与のサイズ領域を保護するのに必要なノードの総数が削減され、したがって、全てのノードのマイナーカウンタサイズが最大サイズに増加した場合でも、MACまたはメジャーカウンタを保存するのに必要な空間は少なくなることを意味する。すなわち、図10に示すツリーの全てのノードが12ビットのマイナーカウンタまで増加し、3つのミラーツリー全てを完全にポピュレートする必要がある場合でも、合計の空間は依然として図3よりも小さくなる。
メインツリー26および各ミラーツリー400のベースアドレス410、412は、メモリセキュリティユニット20内で、そのキャッシュ42内または専用ベースアドレスレジスタ内のいずれかに保持され得る。ベースアドレスレジスタが提供されている場合、対応するミラーツリーがまだ割り当てられていない場合には各ミラーツリーのベースアドレスレジスタは無効な値に設定されることがある(例えば、無効な値は、実際のミラーツリーへの割り当てが許可されていない予め決定されたベースアドレスであり得、例えば全て0もしくは全て1、またはレジスタに関連付けられた個別の有効なビットは、アドレスが有効なベースアドレスであるかどうかを示すことができる)。この場合、メモリセキュリティユニット20は、特定のミラーツリーベースアドレスが有効であるかどうかから、ツリー構造全体で使用されるマイナーカウンタの最大サイズを推測することができる。例えば、図12のミラーツリー2に関連付けられたベースアドレスレジスタが無効と示されている場合、これはツリー構造の任意のノードで使用される最大マイナーカウンタサイズが6ビット以下であることを示す。これにより、ツリーで使用される最大マイナーカウンタサイズの個別の指示を保存する必要性を回避できる。
また、メモリセキュリティユニット20は、いくつかの例では、特定のミラーツリー内にどのノード、および/またはいくつのノードがポピュレートされたかを示す追跡情報を維持してもよい。これにより、メモリセキュリティユニット20は、メインツリー26の対応するノードが必要なときに、必要なミラーツリーノードを投機的にロードするかどうかを決定できるようになる。すなわち、メモリセキュリティユニット20は、メインツリーノードにアクセスするためのロード要求を発行する際に、以下かどうかを決定する必要があり得る。
(i)メインツリーノードが返されるのを待ってから、メインツリーノードのサイズフィールド402に基づいて、関連するマイナーカウンタを取得するために対応するミラーツリーノードをロードする必要があるかどうかを判定する、または(ii)メインツリーノードのサイズフィールド402が確認されるとともにミラーツリーノードが実際に必要かどうかが判定されるのを待たずに、1つ以上のミラーツリーノードとメインツリーノードをロードする。オプション(i)を使用すると、ミラーツリーノードが実際に必要でない場合に、不要なロードのトリガを回避することにより、メモリ帯域幅を削減できる。オプション(ii)を使用すると、ミラーツリーノードが必要である場合に、遅延を回避することにより、パフォーマンスを改善できる。オプション(i)またはオプション(ii)が好ましいかどうかは、所与のミラーツリーで確立された有効なノード数に依存し、ミラーツリー内の有効なノード数が多いほど、現在のアクセスが、対応するミラーノードを必要とする可能性が高くなり、したがって、ミラーノードを投機的にロードすることでパフォーマンスが向上する可能性が高くなる。
したがって、一般に、メインカウンタ整合性ツリーの所与のノードにアクセスするときに、メモリセキュリティユニット20は、メインツリーの所与のノードが実際にメモリから返される前に、所与のノードのマイナーカウンタサイズを予測し、マイナーカウンタサイズの予測を使用して、対応するメインツリーノードが返される前に所与のミラーツリー内のミラーツリーノードのロードをトリガするかどうかを判定することができる。予測は、所与のミラーツリーが割り当てられているかどうか、および/または所与のミラーツリーに対して有効なノードがいくつ確立されているかを示す追跡情報に基づくことができる。追跡情報は、様々なレベルの精度で有効なノード数を追跡できる。例えば、メモリセキュリティユニット20は、追跡情報でどの特定のノードが有効であることを指定せずに、所与のミラーツリーのノードがいくつ有効かをカウントする有効ノードカウンタを維持することができる(例えばこの場合、そのツリーの有効ノードカウンタが所定の閾値よりも大きい場合にミラーツリーノードは投機的にロードされ得る)。あるいは、メモリセキュリティユニット20は、ミラーツリーのどの特定のノードが有効であるかを示すビットマップを維持することができ、これにより、所与のミラーツリーノードが必要かどうかの正確な決定が可能になる。いずれにしても、ミラーツリーのポピュレーションレベルを追跡することは、ロードスケジューリングに関する決定に役立ち、パフォーマンスを向上させることができる。
図9の方法を拡張して、上述の可変マイナーカウンタサイズの例を実装することができる。そのような実施形態では、ステップ276でマイナーカウンタがオーバーフローすると、ステップ280に直接進む代わりに、追加のステップを実行して、マイナーカウンタサイズが既に最大マイナーカウンタサイズであるかどうかを確認できる。既にマイナーカウンタサイズがメモリセキュリティユニット20によってサポートされる最大サイズである場合、方法はステップ280に進み、ターゲットブロックに関連付けられたメジャーカウンタを増分し、方法は上記のようにステップ280以降に続く。しかしながら、マイナーカウンタサイズがサポートされている最大サイズにまだ達していない場合、メモリセキュリティユニット20は、オーバーフローしたマイナーカウンタを含むメインツリーのノードに関連付けられたマイナーカウンタのサイズを増やす。したがって、ミラーツリー400のメインノードと少なくとも1つの対応するノード404は、各カウンタのビット数が拡張されるように書き換えられ(上記のように、1つ以上のビットをメジャーカウンタから各マイナーカウンタにシフトし、メジャーカウンタを先行ゼロでパディングすることによって)、拡張されたマイナーカウンタ値は、メインノード自体のマイナーカウンタ用に予約された空間、およびミラーツリー400の1つ以上の対応するノード404に分配される。関連するサイズのマイナーカウンタを収容するために必要なミラーツリー400に空間がまだ割り当てられていない場合、この時点でメモリセキュリティユニット20が空間を割り当てることができる。次に、方法は図9のステップ278に進み、図9の残りのステップは上記と同じである。
図10〜図13の例は、ツリーの各レベルが同じアリティ(128)を持つ場合を示すが、前の例と同様に、図14で示すようにツリーのレベル間で異なるアリティを持つツリーを提供することも可能であり、図14は、親ノードが32進で子ノードが64進である例を示す。最初は、親ノードには32進の12ビットマイナーカウンタがあり、子ノードには64進の6ビットマイナーカウンタがあったが、サイズ増加トリガイベントの後、64進の子ノードのマイナーカウンタのサイズは12に増加し、追加のミラーノードが割り当てられて64進の子ノードの12ビットカウンタの半分を収容する。暗号化カウンタの後続ノード(64進の子ノードのカウンタを使用してMACが計算される)は128進であり得る。図14は各ノードの2の累乗のアリティを示すが、上述のように正確な2の累乗ではないアリティを提供することも可能である。
要約すると、上記では分割カウンタを使用するカウンタツリーが説明され、少なくともいくつかのレベルで分割カウンタ設計が使用される。これにより、図2および図3の比較例の8進ツリー(カウンタツリーまたはMACツリー)とは対照的に、16、32、64または128進の整合性ツリーを構築できる(選択された分割カウンタ設計のマイナー:メジャーカウンタ比(16,32,64,128など)に基づく)。これにより、メモリの同じ領域を保護するためのカウンタツリーのレベル数を減らすことができ、ツリートラバース中のメモリトラフィックの減少につながり、その後のパフォーマンスが向上する。さらに、カウンタキャッシュラインごとのマイナーカウンタ数が多いほど、キャッシュ可能性が向上し、ツリートラバース中のメモリアクセス数が減る(トラバースはキャッシュがヒットするまで続くため)。
各レベルで異なる分割カウンタ設計を使用する可変アリティカウンタツリーについて説明する。親ノードのマイナーカウンタは、子ノードの任意のマイナーカウンタへの書き込み時に増分される。したがって、ツリーを上に行くと、書き込みトラフィックは指数関数的に増加する(キャッシュの効果は無視する)。したがって、本発明者らは、各レベルで攻撃性の低い分割カウンタ設計を使用することにより、ツリーの上位へ行くにつれてツリーのアリティを減らすことを提案する。評価では、分割−64設計ではリーフレベルで重大なオーバーフロー(MACの再計算が実行時間の50%以上を占める)が見られるが、分割−32設計では無視できるほど小さいオーバーフロー(MACの再計算は1%未満の時間を費やす)が見られる。したがって、本発明者らは、リーフレベルで分割−48(メジャーカウンタごとに48個のマイナーカウンタを持つ)を設計し、ツリーの次のレベルで比を減らし(メジャーカウンタごとに36個のマイナーカウンタを持つ分割−36)、以下同様にすることを提案する。これにより、2の累乗ではないアリティが発生し、アドレス計算算術が複雑になるが、それはMACの再計算によるオーバーヘッドなしで追加のパフォーマンスメリットを活用するためにかかる妥当なコストである。
本発明者らは、また、ミラーツリーを使用して所定のノードの拡大されたカウンタを収容する可変マイナーカウンタサイズのツリーを提案し、これはマイナーカウンタサイズの減少(アリティとツリートラバースパフォーマンスの向上を可能にする)およびマイナーカウンタサイズの増加(マイナーカウンタがオーバーフローしたときに再暗号化またはMAC再計算が必要になる可能性を減らす)の競合する需要を両立させるのに役立つ。ミラーツリーの手法では、より大きなカウンタを必要とするノードはより大きなカウンタを使用できるが、あまり頻繁ではない他のノードはより小さなマイナーカウンタをなおも使用できる。可変マイナーカウンタの手法を、必要に応じて、上記可変アリティツリーと組み合わせるか、アリティがツリー全体で同じ場合には固定アリティのバージョンを使用できる。
図15は、異なる分割カウンタベースのカウンタツリーのパフォーマンスの評価を示す。
・棒グラフ4本の各セットの左側の棒グラフは、モノリシック56ビットカウンタ(モノ−8)との比較の手法を示す。
・棒グラフ4本の各セットの左から2番目の棒グラフは分割16(16進)を示す。
・棒グラフ4本の各セットの左から3番目の棒グラフは分割‐32(32進)を示す。
・棒グラフ4本の各セットの右側の棒グラフは分割‐64(64進)を示す。
パフォーマンスの高速化は、各ベンチマークについてモノ−8の棒グラフに対する比として表示され、すなわち、モノ−8の場合、高速化比は常に1である。暗号化および整合性ツリーカウンタをオンチップでキャッシュする32KBの専用カウンタキャッシュを想定している。これらの構成のパフォーマンスをSPEC2006のメモリを集中的に使用する作業量で評価する(1000命令あたり1メモリアクセス以上)。図10に示すように、分割−32(32進)のツリーは、モノリシックカウンタ(56ビット)ツリー(8進)と比較して平均で42%の高速化を示している。分割−16カウンタツリーは、平均で26%のやや少ない高速化を示す。これは主に、分割カウンタツリーノードのキャッシュ可能性が改善され、メモリトラフィックの削減につながったためである。分割−64は、分割−32(平均42%)と比較して大幅な高速化(平均57%)を示している。ただし、分割−64では、パフォーマンスモデルでは考慮されていないオーバーフロー(MAC再計算の処理に50%以上の時間を費やす)のため、かなりのコストもかかる。その結果、分割−32が静的アリティを備えたカウンタツリーのより好ましい保守的な設計、すなわちレベルをまたがるカウンタと同じ設計である。ただし、分割−32と分割−64のパフォーマンスの違い、および分割−32では無視できるほど少ないが分割−64ではかなりのオーバーフローが発生するという事実を考えると、図5に示すように、可変で2の累乗ではないアリティの分割カウンタツリーに中間点を見出すことができる。
図16は、使用可能なシミュレータの実装を例示している。前述の実施形態では、当該技術をサポートする特定の処理ハードウェアを動作させる装置および方法の点で本発明が実装されているが、コンピュータプログラムの使用を通じて実装される本明細書に記載の実施形態に従って命令実行環境を提供することも可能である。このようなコンピュータプログラムは、ハードウェアアーキテクチャのソフトウェアベースの実装を提供する限り、しばしばシミュレータと呼ばれる。様々なシミュレータのコンピュータプログラムには、エミュレータ、仮想マシン、モデル、および動的バイナリトランスレータを含むバイナリトランスレータが含まれる。通常、シミュレータ実装はホストプロセッサ330上で実行され、オプションでホストオペレーティングシステム320を実行し、シミュレータプログラム310をサポートし得る。いくつかの構成では、ハードウェアと提供された命令実行環境および/または同じホストプロセッサ上に提供された複数の別個の命令実行環境との間に複数のシミュレーション層があり得る。歴史的に、合理的な速度で実行するシミュレータ実装を提供するには強力なプロセッサが必要であるが、互換性や再利用の理由で別のプロセッサにネイティブなコードを実行したい場合など、所定の状況ではそのような手法は正当化され得る。例えば、シミュレータ実装は、ホストプロセッサハードウェアでサポートされていない追加機能を命令実行環境に提供したり、通常は異なるハードウェアアーキテクチャに関連付けられる命令実行環境を提供したりすることがある。シミュレーションの概要は、「Some Efficient Architecture Simulation Techniques」Robert Bedichek、Winter 1990 USENIX Conference、53〜63ページに記載されている。
特定のハードウェア構成または特徴を参照してこれまで実施形態を説明した範囲で、シミュレーションの実施形態では、適切なソフトウェア構成または特徴によって同等の機能を提供することができる。例えば、特定の回路は、コンピュータプログラムロジックとしてシミュレーションの実施形態に実装されてもよい。同様に、レジスタまたはキャッシュなどのメモリハードウェアは、ソフトウェアデータ構造としてシミュレーションの実施形態に実装されてもよい。前述の実施形態で参照した1つ以上のハードウェア要素がホストハードウェア(例えば、ホストプロセッサ330)上に存在する構成では、一部のシミュレーションの実施形態では、適切な場合、ホストハードウェアを利用してもよい。
シミュレータプログラム310は、コンピュータ可読記憶媒体(非一時的媒体であってもよい)に保存されてもよく、プログラムインターフェース(命令実行環境)を、シミュレータプログラム310によってモデル化されているハードウェアアーキテクチャのアプリケーションプログラムインターフェースと同じターゲットコード300に提供する。したがって、オフチップメモリ14のデータを読み書きするための命令を含むターゲットコード300のプログラム命令は、シミュレータプログラム310を使用して命令実行環境内から実行することができ、上記のようにハードウェアで提供されるメモリセキュリティユニット20を実際に持たないホストコンピュータ330は、これらの特徴を模倣できる。
さらなる構成例を以下の条項に記載する。
(1)メモリに保存されたデータへのアクセスを制御するためのメモリアクセス回路と、
メモリの保護メモリ領域に保存されたデータの整合性を検証するためのメモリセキュリティ回路と
を含む装置であって、
メモリセキュリティ回路は、複数のノードを含むカウンタ整合性ツリーを維持するように構成され、各ノードは、保護メモリ領域の各データブロックに関連付けられた複数のカウンタを指定し、複数のノードは、カウンタ整合性ツリーのさらなるカウンタを提供する子ノードを保存するデータブロックにカウンタの少なくとも1つが関連付けられている少なくとも1つの親ノードと、カウンタ整合性ツリー以外のデータを保存するデータブロックにカウンタの少なくとも1つが関連付けられている少なくとも1つのリーフノードとを含み、
メモリセキュリティ回路は、保護メモリ領域のターゲットデータブロックへのアクセスに応答して、ターゲットデータブロックに関連付けられた保存済み認証コードと、ターゲットデータブロックおよびターゲットデータブロックに関連付けられているカウンタ整合性ツリーのターゲットカウンタに基づいて生成される計算された認証コードとを比較することによって、ターゲットデータブロックの整合性を検証するように構成され、
カウンタ整合性ツリーのノードの少なくとも1つは、少なくとも2つのカウンタ間で共有されるメジャーカウント値と、少なくとも2つのカウンタの各々に個別に指定されるそれぞれのマイナーカウント値との組み合わせとして各々定義される少なくとも2つのカウンタを指定する分割カウンタノードを含む、装置。
(2)第2のメモリを備え、
メモリセキュリティ回路が、
カウンタ整合性ツリーのルートノード、または
保護メモリ領域に保存されているカウンタ整合性ツリーのルートノードの整合性を検証するための情報
を指定するルート検証データを第2のメモリに保存するように構成されている、
条項(1)に記載の装置。
(3)ターゲットデータブロックへのアクセスに応答して、メモリセキュリティ回路は、ターゲットカウンタとルートノードを含むカウンタ整合性ツリーのブランチ上のカウンタの整合性を検証するために1回以上の検証確認を実行するように構成され、検証確認の少なくとも1回は、第2のメモリに保存されているルート検証データに依存する、条項(2)に記載の装置。
(4)保護メモリ領域のターゲットデータブロックの更新に応答して、メモリセキュリティ回路は、ターゲットカウンタを更新し、ターゲットデータブロックに関連付けられた保存済み認証コードを、ターゲットデータブロックの更新されたデータと更新されたターゲットカウンタとに基づいて再計算するように構成されている、条項(1)に記載の装置。
(5)メモリセキュリティ回路は、ターゲットカウンタを増分することによりターゲットカウンタを更新するように構成されている、条項(4)に記載の装置。
(6)ターゲットデータブロックのターゲットカウンタがカウンタ整合性ツリーの分割カウンタノードによって指定される場合、保護メモリ領域のターゲットデータブロックの更新に応答して、メモリセキュリティ回路は、ターゲットカウンタに対応するマイナーカウント値を更新し、ターゲットデータブロックの更新されたデータ、ターゲットカウンタに対応する対応するメジャーカウント値、およびターゲットカウンタに対応する更新されたマイナーカウント値に基づいて、ターゲットデータブロックに関連付けられた保存済み認証コードを再計算するように構成されている、条項(1)に記載の装置。
(7)マイナーカウント値への更新がオーバーフロー状態を引き起こす場合、メモリセキュリティ回路は、対応するメジャーカウント値を更新し、対応するメジャーカウント値を共有しているカウンタに関連付けられたデータブロックの各々に関連付けられた保存済み認証コードを再計算するように構成されている、条項(6)に記載の装置。
(8)少なくとも1つの親ノードの少なくとも1つは分割カウンタノードである、条項(1)に記載の装置。
(9)カウンタ整合性ツリーは、カウンタ整合性ツリーの異なるレベルに少なくとも2つの分割カウンタノードを含む、条項(1)に記載の装置。
(10)カウンタ整合性ツリーは、異なる数のデータブロックのカウンタを指定する少なくとも2つのノードを含む、条項(1)に記載の装置。
(11)カウンタ整合性ツリーは、第1の数のデータブロックのカウンタを指定する第1の分割カウンタノードと、第1の数よりも大きい第2の数のデータブロックのカウンタを指定する第2の分割カウンタノードとを含み、第1の分割カウンタノードは第2の分割カウンタノードの親ノードである、条項(1)に記載の装置。
(12)第1の分割カウンタノードによって指定されたマイナーカウント値は、第2の分割カウンタノードによって指定されたマイナーカウント値よりも大きいビット数を有する、条項(11)に記載の装置。
(13)第1の分割カウンタノードの親ノードは、第1の数よりも小さい第3の数のデータブロックのカウンタを指定する分割カウンタノードである、条項(11)に記載の装置。
(14)カウンタ整合性ツリーの少なくとも1つのノードは、正確な2の累乗以外のデータブロックの数のカウンタを指定する、条項(1)に記載の装置。
(15)メモリセキュリティ回路は、ターゲットデータブロックと同じキャッシュラインからターゲットデータブロックの保存済み認証コードを読み取るように構成されている、条項(1)に記載の装置。
(16)ターゲットデータブロックへのアクセスに応答して、メモリセキュリティ回路は、保存済み認証コードと計算された認証コードとの間に不一致が検出されたときにセキュリティ違反応答をトリガするように構成されている、条項(1)に記載の装置。
(17)メモリセキュリティ回路は、保護メモリ領域のデータブロックに書き込まれたデータを暗号化し、保護メモリ領域のデータブロックから読み取られたデータを復号化する暗号化/復号化回路を含む、条項(1)に記載の装置。
(18)メモリアクセス回路は、カウンタ整合性ツリーとは無関係に、メモリの非保護メモリ領域へのアクセスを制御するように構成されている、条項(1)に記載の装置。
(19)複数のノードを含むカウンタ整合性ツリーを維持することであって、各ノードが、保護メモリ領域の各データブロックに関連付けられた複数のカウンタを指定し、複数のノードは、カウンタ整合性ツリーのさらなるカウンタを提供する子ノードを保存するデータブロックにカウンタの少なくとも1つが関連付けられている少なくとも1つの親ノードと、カウンタ整合性ツリー以外のデータを保存するデータブロックにカウンタの少なくとも1つが関連付けられている少なくとも1つのリーフノードとを含むことと、
保護メモリ領域のターゲットデータブロックへのアクセスに応答して、ターゲットデータブロックに関連付けられた保存済み認証コードと、ターゲットデータブロックおよびターゲットデータブロックに関連付けられているカウンタ整合性ツリーのターゲットカウンタに基づいて生成される計算された認証コードとを比較することによって、ターゲットデータブロックの整合性を検証することであって、
カウンタ整合性ツリーのノードの少なくとも1つは、少なくとも2つのカウンタ間で共有されるメジャーカウント値と、少なくとも2つのカウンタの各々に個別に指定されるそれぞれのマイナーカウント値との組み合わせとして各々定義される少なくとも2つのカウンタを指定する分割カウンタノードを含むことと、
を含む、メモリの保護メモリ領域に保存されたデータへのアクセスを制御する方法。
(20)条項(19)の方法を実行するようにデータ処理装置を制御するためのコンピュータプログラムを記憶している非一時的記憶媒体。
(21)命令実行環境を提供するためにホストデータ処理装置を制御するためのコンピュータプログラムが提供されてもよく、コンピュータプログラムは、
メモリに保存されたデータへのアクセスを制御するためのメモリアクセスプログラムロジックと、
メモリの保護メモリ領域に保存されたデータの整合性を検証するためのメモリセキュリティプログラムロジックと
を含み、
メモリセキュリティプログラムロジックは、複数のノードを含むカウンタ整合性ツリーを維持するように構成され、各ノードは、保護メモリ領域の各データブロックに関連付けられた複数のカウンタを指定し、複数のノードは、カウンタ整合性ツリーのさらなるカウンタを提供する子ノードを保存するデータブロックにカウンタの少なくとも1つが関連付けられている少なくとも1つの親ノードと、カウンタ整合性ツリー以外のデータを保存するデータブロックにカウンタの少なくとも1つが関連付けられている少なくとも1つのリーフノードとを含み、
メモリセキュリティプログラムロジックは、保護メモリ領域のターゲットデータブロックへのアクセスに応答して、ターゲットデータブロックに関連付けられた保存済み認証コードと、ターゲットデータブロックおよびターゲットデータブロックに関連付けられているカウンタ整合性ツリーのターゲットカウンタに基づいて生成される計算された認証コードとを比較することによって、ターゲットデータブロックの整合性を検証するように構成され、
カウンタ整合性ツリーのノードの少なくとも1つは、少なくとも2つのカウンタ間で共有されるメジャーカウント値と、少なくとも2つのカウンタの各々に個別に指定されるそれぞれのマイナーカウント値との組み合わせとして各々定義される少なくとも2つのカウンタを指定する分割カウンタノードを含む。
本出願では、「…に構成される」という言葉は、装置要素が定義された動作を実行できる構成を有することを意味するために使用される。これに関連して、「構成」とは、ハードウェアまたはソフトウェアの相互接続の装置または方法を意味する。例えば、装置が、定義された動作を提供する専用のハードウェアを備えていることもあるし、プロセッサまたは他の処理デバイスが機能を実行するようにプログラムされていることもある。「に構成される」は、定義された動作を提供するために、装置要素を何らかの方法で変更する必要があることを意味するものではない。
本発明の例示的な実施形態を添付の図面を参照して本明細書で詳細に説明したが、本発明はそれらの正確な実施形態に限定されず、添付の特許請求の範囲によって定義される本発明の範囲および精神から逸脱することのなく当業者によって様々な変更および修正を行うことができることを理解されたい。