(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2025-05-12
(45)【発行日】2025-05-20
(54)【発明の名称】ハードウェアサポートされたメモリバッファオーバーフロー検出を備えるプロセッサ
(51)【国際特許分類】
G06F 9/34 20180101AFI20250513BHJP
G06F 9/355 20180101ALI20250513BHJP
【FI】
G06F9/34 340C
G06F9/355 390
(21)【出願番号】P 2020573096
(86)(22)【出願日】2019-03-18
(86)【国際出願番号】 US2019022673
(87)【国際公開番号】W WO2019178584
(87)【国際公開日】2019-09-19
【審査請求日】2022-03-17
【審判番号】
【審判請求日】2024-02-20
(32)【優先日】2018-03-16
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】507107291
【氏名又は名称】テキサス インスツルメンツ インコーポレイテッド
(74)【代理人】
【識別番号】100098497
【氏名又は名称】片寄 恭三
(72)【発明者】
【氏名】エリック ニュートン シェレブ
(72)【発明者】
【氏名】エリック ティエリ ペーテルス
(72)【発明者】
【氏名】ペル トーステイン ロイン
【合議体】
【審判長】吉田 美彦
【審判官】須田 勝巳
【審判官】脇岡 剛
(56)【参考文献】
【文献】特表2001-511271号公報(JP,A)
【文献】米国特許出願公開第2006/0225135(US,A1)
【文献】特開平06-168145号公報(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 9/34
G06F 9/355
(57)【特許請求の範囲】
【請求項1】
プロセッサであって、
プログラム命令を実行する回路要素であって、各プログラム命令がそれぞれのプログラムアドレスを有する位置にストアされている、前記プログラム命令を実行する回路要素と、
実行されるべきプログラム命令のプログラムアドレスの表示をストアする回路要素と、
複数のスタックストレージスペースを含むメモリスタックであって、各スタックストレージスペースがリターンアドレスとしてプログラムアドレスを受け取るように動作可能である、前記メモリスタックと、
それぞれのスタックストレージスペースに対応する複数の書き込み保護インジケータと、
障害を生成する回路要素と、
を含み、
前記障害を生成する回路要素は、
前記複数の書き込み保護インジケータからの値がフェッチされ得るキャッシュメモリと、
命令バス、トレースインターフェース信号または他のハードウェアからの信号に基づき前記メモリスタックへのプロセッサ読出しまたはプロセッサ書き込みを検出する検出部
と、
を含み、
前記障害を生成する回路要素は、リターンアドレスの書込みに対応する前記プロセッサ書き込みに応答して前記スタックストレージスペースにリターンアドレスを書き込むとともに対応する書込み保護インジケータを設定し、
前記障害を生成する回路要素は、選択されたスタックストレージスペースへのプロセッサ書き込み要求を受信し、当該スタックストレージスペースに対応する書き込み保護インジケータがキャッシュメモリ内で利用可能である場合、キャッシュヒットが発生し、書き込み保護インジケータが選択されたスタックストレージスペースが書き込み保護されていないことを示す場合、書き込み要求は実行され、書き込み保護インジケータが選択されたスタックストレージスペースが書き込み保護されていることを示す場合、プロセッサ書き込みに対して障害を生成する、
プロセッサ。
【請求項2】
請求項1に記載のプロセッサであって、前記選択されたスタックストレージスペースがリターンアドレスをストアしている場合に、前記それぞれの書き込み保護インジケータが、前記選択されたスタックストレージスペースが書き込み保護されていることを示す、プロセッサ。
【請求項3】
請求項1に記載のプロセッサであって、
前記メモリスタックが前記複数の書き込み保護インジケータを更に含む、プロセッサ。
【請求項4】
請求項1に記載のプロセッサであって、
前記複数のスタックストレージスペースにおける各スタックストレージスペースが、
前記リターンアドレスを含み得るデータをストアする第1の部分と、
前記複数の書き込み保護インジケータにおけるそれぞれの書き込み保護インジケータとして動作可能である第2の部分と、
を含む、プロセッサ。
【請求項5】
請求項4に記載のプロセッサであって、
前記第2の部分が単一のビットで構成される、プロセッサ。
【請求項6】
請求項4に記載のプロセッサであって、
前記第2の部分が単一の最下位ビットで構成される、プロセッサ。
【請求項7】
請求項4に記載のプロセッサであって、
前記第1の部分が2
Nビットで構成されるセットから選択され、Nが4又はそれ以上の整数である、プロセッサ。
【請求項8】
請求項4に記載のプロセッサであって、
前記第2の部分が単一のビットで構成され、
前記第1の部分が2
Nビットで構成されるセットから選択され、Nが4又はそれ以上の整数である、プロセッサ。
【請求項9】
請求項1に記載のプロセッサであって、
前記メモリスタックが、前記複数の書き込み保護インジケータをストアする少なくとも1つのストレージスペースを更に含む、プロセッサ。
【請求項10】
請求項9に記載のプロセッサであって、
前記複数のスタックストレージスペースにおける各スタックストレージスペースが2
Nビットで構成され、Nが4又はそれ以上の整数である、プロセッサ。
【請求項11】
請求項1に記載のプロセッサであって、
前記実行されるべきプログラムアドレスの表示をストアする回路要素がプログラムカウンタを含む、プロセッサ。
【請求項12】
請求項1に記載のプロセッサであって、
前記障害を生成する回路要素が、更に、前記選択されたスタックストレージスペースにリターンアドレスを上書きすることを禁止する、プロセッサ。
【請求項13】
請求項1に記載のプロセッサであって、
前記複数の書き込み保護インジケータの各々が単一のビットで構成される、プロセッサ。
【請求項14】
請求項1に記載のプロセッサであって、
前記障害を生成する回路要素は、前記検出部によって検出されたプロセッサ読出しが、リターンアドレスを読み出すためのポップ動作か否かを判定し、ポップ動作の場合、リターンアドレスのスタックストレージに対応する書込み保護インジケータにより書込み保護をクリアする、プロセッサ。
【請求項15】
請求項1に記載のプロセッサであって、
前記メモリスタックが複数のメモリスタックにおける第1のメモリスタックを含み、前記複数のメモリスタックにおける各メモリスタックがそれぞれの複数のスタックストレージスペースを含み、
前記プロセッサが、前記複数のメモリスタックの各それぞれのメモリスタックに対する複数の書き込み保護インジケータを更に含み、
前記生成する回路要素が、選択されたスタックストレージスペースへのプロセッサ書き込みに応答して障害を生成し、前記選択されたスタックストレージスペースに対して、前記複数の書き込み保護インジケータのそれぞれ1つにおけるそれぞれの書き込み保護インジケータが前記選択されたスタックストレージスペースが書き込み保護されていることを示す、プロセッサ。
【発明の詳細な説明】
【技術分野】
【0001】
本願は、全般的に、プロセッサ(マイクロプロセッサ、デジタル信号プロセッサ、及びマイクロコントローラ等)に関し、特に、望ましくないメモリバッファオーバーフローから保護するためのハードウェアサポートを備えるプロセッサに関する。
【背景技術】
【0002】
プロセッサは、通常はスタックと呼ばれるメモリの一部を含むか又はメモリの一部に対するアクセスを有する。スタックには、コールスタック、実行スタック、プログラムスタック、及びその他の付加的な表記が用いられることもある。用語「スタック」の根拠の一部はメモリ部分が後入れ先出しであるためであり、情報がメモリに追加されると、既にそこに存在する既存の情報にその情報を集計(aggregate)して付加情報をスタックし、その後、その情報がメモリから除去されると、集計された情報のスタックを減少させる。また、この文脈において、スタックに付加された情報は通常、例示の目的で、スタックの「頂部」に位置するものを示すが、実際には、幾つかのアーキテクチャでは、スタックを含むメモリエリアは、増加するメモリアドレスを用いてアドレスされ得、他のアーキテクチャでは、減少するメモリアドレスが用いられる。後者の場合でも、最小アドレスはスタックの「頂部」とみなされる。
【0003】
スタックにストアされる情報の主要なタイプは、実行可能なプログラミングコードのシーケンスにおけるポイントを表すアドレスである。より詳細には、通常、コードがプロセッサによって実行されているとき、しばしばプログラムカウンタと呼ばれるレジスタなどのメモリストアが、現在実行されている命令のそれぞれのメモリアドレスをストアする。プログラムカウンタは、概してコードが順次に実行されるため、そのように名付けられている。プログラムカウンタは、カウント、即ち増分することができ、それによって、前回実行された命令のアドレスの直後のアドレスにおいて次の命令の実行に進み、コードの特定のブロックに対しても同様である。しかしながら、実行可能命令のこのタイプの連続アドレス指定における種々の点において、シーケンスにおける変更が所望され得、それは、「呼び出す(call)」、「分岐する(branch)」、「ジャンプする(jump)」又は、その他の命令を含み得るシーケンス変更命令によって達成される。これにより、現在実行されている命令に続く次の順次アドレスではないアドレスを持つターゲット命令に実行シーケンスを向ける。ターゲット命令は、ルーチン又はサブルーチンと呼ばれることもある他の命令のグループの一部であり得る。アドレス指定を順次様式を継続する以外のものに変更することになるシーケンス変更(例えば、呼び出し)命令に関連して、1つの一般的なアプローチでは、スタックに対してプログラムカウンタの現在又は次の増分値がストアされ(しばしば、「プッシュされる」と呼ばれる)、そのため、ターゲットルーチンが完了した後、アドレスフローは、その呼び出しの前に生じていたシーケンスに戻される。即ち、命令シーケンスは、そのルーチンに対する呼び出しに続く次の命令に「リターン」する。或いは、幾つかのアーキテクチャ(アドバンストRISCマシン(ARM)等)は、スタックに対してプログラムカウンタを直ちにプッシュせず、その代わり、呼び出された関数が別の関数を呼び出す(又は呼び出し得る)場合にのみ、リターンアドレスがレジスタにストアされ、リターンレジスタの値は、その後、スタックにプッシュされる。いずれにしても、アドレスがスタックにプッシュされると、呼び出しが発生したときにスタックにプッシュされたアドレスを取得することによって、呼び出しに続くリターンが達成され得、その値はスタックからポップされたと言われ、これにより、それを除去し、その結果、スタックの頂部は、スタック上の次の最下位ワードに移動される。上記の説明は、最終的にルーチンが、単一の呼び出しに続くシーケンスに続くアドレスに直接戻る、ルーチンに対する単一の呼び出しのみを想定している。しかしながら、第1のルーチンが、アクティブであるとき及びその完了以前に、第2のルーチンを呼び出すことがあり、その場合、この後者の呼び出しは、付加的なリターンアドレスをスタックに対して再びプッシュする。付加的なプログラムカウンタアドレスは、呼び出された第2のルーチンの完了時にプログラムフローが戻るべき実行可能命令アドレスを識別する。このように、(リターンの前の)2つの連続呼び出しの例において、スタック上には、第1のルーチンが呼び出されたときのプログラムリターンアドレスが存在し得、その上に、第2のルーチンが呼び出されたときのプログラムリターンアドレスが存在し得る。このようなプロセスが、複数のルーチンの間で繰り返され得、そのため、スタックは、付加的な呼び出し毎に付加的な新規のアドレスを受け取り、そのため、連続して呼び出される各ルーチンからリターンが実行されると、付加された各アドレスが連続してポップされる。従って、スタックは、各それぞれのルーチンが呼び出されると、各呼び出されたルーチンを最終的に完了するための、及び実行アドレスをリターンするための表示を提供する。
【0004】
上記で説明してきたように、スタック技術は長い間、実行可能命令フローを制御する健全な手法を提供してきたが、不幸な副産物は、スタック内のプログラムカウンタアドレスが、適正な実行可能なコードフローを再確立するために必要とされる前に上書きされる場合の、スタックの意図しない欠陥、又はスタックに対する故意の攻撃であった。例えば、スタックは通常、ストレージ位置の有限数によって提供される最大容量を有する。従って、アドレスが最大容量を超えて書き込まれると、スタックオーバーフローが発生したと言われ、例えば、システム上で実行されているソフトウェア(例えば、オペレーティングシステム)等を介して、又は「スタックレジスタの頂部」を介して、その事象が認識されると、不安定な挙動又は報告される欠陥が発生する。「スタックレジスタの頂部」は、幾つかのハードウェアアプローチにおいて、最上部のスタック位置を示すために用いられ、従って、その位置を超えたことを検出するためにも使用可能である。別の例として、プログラムカウンタアドレスに加えて、或るアーキテクチャでは、通常は一時的に、データをストアするためにスタックが用いられる。そのようなストレージ位置は通常「スタックフレーム」又は「呼び出しフレーム」と呼ばれる。このようなフレームは通常、アーキテクチャ及び/又はアプリケーションバイナリインタフェース(ABI)固有であるが、それは、しばしば、呼び出された関数に対する任意の一時的なデータスペースと共に、呼び出された関数に対するパラメータ及びリターンアドレスを含む。従って、この場合、スタック内の付加的なメモリ位置がそのスタックフレームのために一時的に予約される。それは、ストアされたリターンアドレスの近くであるか又はストアされたリターンアドレスを含み、スタックメモリスペース内である。バッファがその意図されたサイズを超えて充填された場合、そのような充填は、現在又は前のスタックフレームにストアされた有効なリターンアドレス及び/又はデータを上書きし得る。
【0005】
上記の説明に加えて、「ハッキング」或いはコンピューティングシステムに対するその他の妨害の目的で、プロセッサの制御を取得しその意図された動作を損なわせるような種々の邪悪な攻撃技法が進化してきた。その結果、比較的良好な動作から重要な機能性の損傷やセキュリティ違反までを含み得る種々の結果をもたらしてきた。この点において、スタックオーバーフローは、そのような攻撃の一般的なツールであり、「スタック破壊(smashing the stack)」と呼ばれることもある。この場合、「ハッカー」は、プログラム制御を、適正な動作スタックリターンアドレスではない位置に移動させるように試みる。これは、例えば、有効なリターンアドレスを異なる不正なアドレスで上書きすることによって達成され得る。それによって、プログラムフローは、スタックに戻る際、不正なアドレスをポップし、実行可能フローを他の命令に向ける。そのような他の命令はまた、システムに悪意的にロードされ得、それによって、スマッシュに続いて実行され得る。或いは、ハッカーはまた、ガジェットと呼ばれることもある有効な既存のコードのサブセット又は抜粋を用いることを学習している。そこでは、異なるガジェットを順次縫い合わせることによって、更なる不快な結果に到達し得る。それにより、各ガジェットのそれぞれの機能性を組み合わせて、ハッカーが実装した、システムにおいてもともと設計された意図されない機能又は結果の達成が目指される。この後者のアプローチは、各ガジェットがそれぞれのリターンで終了するので、リターン志向プログラミング(ROP)と呼ばれることもある。各ガジェットの終了時のリターンは、スタックからリターンアドレス(即ち、バッファオーバーフローを介してハッカーが書き込んだ代替アドレス)をポップさせる。これによって、プロセッサに実行を継続させ、その代替アドレスの次からスタートさせる。それは、従って、別のガジェットのスタートを開始させる。それは、その後、複数のそのようなガジェットで繰り返され得る。実際、この問題においてガジェットの使用は、ハッカーを、所謂チューリング(数学者アラン・チューリングにちなんで名づけられた)完全性に近づかせるか或いはそれに到達させる。これは、概して、任意の単一テーピングされたチューリングマシンをシミュレートするため、即ち、そのようなアルゴリズムのセット内の全てのアルゴリズムを達成するために、充分なデータ操作動作を提供することを意味する。それは、緩い解釈において、幅広い機能を達成する能力を意味する。
【0006】
上述のように、従来のソフトウェア及びハードウェア(例えば、データ実行防止(DEP))技術は、バッファ/スタックにおける上書きされたリターンアドレスを介するプログラム制御フローの意図しない及び/又は悪意ある指示変更を防止及び/又は検出するように試みる。しかしながら、そのようなアプローチは1つ又は複数の欠点を有し、そういった欠点には、(a)オーバーヘッドコストが高い、(b)開発者が新規ツールを実装又は習得する必要がある、(c)膨大なテストが必要である、(d)再コンパイル及び/又はソースコード変更が必要であり、それらは、第三者ライブラリーの場合必ずしも可能ではない、及び(e)ハッカーが、DEPの回避策としてROPを含む従来のアプローチの周囲の手法を発見している、等がある。このように、スタックオーバーフローに対する従来のソフトウェア緩和技法は種々のニーズに貢献しているが、改善は可能である。
【発明の概要】
【0007】
例示の実施形態において、プロセッサが、(a)プログラム命令を実行するための回路要素であって、各プログラム命令がそれぞれのプログラムアドレスを持つ位置にストアされている回路要素と、(b)実行されるべきプログラム命令のプログラムアドレスの表示をストアするための回路要素と、(c)複数のスタックストレージスペースを含むメモリスタックであって、各スタックストレージスペースがリターンアドレスとしてのプログラムアドレスを受け取るように動作可能であるメモリスタックと、(d)それぞれのスタックストレージスペースに対応する複数の書き込み保護インジケータと、(e)選択されたスタックストレージスペースに対してプロセッサ書き込みが向けられたことを検出することに応答して障害(fault)を生成するための回路要素であって、選択されたスタックストレージスペースに対して、複数の書き込み保護インジケータにおけるそれぞれの書き込み保護インジケータが、選択されたスタックストレージスペースが書き込み保護されていることを示す回路要素とを含む。
【図面の簡単な説明】
【0008】
【
図1】例示の実施形態のプロセッサの電気的及び機能的ブロック図を示す。
【0009】
【
図2】
図1のBOVP回路l8
BOVP及びスタック24
STKの更に詳細なブロック図を示す。
【0010】
【
図3】
図1のプロセッサ10の動作の例示の実施形態の方法300のフローチャートを示す。
【0011】
【
図4a】
図3の方法300の応用例におけるスタック24
STKを示す。
【
図4b】
図3の方法300応用例におけるスタック24
STKを示す。
【
図4c】
図3の方法300の応用例におけるスタック24
STKを示す。
【
図4d】
図3の方法300の応用例におけるスタック24
STKを示す。
【
図4e】
図3の方法300の応用例におけるスタック24
STKを示す。
【
図4f】
図3の方法300の応用例におけるスタック24
STKを示す。
【0012】
【
図5】
図2のブロック図を示すが、スタックに対する代替実施形態を備える。
【0013】
【
図6】
図2の内部メモリ24及びWP管理ブロック32の別の実施形態の実装の電気的及び機能的ブロック図を示す。
【発明を実施するための形態】
【0014】
図1は例示の実施形態のプロセッサ10の電気的及び機能的ブロック図を示す。プロセッサは、本明細書に説明される機能を含む種々の計算回路の1つであり、そのため、それはマイクロプロセッサ、デジタル信号プロセッサ、マイクロコントローラなどのいずれかを含み得る。プロセッサ10は、種々の従来のブロック及び例示の実施形態の改善を含み、それらの各々をこれ以降に説明する。
【0015】
プロセッサ10は、通常、
図1において適切なブロックによって示されるように、単一の集積回路デバイス12として実装される。そのブロック内において(又は区切られ得るように個別に)、プロセッサ10は、概して、制御ユニット14、アルゴリズム論理ユニット(ALU)16、及びメモリユニット18を含む、3個の主ブロックを含み、各ブロックは、
図1に示すように、バスBへの双方向結合によって互いに通信し得る。バスBはまた、外部入力デバイス20からデータを受け取り、データを外部出力デバイス22に提供するように接続される。また、メモリユニット18は、バスB
M1を介して内部メモリ24と、バスB
M0を介して外部メモリ26と通信し得る。より詳細には、制御ユニット14は、他のブロックの起動及び動作を制御し、一般に、通常は、あり得るソースコード及び/又はオペレーティングシステムソフトウェアを含む何らの上位レベルのプログラミングに応答して、実行可能コードの命令のシーケンスを起こす。従って、この点において、制御ユニット14はまた、プロセッサ10のどこかに実現され得るプログラムカウンタ14
PCの汎用表示を含むように図示されている。従って、制御ユニット14は、特定のプログラムによって定義されたシーケンスに従って、また潜在的に他の効率対策(例えば、予測技術等)を用いて、内部メモリ24(例えば、RAM、ROM)又は外部メモリ26(例えば、フラッシュ)のいずれかから、メモリユニット18にプログラム命令をフェッチさせ得る。メモリユニット18によってフェッチされた命令は、ALU 16に関連する1つ又は複数の実行パイプラインに提供される。そこでは、再び制御ユニット14の制御下で命令が実行されて、データ移動、並びに論理及び数学的演算が達成され、それらの結果は、内部メモリ24又は外部メモリ26のいずれかにおけるストレージのために、再びメモリユニット18に戻される。広義では、上述の命令及びデータの入力/出力はまた、入力デバイス20からのそのような情報の受け取りと、出力デバイス22に対するそのような情報の提供との組み合わせで成され得る。最後に、プロセッサ10のこの説明は、プロセッサアーキテクチャの広義の概観である。しかしながら、プロセッサは、処理アーキテクチャ、接続性、及び機能性に関連して、種々の他の態様を含み得るか又は含むように特徴付けられ得る。
【0016】
図1の他の態様において、下記の説明は、プロセッサ10の例示の実施形態の改善への導入を提供する。具体的には、内部メモリ24は、内部メモリ24におけるメモリスペースの専用部分であるメモリスタック24
STKを含むように図示され、そこでは、スタックにストアされるワード数は、アーキテクチャ、アプリケーションバイナリインタフェース(ABI)、及び特定のアプリケーションコードに従って幅広く変化し得る。また、ワード幅は、CPUアーキテクチャ(例えば、N≧4の場合、16ビット、32ビット、64ビット等の2
Nビット)によって定義される。また、スタック24
STKは、概して、プログラムカウンタl4
PCから又はプログラムカウンタl4
PCに関連して(直接的に又は中間レジスタを介して)プッシュされたアドレスを受け取るため、及び、そのようなアドレスの、直接的に又はリターンレジスタ(例えば、ARMプロセッサにおけるリンクレジスタ)を介して、スタックからプログラムカウンタl4
PCに戻るポッピングを促進するために、存在し、機能する。それにより、プログラム実行フローを、プッシュされたアドレスを発生させた命令に続く次の命令を戻し、一方で、他の情報が、一時的にストアされ得、スタックメモリスペースから容易にアクセスされ得る、或る程度のバッファスペースを提供する。また、
図1は、例えば、単一のスタック24
STKのみを示す。これは、システムは1つ以上のそのようなスタックを含み、そこでは、各スタックはメモリの領域であり、多くのシステムにおいて、任意の箇所で開始又は終了し得るためである。例えば、通常、各スレッドがそれ自体のスタックを持つリアルタイムオペレーティングシステム(RTOS)を用いている場合、複数スタックが一般的である。
【0017】
図1の最後に、例示の実施形態について、スタック24
STK(他のスタックも同様)は、メモリユニット18の一部として示されるバッファオーバーフロー保護(BOVP)回路18
BOVPと関連して構成され及び/又は動作する。特に、以下に説明するように、BOVP回路l8
BOVPとスタック24
STKとの組み合わせは、特にスタック24
STK上でのリターンアドレスの直接的又は偶然的な上書き値に対して、強化されたハードウェア保護を提供する。そのような上書きは、ミス(例えば、C又はC++におけるもの等の或るコードの間違った使用)、又は、スタックを計画的に破壊(smash)することを目指す意図的なハッキング攻撃によって生じ得る。
【0018】
図2は、
図1のBOVP回路l8
BOVP及びスタック24
STKの更に詳細なブロック図を示す。例示の実施形態において、BOVP回路l8
BOVPは、読み出し/書き込み(R/W)検出ブロック30及び書き込み保護(WP)管理ブロック32を含む。これらの付加的なブロックの各々は下記に説明され、本明細書に説明が提供されているように構成され得る。また、BOVP回路l8
BOVPは、ハードウェア実装であることが好ましい。その理由は、たとえその一部であっても、それをソフトウェアで具現化することは、禁止量ではないとしても大量のランタイムオーバーヘッドを課し得るためである。
【0019】
BOVP回路l8BOVPは、プロセッサ10(例えば、ARM、x86、及びテキサス・インスツルメンツ社製の種々のプロセッサの1つ)が実装される特定のプラットフォームに基づき得る、適切な回路要素に接続され、そのため、スタック24STKと関連して読み出し又は書き込みが要求される各インスタンスが検出される。例えば、スタック上にリターンアドレスをプッシュしようと試みるプッシュ命令に関連して書き込みが生じ得る。同様に、データが一つの位置からスタックにコピーされるときに書き込みが生じ得、スタック24STKの一部が、一時的にバッファとして割り当てられる。別の例として、ポップ命令に関連して読み出しが起こり得、例えば、スタック24STKに事前にプッシュされたリターンアドレスを読み出そうと試みる。最後の例として、バッファとして一時的に割り当てられたスタック24STKの一部からデータが読み出されるときにも読み出しが起こり得る。
【0020】
WP管理ブロック32は、スタック24
STKにおける各メモリ位置(即ち、ワード)に関連する書き込み保護インジケータデータを管理する。
図2に示されるような例示の実施形態において、書き込み保護データが、スタック24
STKにおける各ワード位置に添付された単一のビットとして実装されている。このように、
図2においても、スタック24
STKは、それぞれ32ビットのメモリワードを持つように図示され、各ワードに(例えば、最下位ビットの次に)添付されるのは、付加的な書き込み保護WPインジケータビットである。従って、1つの例示の実施形態において、スタック24
STKを含むためのメモリ(例えば、SRAM)は、公称サイズのメモリワード(例えば、32ビット)を超えて、1つの付加的ビットを含むように構成される。そのようなアプローチにおいて、プロセッサメモリは細分化され得、そのため、メモリの一部がワード幅のみとなり、別の部分がメモリワード毎の付加的ビットを含む。以下に説明するように、代替の例示の実施形態は、また、公称ワードサイズを超えてメモリワードの幅を拡大することなく、WPインジケータビットを各メモリワードに関連させることを意図している。いずれにしても、以下に更に説明されるように、WP管理ブロック32は、スタック24
STKにおいて任意のWPインジケータビットの読み出し又は書き込みをするように、条件付きで動作可能であり、そのような読み出し及び書き込みに対する条件を下記に説明する。また、この点に関して、各ワード(及びその関連WPインジケータビット)が別々にアドレス可能であり、それは
図2における取り決めによって示され、本記載において、スタックアドレスSTK<xx>によって参照され、xxはアドレス又は位置表示である。例えば、
図2において、32個のそのようなアドレスが、STKA<00>からSTKA<3l>として示されている。この点に関して最後に、
図2はスタックポインタSPTRを図示し、スタックポインタSPTRは、現在のスタックアドレスを識別する値(例えば、レジスタにストアされている値)であり、場合によってはその対応するWPインジケータビットであり得る。このように、
図2において、スタックポインタSPTRは、空のスタック24
STKの頂部(即ち、STKA<00>)、つまり、リターンアドレスがプッシュされ得る次の位置を指し示している(ここでは、情報がまだ書き込まれていないので、頂部は書き込まれ得る第1番目のワードである)。また、
図2の例においても、スタックポインタSPTRは、スタックアドレスの各それぞれの増分を用いて、垂直に上方に移動することによって、スタックの各新規の頂部に向かって移動するように示されている。しかしながら、幾つかのスタック方位が、スタックアドレスの減分に関連して「頂部に向かう」スタックポインタの動きを有すると考えられる。ここで、本記載においけるいずれの事象においても、スタックにリターンアドレスを付加することが、スタックの頂部を効果的に変化させることであると考えられる。スタックポインタによって示されるように、リターンアドレスの付加が行われると、スタックに情報が追加さされ得る次の位置(これ以降、スタックの「頂部」と呼ばれる)に進む。そのような移動は、それぞれ異なる例示の実施形態において、スタックアドレスの増分又は減分を介して達成され得る。
【0021】
図3は、プロセッサ10の動作の例示の実施形態の方法300のフローチャートを示す。このフローチャートは、
図2のブロックを特に参照し、また
図2のブロックによって実装され、全てスタック24
STKの読み出し及び書き込みに関連する。従って、方法300は、スタック24
STKに関して読み出し又は書き込みのいずれかが要求されたときにR/W検出30によって検出される、スタックアクセスステップ302で開始する。この点に関して、R/W検出30は、適切な信号に結合された充分な回路要素(例えば、ロジック)を含む。適切な信号とは、命令バス、トレースインタフェース信号、又は他のハードウェアからの信号等であり、それらはスタック読み出し/書き込み動作が試みられたときに監視及び検出され得、一方、他のスタック書き込みからのスタックプッシュを更に区別し、また、他のスタック読み出しからのスタックポップを区別する。そのような信号を識別、監視、及び検出することは、プロセッサ10の特定のアーキテクチャが与えられると達成され得る。いずれにしても、要求された動作が書き込みである場合、方法300はステップ304に続き、要求された動作が読み出しである場合、方法300はステップ306に続く。これらの選択肢の各々を以下に説明する。
【0022】
ここで、WPインジケータの例示の実施形態の使用に従った書き込み保護を紹介し、以下に説明する。スタック24STKに対してプッシュされるそれぞれのリターンアドレスを後の上書きから保護するために、WPインジケータビットが設定される。これにより、それぞれのWPインジケータビットによって保護されているスタックにストアされたリターンアドレスに上書きが試みられると、障害が生成されて、既にストアされている既存の保護されたリターンアドレスの上書きが防止される。そのため、既存の保護されたリターンアドレスがあらかじめストアされていないスタック位置に対して、新規のリターンアドレス又はバッファ情報のいずれかを書き込むためにスタックアクセスが引き起こされると、その書き込みアクセスは許可される。また、引き起こされたスタックアクセスが新規のリターンアドレスを保護されていない(即ち、WPインジケータが設定されていない)スタックワードに対して書き込みを行うためである場合、その書き込みを用いて、WPインジケータが設定されて、その後、その新規のリターンアドレスを、上書きされることから保護する。しかしながら、新規のリターンアドレスを、既存の保護されたリターンアドレスを既にストアしているスタック位置に対してプッシュするようにスタックアクセスが引き起こされると、障害が生成されて、既にストアされた、既存の保護されたリターンアドレスの上書きを防止する。これら及びその他の偶発事象を更に下記に説明する。
【0023】
スタック24STKに対する検出された書き込みアクセスが検出されたため到達したステップ304において、ステップ304は、データをストアするために書き込みが試みられているアドレスに対するWPインジケータビットを評価する。また特に、WPインジケータビットが既に設定されているか否かを評価する。WPインジケータビットが設定されている場合、方法300はステップ304からステップ308に進み、一方、WPインジケータビットが設定されていない場合、方法300はステップ304からステップ310に進む。
【0024】
対応する設定されたWPインジケータビットを持つスタックアドレスに対して書き込みが試みられたために到達したステップ308は、障害を生成し、それによって障害を報告する。従って、
図2において、この事象は、バスBに結合されるアサートされたFAULT信号によって示され、バスBに結合される任意の回路によって受信及び応答され得る。障害報告は、実際の又は推測による任意の更なるプログラム実行に対する割り込み等を介する等の種々の手法で達成され得、その後、何らかの事象ハンドラが、それに従って障害を処理する。また、ステップ308の障害設定は、それにより、対応するWPデータが(例えば、SRAMワードにおける33番目のビットとして)設定されているスタック位置に対して、プッシュ又は非プッシュ書き込みが試みられると、障害をアサートする。また、上記で紹介したように、リターンアドレスがスタック24
STKに対してプッシュされるとWPインジケータビットが設定されるため、ステップ304及び308は、そのようなプッシュされたリターンアドレスの上書きが試みられた場合、障害を生成する。このように、そのような試みがミス(例えば、誤ったCコード)によるものであるか、或いは、スタックを破壊するための意図的な試み(例えば、ROP攻撃)であるかに関わらず、リターンアドレスが上書きされることを許可することによって生じ得る結果、制御、及び/又はセキュリティにおける欠陥又は望まざる変化が回避され、代わりに、障害が生成される。従って、
図3に示されていないが、方法300は、例えば、障害に対する応答に基づいて利用可能な適切な障害ハンドラに分岐し得、その後、方法300に戻る。
【0025】
要求されたスタックアクセスが書き込み動作であり、書き込まれるべきアドレスに対してWPインジケータが設定されていないため到達したステップ310は、位置SPTR<STKA>に対して、プッシュ読み出しとして、又は例えば、非プッシュ書き込みの場合等のバッファ書き込みとして、要求された書き込みを実行する。プッシュとして、その書き込みが、別のレジスタから又はプログラムカウンタl4PCからのリターンアドレス(又はそのオフセット又は増分)であり、そのため、リターンの際に、次のプロセッサ実行命令がリターンアドレスにある。次に、方法300はステップ312に続く。
【0026】
ステップ312は、ステップ310書き込みが、スタック24STKに対してリターンアドレスの書き込みを試みることを含むプッシュ動作であるか否かを判定する。しばしば、プッシュ動作は、定義上必ず、スタック(例えば、スタック24STK)に対して、そのように書き込むことを試みるが、本明細書では、リターンアドレスをプッシュしないプッシュ動作があり得るともみなされる。このように、ステップ312に含まれるものには、プッシュがリターンアドレスであるか否かの判定もある。この判定は、例示の実施形態において、例えば、リターンアドレスを保持するために特に用いられるPC又はレジスタ(例えば、ARMアーキテクチャにおけるLRレジスタ)からいつ値が来るかを検出することによって達成され得る。従って、幾つかの例示の実施形態は、これがそのケースであるか否かを判定するために、プロセッサ信号を監視する。一方、例示の実施形態のARM実装において、例示の実施形態は、関数において実行される第1の命令が、LRレジスタ値を含む値のプッシュである、コンパイラ規約に依存する。ステップ312が、要求された書き込みがプッシュ動作であることを検出した場合、方法300はステップ314で継続し、一方、ステップ310が、要求された書き込みがプッシュ動作でないことを検出した場合、方法300は、ステップ302の次のインスタンスに戻る。
【0027】
スタック動作に対する検出された書き込みが、更にプッシュ動作(これは、スタックに対してアドレスを書き込むように試みる)であると検出されたため到達したステップ314において、その後、WP管理ブロック32は、スタックメモリ位置に対してWPインジケータビットを設定する。そのスタックメモリ位置の中に、リターンアドレスが書き込まれる、即ち、現在のスタックアドレスポインタの位置である。
図3に、アドレスSPTR<STKA>として示され、また、その位置のWPインジケータはWP[SPTR<STKA>]として示される。このように、本明細書において、このインジケータビットの設定は、それを1のバイナリ値にアサートすることによるのであり得、それによって、同じそれぞれのアドレスに書き込まれるリターンアドレスSTKAを示す。WPインジケータが設定されたままである限り、STKAは書き込み保護される。また、ステップ314のこのインスタンスが、
図2に示されるポイントに関して生じると、設定されたWPインジケータは、SPTR<00>において最下位ビットをバイナリ1に設定することによって達成され得る。また、他の例示の実施形態において、任意選択的に、命令が、任意のWPビットを設定するように許可され得る。それによって、スタック上の任意の対応するアドレスに対する保護を可能にする。いずれにしても、ステップ314がWPインジケータを設定した後、方法300は、ステップ302の次のインスタンスに戻る。
【0028】
上記の説明から、プッシュ又は何等かの他のタイプの書き込み(例えば、バッファコピー)として、書き込みアクセスが引き起こされた後、ステップ310に到達する。また、そのため、ステップ312及び314の完了時点で、所与のスタックアドレスに対して、有効なリターンアドレスが書き込まれ、そのそれぞれのWPインジケータビットが設定されている。もちろん、非プッシュ書き込みの場合も、データは位置SPTR<STKA>に書き込まれるが、そのような書き込まれたデータの場合、WPビットは設定されない。また、異なる例示の実施形態において、ステップ314とステップ312の順序は逆転される。或いは、それらは、アトミックステップ(atomic step)として同時に起こることもあり得る。その際、スタックに対する書き込みがリターンアドレスである場合、両方が確実に生じることが条件である。実装の観点からみると、実装詳細に依存して、一方が他方より容易であり得る。いずれにしても、両方のステップ(又はリターンアドレスを含まないスタック書き込みの場合は、ステップ312のみ)が完了すると、方法300はステップ312からステップ302に戻り、それにより次のスタックアクセスを待つ。
【0029】
方法300の書き込み関連ステップ(
図3の右側に示される)を説明したので、ここでは、ステップ306で開始する、スタックアクセスが読み出しであるとステップ302が判定したときの方法ステップに注目する。ステップ306は、読み出しがポップ動作か否かを判定する。ポップ動作とは、即ち、スタック24
STKからリターンアドレスを読み出し、CPUプログラムカウンタl4PCに入れることを試みることである。それによって、先のプログラムフローをそのプログラムシーケンスから離れた命令(例えば、分岐)のアドレスに続く次のアドレスに、プログラムフローを復元する。ステップ306の判定はまた、プロセッサアーキテクチャに基づいて、或る信号を検出することに応答して行われ得る。ステップ306が、要求された読み出しがポップ動作であることを検出した場合、方法300はステップ322で継続する。一方、ステップ306が、要求された読み出しがポップ動作ではないことを検出した場合、ステップ322がスキップされ、方法300はステップ324で継続する。ポップ動作の検出は、スタックポインタにおける値を監視することによって行われ得る。スタックポインタ値が、スタックの底部に向かって移動されると、前のスタックポインタ値と新規のスタックポインタ値との間の全ての値が、ポップされたものとみなされる。スタック動作からの検出された読み出しがポップ動作として更に検出されたために到達したステップ322において、WP管理ブロック32は、リターンアドレスが読み出されるスタックメモリ位置、即ち、現在のスタックアドレスポインタ(即ち、WP[SPTR<STKA>])の位置、に対するWPインジケータビットをクリアする。従って、この明細書において、このビットのクリアは、ビットを0のバイナリ値にデアサートすることによって行われる。WPインジケータをこのように0の値にデアサートすることで、そのアドレスSTKAが、後に書き込まれると考えられる場合、スタック書き込みと関連する上述のステップ304が、クリアされたWPインジケータを検出し得、それにより、ステップ312に遷移することによって書き込みを許可する。いずれにしても、ステップ322の後、方法300はステップ322からステップ324まで継続する。
【0030】
ステップ324において、要求された読み出しが、ステップ322の後のポップ読み出しとして、又はステップ306における非ポップ読み出しを見つけたことから直接のバッファ読み出しとして実行される。従って、ポップとして、読み出しは、スタックからのリターンアドレス(又は他の情報)の読み出しであり、現在のスタックアドレスポインタ(即ち、SPTR<STKA>)の位置におけるメモリワードの読み出しである。図示されていないが、読み出しは、別のレジスタに又は直接的にプログラムカウンタl4Pcに成され得る。そのため、次のプロセッサ実行命令はリターンアドレスにおける命令となる。従って、ステップ322及び324の完了時点で、所与のスタックアドレスに対して、有効なリターンアドレスが読み出されており、そのそれぞれのWPインジケータビットがクリアされている。もちろん、非ポップ読み出しの場合も、データが位置SPTR<STKA>から読み出され、非ポップ読み出し命令によって示され得るように宛先に提供される。また、ステップ314及び312の上記の説明と同様に、ステップ322とステップ324の順序も逆転され得る。その際、スタックからの読み出しがポップを含む場合、両方が確実に起こり、実装が他の実装詳細に依存し得ることが条件である。いずれにしても、ステップ322及び324が完了すると、次に、方法300はステップ324からステップ302に戻り、それにより、次のスタックアクセスを待つ。
【0031】
図4aから
図4fは、スタック24
STKを示しており、種々のメモリワードにおける表示を用い、またスタックポインタSPTRの移動を用いて、方法300の例示のシーケンスを図示している。この第1の例において、プログラミング言語(例えば、C)が、下記の表1に示されるコードに従って実施することを想定している。
【表1】
任意の命令の実行の前は、スタック24
STKは、
図2のケースと同様に表され、スタックポインタSPTRが、スタック(即ち、STKA<00>)の底部を指し示している。
【0032】
次に、表1に従って、第1の命令が「hello」ルーチンを呼び出す。その場合、対応するアセンブリ言語は、LRレジスタにストアされたプログラムカウンタアドレスをスタック24
STK上にプッシュしようと試みる。このように、試行されたプッシュは、方法300のステップ302において検出されたような、スタックアクセス書き込み試行である。また、試みられた書き込みは、ステップ304において確認されたように、クリアされたWPインジケータを持つ空のスタック位置に対するものであり、それにより、フローはステップ310に進む。ステップ310は、更に、書き込みをリターンアドレスのプッシュ(例えば、LRのプッシュ)として確認する。これは、ステップ314にSTK<00>でWPインジケータを設定するように指示する。その後、ステップ312が続き、リターンアドレスがその同じアドレスに対してプッシュされる。この点に関し、
図4bは、これらのステップ後のスタック24
STKを図示する。この場合、ステップ314はSTKA<00>に対するWPインジケータビットを1の値に設定しており、ステップ312はLRデータをSTKA<00>に書き込んでいる。
【0033】
次に、C命令「uint32t buf[4]」の結果、スタック24
STKにおけるプッシュされたLR値の頂部上に、バッファスペースを予約する。この点に関して、「uint32t buf[4]」の命令は、スタックポインタSPTRに4の値を付加させる。従って、それは、
図4bにおけるSTKA<00>から
図4cにおけるSTKA<04>に進んだものとして、
図4cに示される。
【0034】
次に、C命令「memcpy(buf,rx_buf,len);」は、変数rx buf;によって設定された長さを持つワードのバッファを、別のメモリから、スタック24
STKに対してコピーする。従って、現在の例において、そのrx_bufは、4ワードを持つように定義されており、そのため、それらの4ワードの各々が、スタック24
STKに書き込まれる。このように、各書き込みは、再び、方法300のステップ302によって検出される、スタックに対するアクセスの試みを表す。例えば、第1の書き込みに対して、ステップ310は、第1に、問題となっているSTKAアドレス(即ち、STKA<04>)のWPインジケータビットが設定されているか否かをチェックする。現在の例では、WPデータは設定されていないため、次のステップ304は、書き込みがプッシュではないと判定し、その後、ステップ312は、
図4dに示されるように、書き込みを実施する。メモリからスタック24
STKにコピーされるべき残りの3ワードの各々に対しても同じプロセスが繰り返され、従って、ステップ304、310、及び312の3回以上の繰り返しの完了時点で、スタック24
STKは、
図4eに示されるようになる。また、この文脈において、rx_buffアクセスに対して用いられるアドレスは、スタックポインタとは別個に追跡されるため、バッファへの書き込みごとにスタックポインタは移動せず、従って、SPTRは、STKA<04>を指し示しているように示される。
【0035】
上述のように、バッファデータは、スタック24
STKに成功裏にストアされており、そのルーチンの間、所望に応じて迅速かつ容易にアクセスされ得る。表1に示されるように、C言語「return;」命令によって示されるように、最終的に、ルーチンが完了する。その命令に応答して、-4の値がスタックポインタSPTRに付加され、それによってそれをアドレスSTKA<00>に配置し、従って、
図4fに示されるように、LRリターンアドレスを指し示す。次に、アセンブリ言語POP命令によって、そのアドレスから読み出しが求められ。方法300のステップ306、322、及び324を再び呼び出す。従って、ステップ322において、以前に設定されたWPインジケータビットがクリアされ、ステップ324において、
図4fに示すように、アドレスSTKA<00>におけるLR値が読み出され、そこから、その値がプロセッサのプログラムカウンタl4
PCに戻され、その結果、次に実行された命令が、リターンアドレスにあり、それによって、ルーチンコールに続く命令に実行を適切に戻す。
【0036】
図4a~
図4fの上述の例は、リターンアドレスのスタック24
STKへの成功裏のプッシュ及びポップを図示しているが、ここで、例示の実施形態によって提供されるように、保護的態様が評価される付加的な例を説明する。具体的には、
図4d及び
図4eに示されるように、上記の例は、変数rx_buff;によってパスされるように、バッファ長が4ワードであることを想定している。しかしながら、ここでは、ミスによって又は意図的なハッキング操作によって変数rx_buffが5又はそれ以上(例えば、8ワード、その場合rx_buff[8])であることを想定する。
図4eを参照すると、第1の4ワードの各々がスタック24
STKにコピーされた後、次に試みられた書き込み、即ち、rx_buff[5]が、STKA<00>にある。この試みられた書き込みは、方法300のステップ302によって、まず検出され、その後、ステップ304がSTKA<00>におけるWPインジケータビットが設定されていることを判定する。
図4eに示される例において、ステップ304の条件は肯定的であり、即ち、その位置に対してWPインジケータビットが設定されている。その結果、方法300はステップ308に続き、障害が生成される。また、障害生成の一部として又は障害生成に加えて、設定されたWPインジケータビットに応答して、書き込みがブロックされる。従って、例示の実施形態において、障害生成の一部(又は、障害生成に加えて、又は障害生成の代わり)が、STKA<00>におけるストアされたリターンアドレスを上書きするためのC言語の取り組みを妨害する。それによって、スタックの「スマッシング(smashing)」を回避する。従って、スタック24
STKへのその後のリターンがある場合、適切なリターンアドレスが維持され、正規のスタック位置のリターンアドレス以外のアドレスにジャンプ又はトランジションする能力はない。確かに、バッファをコピーする上記の例は、1つの可能なアプローチにすぎないが、全ての事象において、スタックに対するリターンアドレスのプッシュの、より早期の検出は、それぞれの設定されたWPインジケータビットによって、その後の上書きから保護される。それは、そのアドレスのその後のポップがないこと、及びその後のポップがあるまでを条件とする。その場合、それぞれの設定されたWPインジケータビットはクリアされる。
【0037】
図5は、
図2のブロックを再び示すが、参照をスタック24’
STKとして区別して示されるスタックの代替の例示の実施形態を備える。スタック24
STKと同様に、24’
STKは、アドレスデータが書き込まれ得る各アドレス位置に対するWPインジケータビットを含むが、各ワードに付加的なビットを添付するのではなく、WPインジケータビットの集合が単一のメモリ位置にストアされる。それは、スタックの近くのどこかのメモリ位置であり得、従って、例として、スタックアドレス<00>の2つ下の位置のアドレスで示され、そのため、アドレス<00-2>として示される。或いは、別の例において、単一のWPストアワードがスタックワードの1つであり得、そこでは、付加的なワードそれ自体が、保護される場合と保護されない場合がある。また、スタック24’
STKにおける各メモリワードは、スタック24
STKの場合と同じように、付加的なビットを含まないため、
図5における各ワードは、24
STKの33ビットではなく、32ビット幅である。更に、単一のメモリワードが、従って、合計32のWPインジケータビットをサポートし得るため、各異なるWPインジケータビットは、スタック24’STKのそれぞれの異なるメモリ位置に対応することが好ましい。従って、その場合、例えば、STKA<00-2>における最下位ビットは、STKA<00>における最下位スタックワードに対するWPインジケータビットを表す。同様に、STKA<00>におけるより上位の各ビットは、STKA<00>の上の次の最上位スタックワードに対するWPインジケータビットを表す。下記の表2に示されるように、STKA<00-2>における各WPインジケータビットを、それぞれのワードに対してマッピングする。
【表2】
最後に、
図5において、BOVP回路18
BOVPのWP管理ブロック32が、アドレス<00-2>におけるワードのみにアクセスするように結合されて示されている。それは、そのワードが、WPインジケータビットに関して読み出し/書き込みを行うワードであるからである。このように、方法300における種々のステップに一致して、WP管理ブロック32は、アドレス<00-2>におけるワードの各ビットを、例えば、全体のワードを読み出し、次に、その中のビットを読み出すか又はその中にビットを書き込む(後者の場合、その後、変更されたビットを含む、全体のワードをアドレス<00-2>に戻して書き込む。)ことなどによって、読み出し又は書き込み得る。
【0038】
図6は、内部メモリ24及びWP管理ブロック32の別の例示の実施形態の実装の電気的及び機能的ブロック図を示す。これらのブロックの各々を下記に説明する。
【0039】
最初に内部メモリ24を見ると、デバイス(例えば、プロセッサ)が自身のメモリスペースに1つ以上のスタックを含み得ることを表すように、スタック24”
STKSが示されている。このように、
図5は、32のアドレス/バッファワード及び1つのWPインジケータワードを含むR/Wメモリスペースの単一のブロックを図示するが、
図6は、それぞれのWPインジケータスペースを持つ各ブロックを備える、複数(例えば、3個)のスタックブロックを提供する。図示されたアプローチにおいて、特定のサイズは提供されていないが、代替の例示の実施形態において、スタックサイズは変化し得、従って、各スタックに対応するWPビットも変化し得る。このように、一例において、各スタックは32ワードであり得、各WPビットスペースは32ビットであり得るが、他の変形において、スタックサイズが全て同じで、32ワード以外であり得る。或いは、1つ又は複数が他とは異なり得、従って、それぞれのWPビットを収容するために必要なスペースも異なり得る。従って、この点に関して、
図6の一般性は、代替の例示の実施形態の広さを示すことが意図され、所与のスタックに対するWPビット(又は他のインジケータ)は、スタック内以外の任意の場所にストアされ得るので、全てのスタックの下にストアされる必要がない。従って、WPビットは、スタック間(例えば、
図6のスタック1とスタック2の間、又は、スタック2とスタック3の間)、全てのスタックの前、全てのスタックの後、又は、完全に他の何らかのメモリエリア内に、配置され得る。
【0040】
また、
図6において、WP管理ブロック32は、WPキャッシュ32
Cを含むように示される。WPキャッシュ32
Cは、キャッシュメモリ32
CM及びキャッシュコントロール32
CCを更に含む。キャッシュメモリ32
CMは、スタックアドレスSTKAを受け取るように結合される。方法300の上述の説明に一致して、スタックアドレスSTKAに対して書き込みが所望されるか或いはスタックアドレスSTKAから読み出しが所望される。キャッシュメモリ32
CMはまた、スタック24”
STKSに対応するWPデータに結合される。従って、WPインジケータビットのメモリワードは、既知の原則に従って、スタックスペース24”
STKSからキャッシュメモリ32
CMにフェッチされ得る。このように、スタックアドレスSTKAが受け取られたときに、STKAに対応する特定のWPインジケータビットを含む求められる(sought)WPデータワード(例えば、WPインジケータの32ビット)が既にキャッシュメモリ32
CMにある場合、キャッシュヒットが生じ、そのデータは、方法300に従った処理(即ち、読み出しか又は書き込み)に直ちに利用可能である。これとは反対に、スタックアドレスSTKAが受け取られたときに、STKAに対応する特定のWPインジケータビットを含む求められるWPインジケータワードがキャッシュメモリ32
CM内にない場合、キャッシュミスが生じ、そのデータは、スタックスペース24”
STKSからキャッシュメモリ32
CMにリトリーブされ、その後、処理に利用可能である。従って、このようにして、32ビットアドレス指定の例の場合、アドレスの最下位5ビットがキャッシュアクセスに対するオフセットを提供し、最上位27ビットがキャッシュタグを提供する。
【0041】
幾つかのプロセッサが、複数のスタックを同時にサポートする。例えば、プロセッサは、2つのスタックポインタを提供し得、一方はオペレーティングシステムによる使用が意図され、他方はアプリケーション(1つの例は、幾つかのARMプロセッサにおけるMSP及びPSPスタックポインタである)による使用が意図される。別の例示の実施形態は、プロセッサがサポートする全ての同時スタックに対するカバレッジを提供する。この実施形態において、WPビットは、SPID:WPによって表される複数のビットに拡張される。ここで、SPIDは、プロセッサにおける各スタックポインタに対する値を一意にエンコードするために充分大きいビットのセットであり、WPは書き込み保護ビットである。プロセッサにおける実行の間、プロセッサは、どのスタックポインタがアクティブかを追跡する。WP管理ブロック32は、どのスタックポインタが使用中であるかを判定するために、プロセッサからの信号を監視する。アドレスに対してWPビットを書き込むと、SPIDもまた、WP管理ブロック32によって書き込まれる。WP管理ブロック32が、アドレスがポップされたとのプロセッサからの指示を有するとき、現在アクティブなスタックポインタが、そのアドレスに対してストアされたSPIDビットに一致する場合にのみ、WP管理ブロック32は、そのアドレスに対するSPID及びWPビットをクリアする。また、WP管理ブロック32は、監視されている各スタックポインタに対するイネーブル/ディセーブル信号を提供する。また、WP管理ブロック32は、メモリ内のどこにそのスタックに対するWPビットをストアするかを設定するために、監視されている各スタックポインタに対して構成レジスタを提供する。プロセッサが或るモード(特権モード等)でない限り、イネーブル/ディセーブル信号メモリの変更はブロックされ得る。オペレーションシステムがスレッド切り替えを行っている間、イネーブル/ディセーブル信号は、構成レジスタとともに、オペレーティングシステムに、スレッド/アプリケーションによって用いられているスタックの監視を停止させる。オペレーティングシステムは、スタックポインタAに対する監視をディセーブルし得、メモリにおけるWPビットの位置をスタックポインタAに対する構成レジスタに書き込み得、スタックポインタAの値を、オペレーティングシステムが実行しようとしているスレッドに対する適切な値に変更し得、その後、スタックポインタAに対する監視を再びイネーブルし得る。動作のこのシーケンスは、WP管理ブロックのポップ検出ロジックをトリガするリスクなしに、スレッド切り替え(スタックポインタにおける値の変更)を生じさせる。
【0042】
上記から、例示の実施形態は、スタックバッファオーバーフローから保護するためのハードウェアサポートを備える改善されたプロセッサを提供する。結果として、例示の実施形態プロセッサは、望ましくない又は悪意あるスタック動作を起こし得る、コーディングエラー又は意図的な攻撃の影響を受けにくい。また、これらのハードウェア態様は、ソースコードの再コンパイルを回避することやテスト及び実行時間オーバーヘッドの双方を低減すること等、ソフトウェアベースの技法に比べて時間オーバーヘッドを低減する。例示の実施形態はまた、保護的ソフトウェアの必要性を軽減すること、及び、例示の実施形態によって低減される懸念に対処するために必要となるであろうアーキテクチャのより深い理解の必要性を低減することの両方において、ソフトウェア開発者の負担をなくす。このように、例示の実施形態は多くの利点を有することが示されており、種々の実施形態が提供されてきた。更にその他の利点として、例示の実施形態は、種々の代替が考えられ、それらの幾つかは、他のものと共に上記で説明してきた。例えば、例示の実施形態は、32ビットワードアーキテクチャの文脈において説明されてきたが、例示の実施形態は、他のワード長アーキテクチャにも適用され得る。別の例として、スタックWPインジケータビットがスタックにストアされている及び/又はキャッシュされている例が示されているが、ビット、フラグ、又は、複数ビットを含む保護的インジケータ間のその他の関連、及びそれらのビットの(例えば、ロジックAND、OR等を介する)互いとのあり得る関係、又は他の条件がなされ得、そのため、プログラムカウンタアドレスがストアされる(例えば、プッシュされる)それぞれのスタック位置をハードウェア保護する。それによって、そのようなアドレスの、タイミングが適切でない又は悪意的な上書きの可能性を低減する。更に別の例として、或る例示の実施形態において、WPビットは、書き込み保護されたスペースへの書き込みを防止するが、代替の例示の実施形態では、書き込みが起こり得、その後検出され得る。そのため、上書きされたデータは回復可能ではないが、障害が生成されて、上書きされたデータはエラーのあるターゲットアドレスとして使用が許可されない。さらに別の例において、例示の実施形態が、スタックの一部として書き込み保護のため監視されているメモリアドレスを調整するために、CPUで(例えば、CPUが特権状態にある間に)命令を実行させる能力を含み得る。例えば、リアルタイムオペレーションシステム(RTOS)を実行する場合、複数のスタックが用いられ、また、例示の実施形態がCPUのスタックポインタレジスタに対する変更を監視する間、RTOSがスタックをスワップすると、その変更はプッシュ又はポップとして解釈されないことが好ましく、従って、
図3に示されるもの等の、例示の実施形態の方法における、引き起こす条件である
【0043】
特許請求の範囲内で、説明した実施形態における変更が可能であり、他の実施形態が可能である。