(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-06-28
(45)【発行日】2023-07-06
(54)【発明の名称】有界ポインタを記憶するための装置及び方法
(51)【国際特許分類】
G06F 12/14 20060101AFI20230629BHJP
G06F 21/55 20130101ALI20230629BHJP
G06F 9/34 20180101ALI20230629BHJP
【FI】
G06F12/14 510D
G06F21/55
G06F9/34 350A
(21)【出願番号】P 2020548712
(86)(22)【出願日】2019-02-11
(86)【国際出願番号】 GB2019050352
(87)【国際公開番号】W WO2019180401
(87)【国際公開日】2019-09-26
【審査請求日】2022-02-04
(32)【優先日】2018-03-19
(33)【優先権主張国・地域又は機関】GB
(73)【特許権者】
【識別番号】500395107
【氏名又は名称】アーム・リミテッド
(74)【代理人】
【識別番号】110000855
【氏名又は名称】弁理士法人浅村特許事務所
(72)【発明者】
【氏名】スミス、リー ダグラス
【審査官】小林 秀和
(56)【参考文献】
【文献】国際公開第2017/182770(WO,A1)
【文献】特開2001-051904(JP,A)
【文献】特開昭62-160554(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 12/14
G06F 21/55
G06F 9/34
(57)【特許請求の範囲】
【請求項1】
有界ポインタを記憶するための記憶素子を備える記憶装置であって、各有界ポインタが、ポインタ値、及び、少なくとも範囲情報を含む関連付けられた属性を有する、記憶装置と、
選ばれた記憶素子に有界ポインタを記憶するための処理回路機器であって、前記記憶することが、
前記選ばれた記憶素子に前記有界ポインタのポインタ値を記憶すること、
前記有界ポインタの読込み範囲と、前記読込み範囲とは異なる前記有界ポインタの書出し範囲の両方を前記有界ポインタの範囲情報が示すように、前記選ばれた記憶素子に前記有界ポインタの前記範囲情報を記憶することであって、
前記読込み範囲が、前記有界ポインタを使用するときに読込みが許可される少なくとも1つのメモリ・アドレスを含み、
前記書出し範囲が、前記有界ポインタを使用するときに書込みが許可される少なくとも1つのメモリ・アドレスを含む、
前記有界ポインタの前記範囲情報を記憶すること
を含む、処理回路機器と
を備える、装置。
【請求項2】
前記書出し範囲が、前記読込み範囲の正規のサブセットである、又は
前記読込み範囲が、前記書出し範囲の正規のサブセットである、
請求項1に記載の装置。
【請求項3】
前記範囲情報が、
1次範囲を定義する1次情報であって、前記1次範囲が、前記読込み範囲及び前記書出し範囲のうちの
一方であり、ベース・アドレスから限界アドレスまで広がる、1次情報と
2次情報であって、前記1次範囲及び前記2次情報に基づいて2次範囲が決定されることが可能であるような
前記2次情報であって、前記2次範囲が、前記読込み範囲及び前記書出し範囲
のうちの他方である、
前記2次情報と
を含む、請求項1又は2に記載の装置。
【請求項4】
前記1次情報が、前記1次範囲の前記ベース・アドレス、並びに、
前記1次範囲の前記限界アドレス、及び、
前記1次範囲のサイズ
のうちの1つを含む、請求項3に記載の装置。
【請求項5】
前記1次範囲の前記限界アドレスが、前記2次範囲の2次範囲限界アドレスである、又は
前記1次範囲の前記ベース・アドレスが、前記2次範囲の2次範囲ベース・アドレスである、
請求項3又は4に記載の装置。
【請求項6】
前記2次情報が、2次範囲ベース・アドレス及び2次範囲限界アドレスのうちの少なくとも1つが前記1次範囲の前記ベース・アドレス及び前記限界アドレスからどのように決定されるかを識別する、請求項3から5までのいずれかに記載の装置。
【請求項7】
前記2次情報が、セットされると、前記1次範囲の所定の部分を前記2次範囲が除外することを示すフラグである、請求項6に記載の装置。
【請求項8】
前記有界ポインタから導出されたアドレスへの最初の書出しより前に、前記フラグがセットされず、
前記処理回路機器が、前記最初の書出しの後、前記フラグをセットするように構成される、
請求項7に記載の装置。
【請求項9】
前記2次情報が、前記2次範囲の前記限界アドレスが前記1次範囲の前記限界アドレスによって制限されないことを示すフラグを含む、請求項6に記載の装置。
【請求項10】
前記有界ポインタの前記ポインタ値が、オブジェクトのアドレス空間内のメモリ・アドレスを識別し、前記アドレス空間内の位置が、前記オブジェクトが利用できるメソッドを識別するデータ構造を識別するポインタを記憶し、
前記読込み範囲が、前記データ構造への前記ポインタを含み、
前記書出し範囲が、前記データ構造への前記ポインタを除外する、
請求項1から9までのいずれかに記載の装置。
【請求項11】
前記データ構造が、前記オブジェクトが属するオブジェクト・クラスの仮想メソッド・テーブルである、請求項10に記載の装置。
【請求項12】
前記有界ポインタの前記ポインタ値が、オブジェクトのアドレス空間内のメモリ・アドレスを識別し、
前記アドレス空間の一部が、前記オブジェクトのメタデータを含み、
前記読込み範囲が、前記メタデータを含む前記一部を含み、
前記書出し範囲が、前記メタデータを含む前記一部を除外する、
請求項1から9までのいずれかに記載の装置。
【請求項13】
前記有界ポインタの前記属性が、前記有界ポインタを認証するための署名を含み、
前記メタデータが、前記署名を生成するときに使用されるソルト値を含む、
請求項12に記載の装置。
【請求項14】
前記アドレス空間を前記オブジェクトにアロケートするアロケータであって、前記アドレス空間への書出しアクセスを保つ、アロケータ
をさらに備え、
前記オブジェクトに前記アロケートされたアドレス空間を解放することを前記アロケータが決定すると、前記アロケータが、前記ソルト値を上書きするように構成される、
請求項13に記載の装置。
【請求項15】
前記有界ポインタの前記範囲情報が、
前記読込み範囲を定義する読込み範囲データと、
前記メタデータを収める前記アドレス空間の前記一部を前記書出し範囲が除外することを示す除外データと
を含む、請求項12から14までのいずれかに記載の装置。
【請求項16】
前記メタデータを収める前記アドレス空間の前記一部が、所定のサイズを有する、請求項12から15までのいずれかに記載の装置。
【請求項17】
前記有界ポインタの前記ポインタ値が、アプリケーションのスタック・フレーム内のメモリ・アドレスを識別し、前記スタック・フレームが、スタック内にあり、
前記読込み範囲が、前記スタック・フレーム、及び、前記スタックのさらなる部分を含み、
前記書出し範囲が、前記スタックの前記スタック・フレームに制限され、前記スタックの前記さらなる部分を除外する、
請求項1から9までのいずれかに記載の装置。
【請求項18】
前記範囲情報が、前記スタック・フレームのベース・アドレス、及び、前記スタック・フレームの限界アドレスを示し、
前記範囲情報が、前記スタック・フレームの前記限界アドレスが前記読込み範囲の限界アドレスでないことを示すフラグを含む、
請求項17に記載の装置。
【請求項19】
記憶装置の記憶素子に有界ポインタを記憶する方法であって、
前記有界ポインタのポインタ値を記憶するステップと、
前記有界ポインタの読込み範囲と、前記読込み範囲とは異なる前記有界ポインタの書出し範囲の両方を前記有界ポインタの範囲情報が示すように、前記有界ポインタの前記範囲情報を記憶するステップであって、
前記読込み範囲が、前記有界ポインタを使用するときに読込みが許可される少なくとも1つのメモリ・アドレスを含み、
前記書出し範囲が、前記有界ポインタを使用するときに書込みが許可される少なくとも1つのメモリ・アドレスを含む、
前記有界ポインタの前記範囲情報を記憶するステップと
を含む、方法。
【請求項20】
有界ポインタを記憶するための記憶素子手段を備える記憶手段であって、各有界ポインタが、ポインタ値、及び、少なくとも範囲情報を含む関連付けられた属性を有する、記憶手段と、
選ばれた記憶素子手段に有界ポインタを記憶するための処理手段であって、前記記憶することが、
前記選ばれた記憶素子手段に前記有界ポインタのポインタ値を記憶すること、
前記有界ポインタの読込み範囲と、前記読込み範囲とは異なる前記有界ポインタの書出し範囲の両方を前記有界ポインタの前記範囲情報が示すように、前記選ばれた記憶素子手段に前記有界ポインタの前記範囲情報を記憶することであって、
前記読込み範囲が、前記有界ポインタを使用するときに読込みが許可される少なくとも1つのメモリ・アドレスを含み、
前記書出し範囲が、前記有界ポインタを使用するときに書込みが許可される少なくとも1つのメモリ・アドレスを含む、
前記有界ポインタの前記範囲情報を記憶すること
を含む、処理手段と
を備える、装置。
【発明の詳細な説明】
【技術分野】
【0001】
本技法は、データ処理の分野に関する。
【背景技術】
【0002】
いくつかのデータ処理装置は、特定のアドレスを示すポインタが、ポインタが逆参照され得るアドレスの許容範囲を示す範囲情報と関連付けられた有界ポインタ(bounded pointer)をサポートすることがある。例えば、このようなポインタは、「ファット・ポインタ(fat pointer)」と呼ばれることがある。
【0003】
範囲情報に加えて、このような有界ポインタは、ポインタの使用について1つ又は複数の制限/許可を定義する他の関連付けられた属性を有することもある。許可を伴うこのような有界ポインタは、「能力(capabilities)」と呼ばれることが多く、したがって、このような有界ポインタの使用は、バウンダ・ポインタによって指定されたポインタ値がどのように使用されるかについて制約を課すことによって、強固なセキュリティをもたらすことができる。
【発明の概要】
【発明が解決しようとする課題】
【0004】
このような有界ポインタの汎用性を改善することが望ましいであろう。
【課題を解決するための手段】
【0005】
構成の1つの実例において、有界ポインタを記憶するための記憶素子を備える記憶装置であって、各有界ポインタが、ポインタ値、及び、少なくとも範囲情報を含む関連付けられた属性を有する、記憶装置と、選ばれた記憶素子に有界ポインタを記憶するための処理回路機器であって、前記記憶することが、選ばれた記憶素子に有界ポインタのポインタ値を記憶すること、有界ポインタの読込み範囲と、読込み範囲とは異なる有界ポインタの書出し範囲の両方を有界ポインタの範囲情報が示すように、選ばれた記憶素子に有界ポインタの範囲情報を記憶することであって、読込み範囲が、有界ポインタを使用するときに読込みが許可される少なくとも1つのメモリ・アドレスを含み、書出し範囲が、有界ポインタを使用するときに書込みが許可される少なくとも1つのメモリ・アドレスを含む、有界ポインタの範囲情報を記憶することを含む、処理回路機器とを備える、装置が提供される。
【0006】
構成の別の実例において、記憶装置の記憶素子に有界ポインタを記憶する方法であって、有界ポインタのポインタ値を記憶することと、有界ポインタの読込み範囲と、読込み範囲とは異なる有界ポインタの書出し範囲の両方を有界ポインタの範囲情報が示すように、有界ポインタの範囲情報を記憶することであって、読込み範囲が、有界ポインタを使用するときに読込みが許可される少なくとも1つのメモリ・アドレスを含み、書出し範囲が、有界ポインタを使用するときに書込みが許可される少なくとも1つのメモリ・アドレスを含む、有界ポインタの範囲情報を記憶することとを含む、方法が提供される。
【0007】
構成のさらなる実例において、有界ポインタを記憶するための記憶素子手段を備える記憶手段であって、各有界ポインタが、ポインタ値、及び、少なくとも範囲情報を含む関連付けられた属性を有する、記憶手段と、選ばれた記憶素子手段に有界ポインタを記憶するための処理手段であって、前記記憶することが、選ばれた記憶素子手段に有界ポインタのポインタ値を記憶すること、有界ポインタの読込み範囲と、読込み範囲とは異なる有界ポインタの書出し範囲の両方を有界ポインタの範囲情報が示すように、選ばれた記憶素子手段に有界ポインタの範囲情報を記憶することであって、読込み範囲が、有界ポインタを使用するときに読込みが許可される少なくとも1つのメモリ・アドレスを含み、書出し範囲が、有界ポインタを使用するときに書込みが許可される少なくとも1つのメモリ・アドレスを含む、有界ポインタの範囲情報を記憶することを含む、処理手段とを備える、装置が提供される。
【0008】
本技法は、添付の図面に示されるように、本技法の実例を参照しながら、単なる例証として、さらに説明される。
【図面の簡単な説明】
【0009】
【
図1】構成の1つの実例による、装置のブロック図である。
【
図2】有界ポインタ記憶要素のセット内のポインタ値をセット又はアクセスしようと試みる場合に、エラーがトリガされることがある命令のタイプの実例を示す図であり、ここでこのポインタ値は、関連付けられた範囲情報によって示される範囲の外側のアドレスを指定するために使用される。
【
図3】構成の1つの実例による、有界ポインタに関連したタグ・ビット(tag bit)の使用を示す図である。
【
図4】有界ポインタ又は能力にポインタ署名を追加するために使用されることがある署名作業、及び、ポインタ認証コードを伴う前記有界ポインタ又は能力のポインタ・フィールドが、偶然に又は悪意をもって変更されていないことを保証するために後で使用され得る対応する権限付与作業を概略的に示す図である。
【
図5A】実例による有界ポインタを概略的に示す図である。
【
図5B】実例による有界ポインタを概略的に示す図である。
【
図6】本開示の実例による方法を概説する流れ図である。
【0010】
いくつかの処理装置は、有界ポインタの使用をサポートすることができる。ポインタ自体は、例えば、アクセスされることになるデータ値のアドレス、又は実行されることになる命令のアドレスを指すことができ、又これらを判断するために使用されてもよい。しかしポインタは、ポインタを使用するときのアドレスの許容範囲を示す、関連付けられた範囲情報を有することもできる。このことは、例えば、セキュリティ、又は挙動の機能的妥当性を維持するために、ポインタから判断されたアドレスが、一定の境界内にとどまることを保証するために有用であることがある。例えば、一定の能力が所与の処理に対して定義され、定義された能力の外側で作業を実行しようと試みる場合にエラーをトリガすることができる、能力に基づくアーキテクチャへの関心が高まっている。有界ポインタのための範囲情報は、このようなアーキテクチャのために定義される能力情報の一部であってよく、能力に基づくアーキテクチャの内部で、このような有界ポインタは(その関連付けられた能力情報を含めて)、能力(capability)と呼ばれることがある。
【0011】
したがって、装置は、ポインタを使用するときのアドレスの許容範囲を示す性質をもつ関連付けられた範囲情報を有するポインタを記憶するために使用される記憶要素を有することができる。各有界ポインタ記憶要素は、レジスタ、又は汎用メモリ内の記憶場所、例えばスタック・メモリ上の場所であってよい。
【0012】
命令の動作中に要求されるメモリ内のアドレスを導き出すために使用されるポインタを取得するために、一定の命令が、このような有界ポインタ記憶要素を参照するために使用されることがある。ポインタは、メモリ・アドレスを識別するために直接、使用されてよく、又例えばオフセットをポインタ値に加えることによって、メモリ・アドレスを導き出すために使用されてもよい。
【0013】
本開示の実例は、有界ポインタの特定の使用法に応じて異なる範囲情報を適用することによって、有界ポインタの汎用性を改善することを目的とする。具体的には、所与のポインタと関連付けられた読込み範囲は、所与のポインタと関連付けられた書出し範囲と異なってもよい。これは、例えば、ポインタが指すことができるメモリ・アドレスの第1の範囲が、データが書き出されることが不可能な読込み専用範囲であることを可能にする。読込み及び書出しは、ポインタが指すことができるメモリ・アドレスの第2の範囲に許可されてもよい。メモリ・アドレスの第3の範囲は、読込みが許可されない書出し専用範囲であってもよい。本明細書で議論されるいくつかの実例において、このような範囲のサブセットは、例えば、読込み専用範囲が適用され、読書き範囲が適用されるが、書出し専用範囲が適用されないように適用される。同様に、他の実例において、読書き範囲及び書出し専用範囲が適用されるが、読込み専用範囲は適用されない。
【0014】
上述のように、装置のいくつかの実例は、有界ポインタを記憶するための記憶素子を備える記憶装置であって、各有界ポインタが、ポインタ値、及び、少なくとも範囲情報を含む関連付けられた属性を有する、記憶装置と、選ばれた記憶素子に有界ポインタを記憶するための処理回路機器とを備える。記憶するステップは、記憶素子に有界ポインタのポインタ値を記憶すること、及び、有界ポインタの読込み範囲と、読込み範囲とは異なる有界ポインタの書出し範囲の両方を有界ポインタの範囲情報が示すように、記憶素子に有界ポインタの範囲情報を記憶することを含むことができる。読込み範囲は、有界ポインタを使用するときに読込みが許可されるメモリ・アドレスの範囲であり、書出し範囲は、有界ポインタを使用するときに書込みが許可されるメモリ・アドレスの範囲である。
【0015】
したがって、範囲情報は、所与のポインタに対する、読込み範囲とは異なる書出し範囲を表すことができる。これは、単一の範囲だけが有界ポインタに適用される比較上のシステムに比べて、ポインタの汎用性を増加させ、さらなる粒度がこの範囲内に適用されることはない。このような汎用性の実例は、下記でより詳細に示される。例えば、本技法は、有界ポインタが有効に指すことができるメモリ・アドレスの所与の範囲が、有界ポインタの書出し範囲ではなく、読込み範囲にこれらのアドレスを含めることによって読込み専用として効果的に指名されることを可能にする。したがって、書出し範囲は、読込み範囲の正規のサブセット、即ち、読込み範囲に等しくない読込み範囲のサブセットであってもよい。これは、例えば、後でこのデータを変更することが望ましくない初期セットアップ動作中に、いくつかのデータが一旦定義される実例において特に役立つものである。このようなデータを読込み専用として指名することは、偶然に又は悪意をもってデータが変更されるのを防ぐ。したがって、本実例は、データを読込み専用として指名することができない比較上のシステムに比べて、堅牢性及び安全性が改善される。
【0016】
代替として又は追加として、ポインタが有効に指すことができるメモリ・アドレスの所与の範囲は、読込み範囲ではなく、書出し範囲にこれらのアドレスを含めることによって、書出し専用として指名されることが可能である。例えば、読込み範囲は、書出し範囲の正規のサブセットであってもよい。これは、機密性をもたらすことが望ましい実例において特に役に立つものである。例えば、2つのアプリケーションが互いに通信する場合、このような1つのアプリケーションは、メモリ・アドレスの所与の範囲を読み込むことを阻止される一方で、これらのアドレスに書き出すことは依然として許可され、それにもかかわらず、これらのアドレスは、このようなもう1つのアプリケーションには読込み可能であるということが望ましいことがある。
【0017】
有界ポインタを維持することに関連して記憶装置が必要になることを避けるため又は減らすために、有界ポインタのサイズを減らすことが望ましいことがある。このような状況では、効率的なエンコード及び/又は圧縮によって、範囲情報を表すのに必要なサイズを低減させることが望ましい。これを達成する方式の1つの実例において、範囲情報は、1次情報及び2次情報を含む。1次情報は、1次範囲を定義し、1次範囲は、読込み範囲及び書出し範囲のうちの1つであり、ベース・アドレスから限界アドレスまで広がる。2次情報は、1次範囲及び2次情報に基づいて2次範囲が決定されることが可能であるようなものであり、2次範囲は、読込み範囲及び書出し範囲以外のものである。このような実例は、範囲情報を表すのに必要なサイズを減らし、このことにより、読込み範囲及び書出し範囲が独立して表されるためのものであったアプローチに比べて、有界ポインタのサイズを減らすことができる。
【0018】
このような1つの実例において、1次情報は、1次範囲のベース・アドレス、並びに、1次範囲の限界アドレス、及び、1次範囲のサイズのうちの1つを含む。したがって、1次情報は、1次範囲の広がりを明確に定義する。
【0019】
いくつかの実例において、1次範囲の限界アドレスは、2次範囲の限界アドレスであり、その結果、1次範囲及び2次範囲は、限界アドレスを共有するが、異なるベース・アドレスを有することがある。この制約が適用される実例において、2次情報は、第2の範囲の限界アドレスを独立して表すことができず、したがって、1次範囲の記憶された限界アドレスについて情報が冗長になる。逆に、いくつかの実例において、1次範囲のベース・アドレスは、2次範囲の2次範囲ベース・アドレスであり、その結果、1次範囲及び2次範囲は、ベース・アドレスを共有するが、異なる限界アドレスを有することがある。この制約が適用される実例において、2次情報は、第2の範囲のベース・アドレスを独立して表すことができず、したがって、1次範囲の記憶されたベース・アドレスについて情報が冗長になる。これらの実例において、このことにより、範囲情報を記憶するのに必要なメモリは、このような冗長情報を含めないことによって減らされることが可能である。
【0020】
いくつかの実例において、2次情報は、2次範囲ベース・アドレス及び2次範囲限界アドレスのうちの少なくとも1つが、1次範囲のベース・アドレス及び限界アドレスからどのように決定されるかを識別する。例えば、1次範囲及び2次範囲がベース・アドレスを共有する場合、2次情報は、2次範囲のベース・アドレスではなく、2次範囲の限界アドレスを定義することができる。同様に、1次範囲及び2次範囲が限界アドレスを共有する場合、2次情報は、2次範囲の限界アドレスではなく、2次範囲のベース・アドレスを定義することができる。
【0021】
いくつかのシステムにおいて、1次範囲と2次範囲との間の差が予め定義されることが望ましい。例えば、有界ポインタの範囲の始めにある所与の数のバイトは、例えば、これらのバイトが、変更されることのない暗号データを含むので、読込み専用であることが時に望ましいことがある。このようないくつかの実例において、2次情報は、1次範囲の所定の部分を2次範囲が除外することを示すフラグである。したがって、フラグは、ポインタの範囲の始めにある所与の数のバイトが読込み専用であることを示すためにセットされること、又は、ポインタの範囲全体が書き出されること、及び読み込まれることを示すためにセットされないことが可能である。単一のビットであることが可能なフラグの使用は、第1の範囲から第2の範囲を定義するのに必要な情報を提供するための特に効率的なメカニズムを提供する。構成の1つの実例において、有界ポインタによる最初の書出しより前に、フラグはセットされない。その後、フラグは、最初の書出しの後、セットされてもよい。これは、所定の部分に書き出すための最初の書出しを、この部分を初期化するために可能にし、所定の部分は、その後の書出しから除外されることになり、初期化後、さらなる書出しは許可されない。能力ベースのシステムの一定の実例において、能力は、拡大されるのではなく、縮小されることが可能である。したがって、このような実例において、フラグは、一旦セットされると、外すことはできない。
【0022】
他の実例において、2次情報は、1次範囲の限界アドレスによって2次範囲の限界アドレスが制限されないことを示すフラグを含む。例えば、1次範囲及び2次範囲は、ベース・アドレスを共有することができ、一方で、1次範囲は、限界アドレスを有するが、2次アドレスは限界アドレスを有さない。1次範囲が書出し範囲であり、2次範囲が読込み範囲である場合、このことは、書出しが所与の範囲に制限されることを可能にするが、システム内で何らかのさらなる制約を受けた、ベース・アドレスを超える任意のメモリ・アドレスに対して読込みが許可される。例えば、ポインタがアプリケーションと関連付けられる場合、メモリ・スタック内のいずれかのメモリ・アドレスを読み込むことができるが、スタック・フレーム内のメモリ・アドレスへの書出しを許可するだけであることが望ましいことがある。いくつかの実例において、読込み範囲は、例えば、所与のアプリケーションと関連付けられたスタックの外側にあるメモリ・アドレスへのいずれのアクセスも禁止することによって、他のシステム・メカニズムによって効果的に限定されてもよい。
【0023】
いくつかのより具体的な実例が次に議論されることになる。これらの実例は、
図1から9を参照しながら、より詳細に下記で説明される。
【0024】
1つの実例において、有界ポインタのポインタ値は、オブジェクトのアドレス空間内のメモリ・アドレスを識別する。前記アドレス空間内の位置は、前記オブジェクトが利用できるメソッドを識別するデータ構造を識別するポインタを記憶する。ポインタは、例えば、有界ポインタであってもよい。このようなデータ構造の実例は、前記オブジェクトが属するオブジェクト・クラスの仮想メソッド・テーブルである。読込み範囲は、データ構造への前記ポインタを含み、書出し範囲は、データ構造への前記ポインタを除外する。このことは、ポインタが読込み専用であることを可能にし、その結果、ポインタは、(例えば、ソフトウェア・バグの結果として)偶然に又は(例えば、前記オブジェクトのクラス定義に属するメソッド以外のメソッドを実行させようと)悪意をもって、望まれないメモリ・アドレスへのリダイレトを行わせるために変更されることが不可能である。
【0025】
別の実例において、有界ポインタのポインタ値は、オブジェクトのアドレス空間内のメモリ・アドレスを識別し、前記アドレス空間の一部は、オブジェクトのメタデータを含む。例えば、有界ポインタの属性は、有界ポインタを認証するための、暗号署名などの署名を含むことができ、メタデータは、さらに、前記署名を生成するときに使用されるソルト値を含むことができる。読込み範囲は、メタデータを含む前記一部を含み、書出し範囲は、メタデータを含む前記一部を除外する。したがって、例えば暗号ソルトといったメタデータは、読込み専用にされることが可能であり、このことにより、偶然の又は悪意のある不正行為の可能性を減らす。いくつかの実例において、前記メタデータは、さらなるメタデータへのポインタ、又はこのようなメタデータが識別されるのを可能にする他のデータを含む。例えば、前記メタデータは、前述の暗号ソルトへのポインタであってもよい。
【0026】
このような1つの実例において、アロケータは、アドレス空間をオブジェクトにアロケートし、アドレス空間への書出しアクセスを保つ。アロケータは、例えば、プロセッサ回路機器上で実行するソフトウェアによって実現されてもよい。オブジェクトにアロケートされたアドレス空間を解放することをアロケータが決定すると、アロケータは、ソルト値を上書きするように構成される。したがって、アドレス空間が解放された後にソルトを使用してオブジェクトへのポインタを認証しようとする試みは失敗するはずであり、このことにより、use-after-free攻撃に対する抵抗力をもたらす。
【0027】
有界ポインタの範囲情報は、さらに、読込み範囲を定義する読込み範囲データと、メタデータを収めるアドレス空間の前記一部を書出し範囲が除外することを示す除外データとを含む。上記で議論された他の実例と同様に、これは、最初の書出しの後の、メタデータの偶然の又は故意の悪意のある変更に対する抵抗力をもたらす。
【0028】
メタデータを収めるアドレス空間の前記一部は、所定のサイズを有してもよい。例えば、メタデータは、8バイトの大きさの暗号ソルトであってもよい。したがって、2次範囲情報は、ソルトに対応する8バイトが書出し範囲から除外されることになるかどうかを示した、例えば単一のビットといったフラグを含むことができ、このことにより、この情報を効率的に表す。
【0029】
別の実例において、有界ポインタのポインタ値は、アプリケーションのスタック・フレーム内のメモリ・アドレスを識別し、スタック・フレームは、スタック内にある。この実例において、読込み範囲は、スタック・フレーム、及び、スタックのさらなる部分を含み、書出し範囲は、スタックのスタック・フレームに制限され、スタックのさらなる部分を除外する。したがって、有界ポインタが対応する所与のアプリケーションは、例えばスタックの全体を読み込むことを許可されることが可能である一方で、スタック・フレームに書き出すことが許可されるが、スタック・フレームの外側に書き出すことは禁止される。
【0030】
このような1つの実例において、範囲情報は、スタック・フレームのベース・アドレス、及び、スタック・フレームの限界アドレスを示す。範囲情報は、スタック・フレームの限界アドレスが読込み範囲の限界アドレスでないことを示すフラグを含む。したがって、スタック・フレームの広がりによって読込み範囲が制限されないはずであるということは、例えば単一のビットによって、効率的に表されることが可能である。読込み範囲は、アプリケーションと関連付けられたポインタが、スタックを超えたいずれかのメモリ・アドレスにアクセスすることを防ぐメカニズムなど、他のシステム・メカニズムによって、例えばスタックの広がりに制限されることが可能である。
【0031】
これから、図を参照しながら特定の実例を説明する。
【0032】
図1は、命令を処理するための処理パイプライン4を備えるデータ処理装置2の実例を概略的に示す。この例において、処理パイプライン4は、フェッチ・ステージ6、デコード・ステージ8、発行ステージ10、実行ステージ12、及びライト・バック・ステージ14を含めたいくつかのパイプライン・ステージを含むが、ステージの他のタイプ又は組合せが設けられてよいということが理解されよう。例えば、いくつかの実装形態において、レジスタのリネームを行うためのリネーム・ステージが含まれてよい。処理されることになる命令はステージ間を移動し、命令が1つのステージで保留状態である間、別の命令がパイプライン4の異なるステージで保留状態であってよい。
【0033】
フェッチ・ステージ6は、レベル1(L1)命令キャッシュ20から命令をフェッチする。フェッチ・ステージ6は通常、連続的な命令アドレスから命令を順次にフェッチすることができる。しかし、フェッチ・ステージは、分岐命令の結果を予測するための分岐予測器22を有してもよく、フェッチ・ステージ6は、分岐が行われると予測される場合には(連続していない)分岐先アドレスから、又は分岐が行われないと予測される場合には次の連続したアドレスから命令をフェッチすることができる。分岐予測器22は、一定の分岐が行われる可能性があるか否かを予測するための情報を記憶するための1つ又は複数の分岐履歴テーブルを含むことができる。例えば、分岐履歴テーブルは、以前、実行された分岐の実際の結果を追跡するため、又は分岐に対して行われた予測の信頼度を表すためのカウンタを含むことができる。同じ分岐命令に後で遭遇した時に宛先アドレスが予測され得るように、分岐予測器22は、分岐命令の以前の宛先アドレスをキャッシュするための分岐先アドレス・キャッシュ(BTAC:branch target address cache)24を含むこともできる。
【0034】
フェッチされた命令は、命令をデコードしてデコードされた命令を生成するデコード・ステージ8に渡される。デコードされた命令は、適正な処理作業を実行するために、実行ステージ12を制御するための制御情報を有することができる。キャッシュ20からフェッチされたさらに複雑ないくつかの命令に対して、デコード・ステージ8は、これらの命令を、マイクロ・オペレーション(μops又はuops)として知られることがある複数のデコードされた命令にマップすることができる。したがって、L1命令キャッシュ20からフェッチされた命令と、パイプラインのその後のステージでみられるような命令との間に1対1の関連性はなくてもよい。一般に、本出願における「命令」への言及は、マイクロ・オペレーションを含むものとして解釈されるべきである。
【0035】
デコードされた命令は、命令の実行のために要求されるオペランドが利用できるかどうかを判断し、オペランドが利用できるときに実行のために命令を発行する、発行ステージ10に渡される。いくつかの実装形態は、L1命令キャッシュ20から命令がフェッチされたプログラム順に対応する順序で実行に対して命令が発行されるように、イン・オーダー(in-order)処理をサポートすることができる。その他の実装形態は、アウト・オブ・オーダー(out-of-order)実行をサポートすることができ、その結果、命令は、プログラム順とは異なる順序で実行ステージ12に対して発行することができる。初めの方の命令がオペランドを待ちながら停止されている間、オペランドが利用できるプログラム順での後の命令が、最初に実行されることが可能になるので、アウト・オブ・オーダー処理は、パフォーマンスの改善に役立つ可能性がある。
【0036】
発行ステージ10は、様々なデータ処理作業を行うために命令が実行される実行ステージ12に対して命令を発行する。例えば、実行ステージは、整数値に対する算術又は論理演算を行うための算術/論理ユニット(ALU:arithmetic/logic unit)30、浮動小数点形式で表される値に対する演算を行うための浮動小数点(FP:flaoting-point)ユニット32、及びレベル1(L1)データ・キャッシュ36からレジスタ40にデータ値をロードするためのロード作業、又はレジスタ40からL1データ・キャッシュ36にデータ値を記憶するための記憶作業を行うためのロード/記憶ユニット34を含めた、多くの実行ユニット30、32、34を含むことができる。これらは、提供され得る実行ユニットのタイプに関する単なるいくつかの実例にすぎず、他の多くの種類も提供され得るということが理解されよう。処理作業を行うために、実行ステージ12は、レジスタ40のセットからデータ値を読み込むことができる。実行された命令の結果は次に、ライト・バック・ステージ14によってレジスタ40に書き戻されてよい。
【0037】
L1命令キャッシュ20及びL1データ・キャッシュ36は、複数のレベルのキャッシュを含むキャッシュ階層の一部であってよい。例えば、レベル2(L2)キャッシュ44が提供されることもあり、任意選択でさらなるレベルのキャッシュが提供されることもある。この例において、L2キャッシュ44は、L1命令キャッシュ20とL1データ・キャッシュ36の間で共有されるが、その他の実例は、別々のL2命令キャッシュ及びL2データ・キャッシュを有することができる。フェッチされることになる命令がL1命令キャッシュ20の中にないとき、命令は、L2キャッシュ44からフェッチされてよく、同様に、命令がL2キャッシュ44の中にない場合、命令は、メイン・メモリ50からフェッチされてよい。同様に、ロード命令に応答して、データは、命令がL1データ・キャッシュ36の中にない場合、L2キャッシュ44からフェッチされてよく、必要に応じてメモリ50からフェッチされてもよい。任意の既知の方式が、キャッシュ階層を管理するために使用されてよい。
【0038】
プログラム命令及びデータ値を参照するためにパイプライン4によって使用されるアドレスは、仮想アドレスであってよいが、少なくともメイン・メモリ50、及び任意選択で、少なくともいくつかのレベルのキャッシュ階層も、物理的にアドレス指定されてよい。したがって、パイプライン4によって使用される仮想アドレスを、キャッシュ又はメモリにアクセスするために使用される物理アドレスに変換するために、トランスレーション・ルックアサイド・バッファ52(TLB:translation lookaside buffer)が提供されることがある。例えば、TLB52は、対応するページ内の仮想アドレスを物理アドレスに変換するために、仮想アドレス空間の対応するページの仮想ページ・アドレス、及び仮想ページ・アドレスがマップされるべき、対応する物理ページ・アドレスをそれぞれが指定する、いくつかのエントリを含むことができる。例えば、仮想及び物理ページ・アドレスは、対応する仮想及び物理アドレスのうちの最上位部分に対応してよく、残りの最下位部分は、仮想アドレスを物理アドレスにマップしても、変化しない状態を保つ。アドレス変換情報と同様に、各TLBエントリは、アドレスの一定のページが、パイプライン4の一定のモードでアクセスできるかどうかを示すなどの、アクセス許可を指定するいくつかの情報を含んでもよい。いくつかの実装形態において、TLBエントリは、読込み又は書出し動作に応答してキャッシュ階層のどのレベルが更新されるか(例えば、ライト・バック又はライト・スルー・モードでキャッシュが動作すべきかどうか)を定義するキャッシュ・ポリシ情報、又はパイプライン4によってデータ・アクセスが発行された順序と比較して、対応するページ内のアドレスへのデータ・アクセスが、メモリ・システムによって並べ替えられてよいかどうかを定義する情報などの、アドレスの対応するページに関するその他のプロパティを定義することもできる。
【0039】
図1は単一レベルTLB52を示すが、レベル1(L1)TLB52が、最近アクセスされた多くのページ内のアドレスを変換するための複数のTLBエントリを含むことができ、レベル2(L2)TLBが、多くのページに対するエントリを記憶するために提供され得るように、複数のTLBの階層が提供されてよいということが理解されよう。要求されたエントリがL1 TLBに存在しないとき、L2 TLBから、又は階層内のさらなるTLBから、フェッチされてよい。アクセスされることになるページに対する要求されたエントリがTLBのいずれにもない場合、メモリ50内のページ・テーブルにアクセスするために、ページ・テーブル・ウォーク(page table walk)が行われてよい。任意の既知のTLB管理方式が本技法において使用されてよい。
【0040】
また、例えば、仮想アドレスを中間アドレスに変換するために第1のTLB(又はTLBの階層)が使用され、次に、1つ又は複数のさらになるTLBを使用する第2レベルのアドレス変換が、中間アドレスを、キャッシュ又はメモリにアクセスするために使用される物理アドレスに変換できるように、いくつかのシステムは、複数レベルのアドレス変換をサポートすることができるということが理解されよう。これは、例えば、第1レベルのアドレス変換がオペレーティング・システムによって管理され、第2レベルのアドレス変換がハイパーバイザによって管理されることがある仮想化をサポートするのに役立つことがある。
【0041】
図1に示されるように、装置2は有界ポインタ・レジスタ60のセットを有することができる。有界ポインタ・レジスタのセットは、汎用データ・レジスタ40のセットとは物理的に別個のものとして
図1に示されるが、1つの実装形態において、汎用データ・レジスタと有界ポインタ・レジスタの両方を提供するために同じ物理記憶が使用されてよい。
【0042】
各有界ポインタ・レジスタ60は、アクセスされることになるデータ値のアドレス、及び対応するポインタ62を使用するときのアドレスの許容範囲を指定する範囲情報64を判断するために使用されることがあるポインタ値62を含む。有界ポインタ・レジスタ60は、ポインタの使用に関する1つ又は複数の制限/許可を定義することができる制限情報66(本明細書では許可情報とも呼ばれる)を含むこともできる。例えば制限66は、ポインタ62を使用できる命令のタイプ、又はポインタが使用され得るパイプライン4のモードを制限するために使用されてよい。したがって、範囲情報64及び制限情報66は、ポインタ62を使用することが許される能力を定義すると見なされてよい。定義された能力の外側でポインタ62を使用するという試みが行われると、エラーがトリガされることがある。範囲情報64は、例えば、ポインタが一定の既知の境界内にとどまり、取扱いに注意を要し又セキュアな情報を収める可能性がある、メモリ・アドレス空間の他のエリアに迷い込まないことを保証するのに有用なことがある。汎用データ・レジスタと有界ポインタ・レジスタの両方に対して同じ物理記憶装置が使用される実例において、1つの実装形態において、ポインタ値62は、例えば、対応する汎用レジスタに対して使用されるのと同じ記憶位置内に記憶されてよい。
【0043】
図2は、データ又は命令への不正アクセスから保護するために許容範囲が使用される命令のタイプの実例を示す。表現の簡略化のために、
図2は、読込み範囲及び書出し範囲が別個であるのとは対照的に、読込み及び書出しの両方に対応する1つの範囲だけを示す。
図2の上部に示されるように、特定の有界ポインタ・レジスタPR1は、所与のポインタ値62、並びにこの例において、許容範囲の下限を定義する下限アドレス68と許容範囲の上限を定義する上限アドレス69とを使用して指定される範囲情報64を含む。例えば、アドレスの範囲80000~81000を定義するように境界68、69がセットされる。一定の命令が有界ポインタ・レジスタPR1を参照し、ポインタ62から判断されるアドレスがこの範囲の外側にあるとき、エラーがトリガされてよい。
【0044】
例えば、
図2の部分Aに示すように、いくつかのシステムにおいて、ポインタ・レジスタ60内のポインタ62の値を、範囲情報64によって指定された範囲の外側にある値にセットしようと試みる場合、エラーがトリガされてよい(ここで、ポインタがアドレスを直接指定すると想定する)。これは、ポインタを使用するいずれのアクセスも、認められる範囲の中に間違いなくあることが保証され得るように、ポインタ62が指定範囲の外側のいずれかの値をとることを回避する。あるいは、
図2の部分Bに示すように、ポインタ62のアドレスが指定範囲の外側にあるときに、ポインタ62のアドレスによって識別される場所に命令がアクセスしようと試みるとき、エラーがトリガされてよい。したがって、ポインタ62を指定範囲の外側の値にセットすることが依然として許容可能であってよいが、このポインタ・アドレス(又はこのポインタから導き出されたアドレス)でのデータ・アクセスが試みられると、このアドレスが許容される範囲の外側にある場合、エラーがトリガされてよい。その他のシステムは、
図2の部分A及びBに示される命令のタイプの両方に応答して、エラーをトリガしてもよい。
【0045】
範囲情報64は、異なる方法で設定されてもよい。例えば、セキュアなコード、又はオペレーティング・システム若しくはハイパーバイザが、所与のポインタに認められる範囲を指定することができる。例えば、インストラクション・セット・アーキテクチャは、所与のポインタ62に対する範囲情報64をセット又は修正するための多くの命令を含むことができ、これらの命令の実行は、一定のソフトウェア又はプロセッサ4の一定のモード若しくは例外状態に制限されることがある。範囲情報64をセット又は修正するための任意の既知の技法が使用されてもよい。
【0046】
ポインタを参照する一定の命令を実行する実行状態12で使用されることがある有界ポインタ記憶要素60のセットに加えて、レベル1命令キャッシュ20から命令がフェッチされているフェッチ・ステージ6で類似の機能を提供するために、プログラム・カウンタ能力(PCC:program counter capability)レジスタ80が使用されてもよい。具体的には、有界ポインタ記憶要素60のセットにおいてポインタのそれぞれと共に提供される範囲及び制限情報に類似の、範囲情報84及び任意の適正な制限情報86もPCC80が提供する状態で、プログラム・カウンタ・ポインタがフィールド82に記憶されてよい。
【0047】
図3は、個別のデータ・ブロックが、能力(即ち有界ポインタ及び関連付けられた制限情報)を表すか、又は通常のデータを表すかを識別するために、個別のデータ・ブロックと関連して、どのようにタグ・ビットが使用されるかを概略的に示す。具体的には、メモリ・アドレス空間110は、典型的には指定されたサイズを有する一連のデータ・ブロック115を記憶する。単なる例証のために、この例において、各データ・ブロックが128ビットを有すると想定する。各データ・ブロック115と関連して、1つの例においてタグ・ビットと呼ばれるシングル・ビット・フィールドである、タグ・フィールド120が提供され、タグ・ビットは、関連付けられたデータ・ブロックが能力を表すことを識別するためにセットされ、又は、関連付けられたデータ・ブロックが通常のデータを表し、したがって能力として扱われることがないことを示すためにクリアされる。セットされた状態又はクリアされた状態と関連付けられる実際の値は、実装形態に応じて変えることができるが、単なる例証のために、1つの実例において、タグ・ビットが値1を有する場合、これは、関連付けられたデータ・ブロックが能力であることを示し、タグ・ビットが値0を有する場合、これは、関連付けられたデータ・ブロックが通常のデータを収めることを示すということが理解されよう。
【0048】
図3に示される能力レジスタ100などの、(本明細書では能力レジスタとも呼ばれる)有界ポインタ・レジスタ60のうちの1つに、能力がロードされると、タグ・ビットは能力情報と共に移動する。したがって、能力レジスタ100に能力がロードされると、ポインタ102、範囲情報104、及び(以下に許可情報と呼ばれる)制限情報106は、能力レジスタにロードされる。さらに、この能力レジスタと関連して、又はこの中の特定のビット・フィールドとして、タグ・ビット108は、内容が能力を表すことを識別するためにセットされる。同様に、能力がメモリに戻されて記憶されると、能力が記憶されるデータ・ブロックと関連して、関連するタグ・ビット120がセットされる。このようなアプローチによって、能力と通常のデータを区別し、したがって通常のデータが能力として使用され得ないということを保証することができる。
【0049】
図4は、無署名の能力を署名済み能力に変換するために使用されることがある署名作業、及びその後、署名済み能力を変換して無署名の能力に戻すために使用されることがある対応する権限付与作業を概略的に示す図である。(無署名有界ポインタとも呼ばれる)無署名の能力150が、署名作業のための入力オペランドとして提供され、能力150は、ポインタ部155と属性部160を有する。無署名の能力内に提供されるポインタ値の使用が許されることを示す性質をもつ様々な許可情報と共に、ポインタ部155にポインタ値が指定され、属性部160に範囲情報が指定される。例えば、どのタイプのオペレーションに対してポインタが参照されるのを許すか、したがって、例えば、ロード又は記憶することになるデータを識別するため、フェッチされることになる命令を識別するためなどに、ポインタを使用することができるかどうかを、許可情報は、識別することができる。さらに、先に議論されたように、情報の関連付けられたブロックが能力を表すことを識別するためにセットされるタグ・ビット165が提供される。能力のサイズは、実装形態に応じて変えられてよいが、能力が128ビットを有する、先に説明された実例と一致してよく、したがって、1つの実装形態において、ポインタ部155は64ビット有してよく、属性部160も64ビットを有してよい。
【0050】
無署名の能力を署名済み能力に変換するために使用される暗号署名機能170は、署名済み能力を形成するために追加されることになる署名を導き出すために使用される多くの入力を受け取る。具体的には、機能170は暗号署名キーにアクセスでき、さらにソルト値(salt value)にアクセスできる。ソルト値は、様々な形式をとることができるが、1つの実例において、合法的に署名済み能力を無署名化する必要があり、したがって、署名済み能力に関しては、権限付与作業を正常に行うことができるはずである、1つのタスク又は複数のタスクに対してしか利用できないコンテキスト情報(contextual information)を表す。コンテキスト情報は、様々な形式をとることができるが、1つの実例において、例えば、合法的に署名済み能力に権限付与することを望む1つのタスク又は複数のタスクにしか知られていないスタックの場所であってよい。
【0051】
さらに、機能170は、ポインタ部155に記憶されるポインタ値の少なくとも一部を受け取る。1つの実装形態において、ポインタ値は、一定数の一意のポインタ・ビットを有することが予期され、残りの最上位ビットは、一意のポインタ・ビットの署名拡張版(したがって、一意のポインタ・ビットのうちの最上位ビットに応じて、全て1若しくは全て0)、又は一意のポインタ・ビットのゼロ拡張版(即ち全て0)である。1つの実例において、ポインタ値の一定数の最上位ビット内のこの本質的に冗長な情報は、以前に生成された署名を挿入する場所として使用され、これにより、情報のいかなる損失もなく、署名済み能力に署名が組み込まれることを可能にする。1つの代替実例において、この処理は、例えば属性部160のいくつかのビット内といった、能力の別の部分に署名を挿入するように構成されてよい。実装形態のさらなる実例において、無署名の能力内に充分な未使用ビットがあり、署名値を保持するために署名済み能力の中でそれらの未使用ビットを使用することが可能であるということを符号化することがあり得る。
【0052】
図4に示される実例において、ポインタ部155の上位ビット、具体的には、全て1又は全て0を収めるセクションに、署名が挿入されることが想定される。
図4に示される実例において、ポインタ値の全体が、署名機能170への入力として依然として使用され、本明細書でハッシュとも呼ばれる署名を生成するために、このポインタ値、暗号署名キー、及びソルト値を使用して暗号署名機能が行われている。任意の適切な暗号署名機能が、このために使用されることがある。
【0053】
1つの代替実例において、この処理は、ポインタ値全体ではなく暗号署名機能170への入力として、一意のポインタ・ビットだけが使用されるように構成されてよい。どのアプローチが取られるかに関係なく、署名済み能力の中のポインタ値の上位部分に署名が追加される場合、署名フィールド(即ち、署名で上書きされることになるポインタ値の部分)が、一意のポインタ・ビットの署名拡張版又はゼロ拡張版を収めるように、このポインタが「標準(canonical)」であることを保証するためのチェックを、説明された実例の処理は行う。これは次に、署名済み能力を作成する有効な署名処理とこれに続くこの署名済み能力の無署名版を作成する有効な権限付与処理が、元の無署名の能力150に対応する、結果として生じる無署名版を、もたらすことを保証する。このチェックが行われ得る多くの方法がある。例えば、1つの実装形態において、署名する前にこの条件が真であることを保証するためにチェックが行われる。あるいは、元の能力を権限付与された能力(即ち、署名済み能力を認証した後に作成される能力)と比較するために、署名処理後のテスト認証が機能170に組み込まれることがある。
【0054】
図4に示されるように、署名が作成されると、署名は、署名済み能力175の部分176のセクション179に挿入される。次に、部分176のセクション177に一意のポインタ・ビットが保持される。許可部分180に、能力175が署名済み能力であることを識別するためにセットされる署名フィールド182が設けられ、さらに、関連付けられた128ビットのデータが能力を表すことを示すために、セットされた状態でタグ・ビット185が保持される。このことは、別個の署名フィールド182を設けることによって、提供された入力された能力が無署名の能力であるか又は署名済み能力であるかに応じて、一定のリクエストされた作業が異なる振舞いをすることを可能にする。このことは、例えば、署名済み能力に関して一定のアクションが行われるのを装置が防ぐことを可能にし、それによってさらに拡張されたセキュリティをもたらす。
【0055】
図4の下部に示されるように、署名済み能力175を無署名化しようとするために、権限付与機能190が起動されてよい。最初に一意のポインタ・ビット177が識別され、次に署名機能170が実行されたときに使用された元のポインタ値を生成するために、署名拡張作業192が行われる。元のポインタ値がゼロ拡張型フォーマットで表された場合、ステップ192でゼロ拡張化作業が代わりに行われる。さらに、署名機能170への入力として一意のポインタ・ビットだけが使用された場合、署名拡張作業又はゼロ拡張作業はステップ192では要求されず、代わりに一意のポインタ・ビットが権限付与署名生成機能195に直接、提供されることがある。
【0056】
図4に示されるように、権限付与署名生成機能195は、暗号署名キー及びソルト値にアクセスすることもできる。暗号署名機能170によって使用されたのと同じソルト値(即ちコンテキスト情報の同じ項目)に権限付与署名生成機能195がアクセスできない限り、署名済み能力のセクション179に挿入された署名にマッチする権限付与署名を生成することは、全くありそうにないということが理解されよう。
【0057】
関連するポインタ・ビット、暗号署名キー、及びソルト値を使用して権限付与署名生成機能195によって生成される権限付与署名は次に、比較ブロック198に入力され、ここで権限付与署名は、署名済み能力のセクション179に保持されている署名と比較される。マッチする場合、権限付与は合格したと考えられ、署名済み能力175の無署名版が生成される。そうでなければ、失敗状態が識別され、所定のアクションが行われる。
【0058】
権限付与チェックが合格すると想定すると、セクション179から署名を削除し、当初のポインタ値を再作成するために、セクション177内の一意のポインタ・ビットの署名拡張版(又は実装形態によっては、ゼロ拡張版)で置き換えることによって、無署名の能力が作成される。さらに、現時点で能力が無署名であることを識別するために、署名情報182はクリアされる。
【0059】
署名フィールド182は様々な形式をとることができる。1つのアプローチによれば、能力が無署名であることを第1の値が示し、能力が署名済みであることを第2の値が示す、専用のシングル・ビットの署名フィールドが提供される。この実例において、値が論理値1にセットされるとき、これは能力が署名済みであることを示し、その一方で値が論理値0にクリアされる場合、これは能力が無署名であることを示すということが想定される。しかし、種々の実装形態において、署名フィールド182内の論理値0と論理値1の意味が逆転されてもよいということが理解されよう。
【0060】
他のアプローチによれば、専用のシングル・ビットの署名フィールドは提供されない。このようないくつかのアプローチでは、下記で述べられるように、全て1又は全てゼロを通常収めるはずのポインタの上位ビットに署名が挿入される。したがって、ポインタが署名されるか否かは、全ての上位ビットが同じ値を有するか否かから推測されることが可能である。
【0061】
図5A及び
図5Bは、本開示の実例による有界ポインタ505、510を概略的に示す。
【0062】
図5Aに示されたポインタ505は、例えば、
図2に関して上述されたように、ポインタ値515を含む。ポインタ505は、範囲及び許可情報520をさらに含む。範囲及び許可情報520は、読込みと書出しの両方を、ポインタ505が有効に指すことができるメモリ・アドレスをエンコードする。読込み範囲は、書出し範囲と異なる、又は同じものとして定義されることが可能である。
【0063】
範囲及び許可情報520は、1次範囲525を定義するデータを含み、1次範囲は、読込み範囲及び書出し範囲のうちの1つである。例えば、1次範囲は、ベース・アドレス及び限界アドレス、又は、ベース・アドレス及び範囲サイズとして表されてもよい。範囲及び許可情報520は、2次範囲が決定されることが可能な2次情報530をさらに含む。2次範囲は、読込み範囲及び書出し範囲以外のものである。いくつかの実例において、2次情報530は、例えば、ベース・アドレス及び限界アドレスとして、1次範囲の表現と同様に、2次範囲を表す。他の実例において、2次情報530は、2次範囲を明確に定義しないが、代わりに、例えば、本明細書の他の場所でより詳細に説明されるようなデータを含み、このデータに基づいて1次範囲から2次範囲が導出される。
【0064】
図5Bに示されたポインタ510は、ポインタ505のポインタ値515に類似のポインタ値535を含む。ポインタ510は、例えば、ポインタ505の範囲及び許可情報520と同様に、読込み範囲及び書出し範囲を定義する範囲情報540を含む。ポインタ510は、別個の許可フィールド545を含む。許可フィールド545は、例えば、上記で
図1を参照しながらより詳細に説明されたように、ポインタ510に適用される許可又は制限を定義する。
【0065】
図6は、本開示の実例による方法600を概説する流れ図である。
【0066】
ブロック605において、アロケータ、即ちメモリ・アロケータは、オブジェクトのためのアドレス空間をアロケートする。例えば、アドレス空間は、メモリ・アドレスの連続範囲であってもよい。
【0067】
ブロック610において、アロケータは、能力、即ち有界ポインタを作り出す。能力を作り出すことは、意図した読込み範囲及び書出し範囲を決定することを含み、このことに基づいて、1次範囲及び2次範囲の情報及び許可を指定する。読込み範囲及び書出し範囲は、オブジェクト、及び/又は、オブジェクトと関連付けられたアプリケーションの特定の特性に基づいて決定されてもよく、この特定の実例が下記でより詳細に説明される。
【0068】
ブロック615において、アロケータは、オブジェクトを使用することになるアプリケーションに能力を返す。本実例において、能力は、能力が有効に指すことができるメモリ・アドレスの範囲全体にわたる読込みと書出しの両方を最初に可能にする。例えば、いくつかの実例において、2次情報は、セットされると、読込み範囲の特定の部分が書き込まれることが不可能であることを示すフラグである。したがって、能力は、このように書出し範囲が最初に制限されないように、このフラグがセットされない状態で作り出されることが可能である。
【0069】
ブロック620において、アプリケーションは、読込み範囲の前述の特定の部分に書き出す。例えば、アプリケーションは、暗号ソルトなど、一旦書き出されると不変であることを意図されたデータを書き出すことができる。この書出しの後、アプリケーションは、読込み範囲の特定の部分を読込み専用として制限する能力を縮小する。例えば、2次情報が、上述のような最初にセットされないフラグである場合、縮小することは、フラグを設定することを含むことができる。このような1つの実例において、フラグは、セットされないとき0、及び、セットされるとき1のバイナリ値を有し、その結果、フラグをセットすることは、1を書き出して0を上書きすることを含む。1つの実例において、能力が望まれるが、決して拡大されない限り、縮小することを、ハードウェア(例えば、方法600を実行するプロセッサのアーキテクチャ)は保証する。言い換えれば、ハードウェアは、1次範囲及び/又は2次範囲を減らすことを許可するが、決して拡大されない。
【0070】
ブロック625において、その後の読込み及び書出し動作が行われる。これらの動作は、例えば、能力が有効に指すことができるメモリ・アドレスの範囲全体にわたって読込みが許可されるが、読込み専用範囲内で書出しが許可されないように、1次範囲情報及び2次範囲情報でエンコードされた読込み範囲及び書出し範囲に基づいて制御される。
【0071】
技法600の1つの特定の用途の実例が次に、
図7を参照しながら説明されることになる。
【0072】
この実例において、有界ポインタ705は、
図5Aに関して上述されたように、ポインタ値710、並びに、範囲及び許可情報715を含む。範囲情報715は、オブジェクト720に対応するメモリ・アドレス内のアドレスを作り出すために、ポインタ705が使用されるのを許可する。言い換えれば、ポインタは、オブジェクト720に対応するメモリ・アドレスの範囲内でメモリ・アドレスについてのアドレス識別子710を有効に作り出すために使用されることが可能である。
【0073】
オブジェクト720に対応するメモリ・アドレスの範囲は、ベース・アドレスC.BASE725、及び限界アドレスC.LIMIT730の観点から定義されることが可能である。ベース・アドレス725は、オブジェクト720に対応する第1のアドレスであり、限界アドレス730は、オブジェクト720の終わりを超えたバイトのアドレスである。
【0074】
暗号ソルト735は、オブジェクト720に対応するメモリ空間の始めのメモリ・アドレスの範囲に記憶され、暗号ソルト735に基づいて、ポインタ705は署名740で署名される。このようなポインタ署名の実例が、
図4を参照しながら上述されている。ポインタ705に署名した後、ポインタ705は、ソルト735を使用して権限付与されることが可能である。
【0075】
範囲及び許可情報715は、オブジェクト720のメモリ空間内、且つ、ソルト735の外部の(
図7に実線で示された)メモリ・アドレスを作り出すために、ポインタ705が読込み動作と書出し動作の両方のために使用されることが可能になるように、読込み範囲及び書出し範囲745、750を定義するためにセットされる。範囲及び許可情報715は、(
図7に断続線で示された)ソルト735を収めるアドレス範囲内のメモリ・アドレスを作り出すために、ポインタ705が書出し動作ではなく読込み動作のために使用されることが可能になるようにさらにセットされる。言い換えれば、ソルト735は読込み専用である。これは、偶然の又は悪意をもったソルトの変更に対する抵抗力をもたらすことによって信頼性を改善し、ソルト735を使用して、署名された有界ポインタ705に権限付与しようとする試みを失敗させるはずである。
【0076】
実例として、ソルトは、所定のサイズを有してもよい。例えば、ARMv8.3アーキテクチャ内でポインタ705が実現される場合、ソルトは、8バイトの所定のサイズを有することができる。範囲及び許可情報715は、さらに、ベース・アドレス725及び限界アドレス730の明確な定義、並びに、最初の8バイトが書出し領域から除外されるべきかどうかを示すフラグによって、読込み範囲及び書出し範囲を表すことができる。
【0077】
いくつかの実例において、ポインタ705は、オブジェクト720に対応するメモリ範囲全体にポインタが書き出せるように、範囲及び許可情報715で最初に作り出される。言い換えれば、範囲の一部は、最初、読込み専用ではない。ポインタ705は、ソルト735を書き出すために使用され、その後、ソルト735が読込み専用になるように、書出し範囲を縮小するために、範囲及び許可情報715がセットされる。例えば、ソルトが所定のサイズを有し、範囲及び許可情報715が、ソルトが書出し領域から除外されるべきかどうかを示すフラグを含む場合、フラグは、最初にセットされなくてもよく、その後、ソルトの最初の書出し後にセットされる。
【0078】
代替として又は追加として、オブジェクト720に対応するメモリ空間が解放されると、(ポインタ705の範囲及び許可情報715によって制限されない)アロケータは、ソルト735に対応するメモリ・アドレスを上書きする。例えば、アドレスは、ゼロで上書きされることが可能である。ポインタ705に権限付与しようとするその後の試みは、その後、有界ポインタに署名するときに使用される値をソルトがもはや有していないはずなので、失敗するはずである。これは、オブジェクト720に対応するメモリ空間を解放した後、悪意のあるエンティティが、ソルト735に以前に対応したメモリ空間にアクセスしようとするuse-after-free攻撃に対する抵抗力をもたらす。
【0079】
技法600のさらなる特定の用途の実例が次に、
図8を参照しながら説明されることになる。
【0080】
この実例において、有界ポインタ805は、
図5Aに関して上述されたように、ポインタ値810、並びに、範囲及び許可情報815を含む。ポインタは、アプリケーションに関連付けられ、スタック・フレーム825を含むスタック820内のメモリ・アドレスを指す。
【0081】
範囲情報815は、スタック・フレーム・ベース830に等しい書出し範囲ベース、及び、スタック・フレーム限界835に等しい書出し範囲限界をエンコードし、このことにより、スタック・フレーム825の広がりをカバーするものとして書出し範囲を定義する。範囲情報815は、書出し範囲限界によって読込み範囲が限定されるかどうかについてのフラグなどの指示をさらに含む。したがって、フラグがセットされていないとき、読込み及び書出しは、スタック・フレーム825内のメモリ・アドレスに対して許可されるが、スタック・フレームの外側のメモリ・アドレスに対して禁止される。逆に、フラグがセットされていると、読込み範囲は、書出し範囲のベース(即ち、スタック・フレーム・ベース830)に等しいベースを有するが、特定の読込み限界は有さない。したがって、読込みは、スタック・フレーム825を超えるスタック820のメモリ・アドレスに対して許可される。
【0082】
いくつかの実例において、範囲及び許可情報815は、読込み範囲限界を具体的に定義しないが、(例えば、プロセッサ又はシステム・アーキテクチャにおいて定義される)他のシステム・メカニズムは、スタック820の外側の記憶場所にアクセスするためにポインタ805が使用されるのを防ぐ。したがって、ポインタ805は、スタック820の広がりに等しい効果的な読込み範囲を有する。
【0083】
したがって、本実例は、アプリケーションが(点線矢印によって示された)アプリケーションのスタックの全体を読み込むのを許可するために使用されることが可能であるが、(実線矢印によって示された)アプリケーションのスタック・フレームに書き出すことしかできないということが理解されよう。これは、異なる読込み範囲及び書出し範囲を有する単一の有界ポインタ805によって達成される。これは、記憶装置及び処理能力の観点から、読込み及び書出しのために別個の有界ポインタが定義されるアプローチよりかなり効率的である。
【0084】
技法600のさらなる特定の用途の実例が次に、
図9を参照しながら説明されることになる。
【0085】
この実例において、有界ポインタ905は、
図5Aに関して上述されたように、ポインタ値910、並びに、範囲及び許可情報915を含む。範囲情報915は、オブジェクト920に対応するメモリ・アドレスをポインタ905が指すことを許可する。言い換えれば、ポインタ値910は、オブジェクト920に対応するメモリ・アドレスの範囲内のメモリ・アドレスを作り出すために有効に使用されることが可能である。
【0086】
オブジェクト920に対応するメモリ・アドレスの範囲は、ベース・アドレスC.BASE925及び限界アドレスC.LIMIT930の観点から定義されることが可能である。ベース・アドレス925は、オブジェクト920に対応する第1のアドレスであり、限界アドレス930は、オブジェクト920の終わりを超えたバイトのアドレスである。
【0087】
仮想メソッド・テーブル又はv-テーブル940へのポインタ935は、オブジェクト920に対応するメモリ空間の始めに記憶される。当業者によって理解されるように、v-テーブル940は、オブジェクト920が利用できるメソッドのテーブルである。例えば、v-テーブル940は、オブジェクト920がインスタンスであるクラスのオブジェクト上で動作することができる各メソッドへのポインタのテーブルであってもよい。
【0088】
範囲及び許可情報915は、オブジェクト920のメモリ空間内、且つ、(
図9に実線で示された)v-テーブル・ポインタ935の外部のメモリ・アドレスを作り出すために、ポインタ905が読込み動作と書出し動作の両方のために使用されることが可能になるように、読込み範囲及び書出し範囲945、950を定義するためにセットされる。範囲及び許可情報915は、(
図9に断続線で示された)v-ポインタ935に関連付けられた範囲内のメモリ・アドレスを作り出すために、ポインタ905が書出し動作ではなく読込み動作のために使用されることが可能になるように、さらにセットされる。言い換えれば、v-テーブル・ポインタ935は、読込み専用である。これは、v-テーブル・ポインタの変更に対する抵抗力をもたらすことによって信頼性を改善する。これは、例えば、v-テーブル940内のメソッド以外のメソッドを実行させるために、v-テーブル940以外のメモリ・アドレスを指すようにv-テーブル・ポインタが変更される悪質な攻撃に対する回復力を改善する。
【0089】
v-テーブル・ポインタ935は、所定のサイズを有することができる。このような実例において、範囲及び許可情報は、
図7に関して上述されたものと同様に、読込み範囲の広がりの明確な定義、及び、所定のサイズの領域が書出し範囲から除外されるべきかどうかを示すフラグを含むことができる。このようなフラグを利用するいくつかの実例において、フラグは最初にセットされず、その結果、ポインタ905が、v-テーブル・ポインタ935の最初の書出しを行うために使用されることが可能になる。最初の書出しの後、フラグは、
図7に関して上述されたものと同様にセットされることが可能である。
【0090】
上述の技法の使用を通じて、単一の有界ポインタは、異なる読込み範囲及び書出し範囲を表現することができるということが理解されよう。これは、例えば、ポインタを介してアクセスされることが可能な少なくともいくつかのデータが、最初の書出しにおいて一度書き出され、さらに、その後、変更されないことが望まれる広い範囲の用途において、信頼性及び安全性を改善することができる。本明細書で説明される方法は、このようなデータが、最初の書出しの後、読込み専用に変えられることを可能にする。
【0091】
本明細書で説明される方法は、ハードウェア及び/又はソフトウェアで実行されてもよい。このようなハードウェアは、汎用プロセッサ、又は、特定用途向け集積回路若しくはフィールド・プログラマブル・ゲート・アレイなどのより具体的なユニットであってもよい。
【0092】
本発明の例証的な実例が添付の図面を参照しながら本明細書で詳細に記述されたが、本発明は、これらの正確な実例に限定されないということ、並びに様々な変更、追加、及び修正は、添付の特許請求の範囲によって定義されるような本発明の範囲及び精神から逸脱することなく、当業者によって本発明の中で行われてよいということを理解されたい。例えば、従属請求項の特徴の様々な組合せが、本発明の範囲から逸脱することなく、独立請求項の特徴と共に行われてよい。