(57)【要約】【課題】スタックオーバーフロー攻撃があっても本来のプログラムの実行を継続できるプロセッサを提供する。【解決手段】プログラム及びプログラムで使用するデータが記憶される第１記憶装置３とは別に、第１スタックメモリ７に対するプッシュ又はポップの実行時のみ、ＣＰＵ２がアクセスできる第２記憶装置４を備える。ＣＰＵ２には第１スタックメモリ７に対応する第１スタックポインタ８とは別に、第２記憶装置４に定義される第２スタックメモリ９に対応する第２スタックポインタ１０を用意する。ＣＰＵ２はサブルーチンを呼び出す際に、退避レジスタ情報及び戻りアドレス情報を第１スタックメモリ７へプッシュすると、第２スタックメモリ９にも前記各情報のプッシュを行い、前記各情報を第１スタックメモリ７からポップすると第２スタックメモリ９からも対応する情報のポップを行う。両者の情報内容が異なればスタックオーバーフローの発生を検出し、第２スタックメモリ９からポップしたアドレス情報をプログラムカウンタに、レジスタ情報を各レジスタにロードする。【選択図】図１
2015011436.tif 000002
【特許請求の範囲】
【請求項１】
ＣＰＵ（２）と、
このＣＰＵにより実行されるプログラム及び前記プログラムで使用されるデータが記憶される第１記憶装置（３）と、
この第１記憶装置に定義される第１スタックメモリ領域（７）に対するプッシュ命令又はポップ命令の実行時のみ、前記ＣＰＵがアクセス可能となるように構成される第２記憶装置（４）とを備え、
前記ＣＰＵは、
前記第１スタックメモリ領域のアクセスアドレス情報を保持する第１スタックポインタ（８）と、
前記第２記憶装置に定義される第２スタックメモリ領域（９）のアクセスアドレス情報を保持する第２スタックポインタ（１０）とを備え、
主プログラムを実行することでサブプログラムを呼び出す際に、退避させるレジスタ情報と、主プログラムへの戻りアドレス情報とを前記第１スタックメモリ領域へプッシュする命令を実行すると、前記第２スタックメモリ領域に対しても前記レジスタ情報及び前記アドレス情報のプッシュ動作を同時に行い、
前記アドレス情報及び前記レジスタ情報を、前記第１スタックメモリ領域からポップする命令を実行すると、前記第２スタックメモリ領域についても前記アドレス情報及び前記レジスタ情報のポップ動作を同時に行い、
前記２つのスタックメモリ領域からポップした情報の内容を比較して、両者が異なればスタックオーバーフローの発生を検出し、かつ前記第２スタックメモリ領域からポップしたアドレス情報をプログラムカウンタにロードすると共に、前記第２スタックメモリ領域からポップしたレジスタ情報を、対応する各レジスタにロードすることを特徴とするプロセッサ。
【請求項２】
ＣＰＵ（１２）と、
このＣＰＵにより実行されるプログラム及び前記プログラムで使用されるデータが記憶される第１記憶装置と、
この第１記憶装置に定義される第１スタックメモリ領域に対するプッシュ命令又はポップ命令の実行時のみ、前記ＣＰＵがアクセス可能となるように構成される第２記憶装置と、
緊急時用プログラム（１４）が記憶される第３記憶装置（１３）とを備え、
前記ＣＰＵは、
前記第１スタックメモリ領域のアクセスアドレス情報を保持する第１スタックポインタと、
前記第２記憶装置に定義される第２スタックメモリ領域のアクセスアドレス情報を保持する第２スタックポインタとを備え、
主プログラムを実行することでサブプログラムを呼び出す際に、退避させるレジスタ情報と、主プログラムへの戻りアドレス情報とを前記第１スタックメモリ領域へプッシュする命令を実行すると、前記第２スタックメモリ領域に対しても前記レジスタ情報及び前記アドレス情報のプッシュ動作を同時に行い、
前記アドレス情報及び前記レジスタ情報を、前記第１スタックメモリ領域からポップする命令を実行すると、前記第２スタックメモリ領域についても前記アドレス情報及び前記レジスタ情報のポップ動作を同時に行い、
前記２つのスタックメモリ領域からポップした情報の内容を比較して、両者が異なればスタックオーバーフローの発生を検出し、かつプログラムカウンタに前記緊急時用プログラムへのアクセスアドレスをロードして、当該緊急時用プログラムを実行することを特徴とするプロセッサ。
【請求項３】
前記緊急時用プログラムは、前記スタックオーバーフローの発生を外部に報知する処理を行うプログラムであることを特徴とする請求項２記載のプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、スタックオーバーフロー攻撃に対する防御機能を備えたプロセッサに関する。
【背景技術】
【０００２】
従来、プロセッサがプログラムを実行する際に、セキュリティ上の脆弱性を突くスタックオーバーフロー攻撃（スタックスマッシング）と呼ばれる手法が深刻なセキュリティ上の問題になっている。この対策技術として、主プログラムから呼び出されたサブプログラムの実行終了時に、主プログラムへの戻りアドレス情報を主記憶装置とは別の記憶装置に保存しておき、主記憶装置の戻りアドレス情報が、プログラムの実行により誤って、若しくは意図的に書き変えられている場合に、戻りアドレス情報が正しくないことを検出する技術が提案されている（例えば、特許文献１参照）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００９−２３０４７９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
特許文献１の技術によれば、主プログラムへの戻りアドレス情報が書き換えられた場合でも、正しい戻りアドレス値を主記憶装置以外の記憶装置から読み出すことができる。しかしながら、主記憶装置のレジスタ情報もスタックオーバーフロー攻撃によって書き換えられる場合がある。すると、サブプログラムの実行を終了した後、適切な主プログラムのアドレスに戻ったとしても、前記レジスタ情報が書き換えられていればプログラムを正しく継続実行できないおそれがある。
本発明は、上記事情に鑑みてなされたもので、スタックオーバーフロー攻撃があっても本来のプログラムの実行を継続できるプロセッサを提供することを目的とする。
【課題を解決するための手段】
【０００５】
請求項１記載のプロセッサによれば、プログラム及びそのプログラムで使用するデータが記憶される第１記憶装置とは別個に、第１記憶装置に定義される第１スタックメモリ領域に対するプッシュ命令又はポップ命令の実行時のみ、ＣＰＵがアクセス可能となるように構成される第２記憶装置を備える。また、ＣＰＵは、第１スタックメモリ領域のアクセスアドレス情報を保持する第１スタックポインタとは別に、第２記憶装置に定義される第２スタックメモリ領域のアクセスアドレス情報を保持する第２スタックポインタを用意する。
【０００６】
ＣＰＵは、主プログラムからサブプログラムを呼び出す際に、退避させるレジスタ情報と戻りアドレス情報とを第１スタックメモリ領域へプッシュする命令を実行すると、第２スタックメモリ領域に対しても前記レジスタ情報及び前記アドレス情報のプッシュ動作を同時に行う。
そして、前記情報を第１スタックメモリ領域からポップする命令を実行すると、第２スタックメモリ領域についても対応する情報のポップ動作を同時に行い、それらの情報内容を比較して、両者が異なればスタックオーバーフローの発生を検出する。加えて、第２スタックメモリ領域からポップしたアドレス情報をプログラムカウンタにロードし、第２スタックメモリ領域からポップしたレジスタ情報を対応する各レジスタにロードする。
【０００７】
すなわち、プログラムから参照できるのは第１記憶装置のみであり、たとえ改竄されたプログラムが実行されても第２記憶装置にアクセスすることはできず、第２スタックメモリ領域の内容は保持される。そして、スタックオーバーフローの発生が検出されると、第２スタックメモリ領域からポップした戻りアドレス情報がプログラムカウンタにロードされると同時にレジスタ情報が対応する各レジスタにロードされるので、ＣＰＵは本来のプログラムの実行を確実に継続することができる。
【０００８】
請求項２記載のプロセッサによれば、請求項１と同様の第１及び第２記憶装置を備えて、更に、緊急時用プログラムが記憶される第３記憶装置を別途備える。また、ＣＰＵは、同様に第１及び第２スタックポインタを用い、これらに対するプッシュ動作及びポップ動作についても、請求項１と同様に行う。そして、２つのスタックメモリ領域からポップした情報の内容を比較して、両者が異なればスタックオーバーフローの発生を検出し、かつプログラムカウンタに緊急時用プログラムへのアクセスアドレスをロードして、当該緊急時用プログラムを実行する。すなわち、スタックオーバーフローの発生が検出されると、緊急時用プログラムが実行されるので、その実行によりスタックオーバーフローの発生に対処することができる。
【図面の簡単な説明】
【０００９】
【図１】第１実施形態であり、プロセッサの構成を、要旨に係る部分について示す機能ブロック図
【図２】ＣＰＵによる処理内容を、要旨に係る部分について示すフローチャート
【図３】第２実施形態を示す図１相当図
【図４】図２相当図
【図５】セキュリティプログラムの内容を示すフローチャート
【発明を実施するための形態】
【００１０】
（第１実施形態）
図１に示すように、プロセッサ１は、ＣＰＵ２と、第１記憶装置３と、第２記憶装置４とを備えており、第１記憶装置３及び第２記憶装置４は、何れもＲＡＭで構成されている。第１記憶装置３には、ＣＰＵ２による初期処理において、図示しないプログラムＲＯＭから、プログラム及び当該プログラムにおいて使用されるデータが、それぞれプログラム領域５，データ領域６にロードされている。
【００１１】
データ領域６には、第１スタックメモリ７（第１スタックメモリ領域）が設定されている。ＣＰＵ２は、前記プログラムにおけるメインルーチン（主プログラム）の実行中に、サブルーチン（サブプログラム）を実行する（呼び出す）際に、退避させるアドレス及びデータレジスタ等の情報と、メインルーチンへの戻りアドレス情報とを第１スタックメモリ７にプッシュする命令を実行する。また、サブルーチンの実行を終了してメインルーチンにリターンする際には、退避させたレジスタ情報及びアドレス情報を復帰させるため、第１スタックメモリ７よりこれらをポップする命令を実行する。この場合、ＣＰＵ２は、第１スタックメモリ７に対するアクセスアドレス情報を、第１スタックポインタ８において保持する。
【００１２】
また、第２記憶装置４には、第２スタックメモリ９（第２スタックメモリ領域）が設定されている。ＣＰＵ２は、上述したように、第１スタックメモリ７に対するプッシュ，ポップ命令を実行する際に、前記レジスタ情報及びアドレス情報のプッシュ，ポップを、第２スタックメモリ９に対しても全く同様に実行する。そして、ＣＰＵ２は、第２スタックメモリ９に対するアクセスアドレス情報を、第１スタックポインタ８とは別個に設けられている第２スタックポインタ１０において保持する。
【００１３】
尚、第２スタックメモリ９に対するプッシュ，ポップ命令の実行は、プログラムによって制御されるのではなく、ＣＰＵ２内部のハードロジックで自動的に実行される。したがって、第２スタックメモリ９については、プログラムからは参照できない（直接操作できない）ようになっている。また、第２記憶装置４は、第２スタックメモリ９を設定するためのみにアクセスされて使用され、その他の用途には使用されない。
【００１４】
次に、本実施形態の作用について説明する。図２において、ＣＰＵ２は、命令フェッチの対象とするメモリを第１記憶装置３とするようにプログラムカウンタをセットして（Ｓ１）命令フェッチを行う（Ｓ２）。フェッチした命令が、プッシュ命令，ポップ命令の何れでもなければ（Ｓ３，Ｓ８：ＮＯ）、前記命令を実行してから（Ｓ６）ステップＳ２に戻る。
フェッチした命令がプッシュ命令であり（Ｓ３：ＹＥＳ）、プッシュする対象がメインルーチンへの戻りアドレス情報（Ｓ４：ＹＥＳ），或いは退避させるレジスタ情報であれば（Ｓ５：ＹＥＳ）、それらを第１，第２記憶装置３，４の双方について、すなわち第１，第２スタックメモリ７，９の双方にプッシュする（Ｓ７）。それから、ステップＳ２に戻る。
【００１５】
一方、フェッチした命令がポップ命令であり（Ｓ８：ＹＥＳ）、ポップする対象が戻りアドレス情報（Ｓ９：ＹＥＳ），或いは退避させたレジスタ情報であれば（Ｓ１０：ＹＥＳ）、それらを、第１，第２記憶装置３，４の双方から、すなわち第１，第２スタックメモリ７，９の双方からポップする（Ｓ１１）。そして、ＣＰＵ２は、２つのスタックメモリ７，９からそれぞれポップした値を比較して、両者の値が等しいか否かを判断する（Ｓ１２）。
【００１６】
ここで、両者の値が等しければ（ＹＥＳ）ステップＳ６に移行し、両者の値が異なれば（ＮＯ）、第１スタックメモリ７に退避させた情報が書き換えられたことを示すので、スタックオーバーフローを検出したことになる（Ｓ１３）。したがって、第１スタックメモリ７からポップした情報は使用せず、それに替えて第２スタックメモリ９からポップした情報を使用する（Ｓ１４）。すなわち、第２スタックメモリ９からポップしたアドレス情報をプログラムカウンタにロードし、第２スタックメモリ９からポップしたレジスタ情報を対応する各レジスタにロードして処理を実行する。
【００１７】
以上のように本実施形態によれば、プログラム及びそのプログラムで使用するデータが記憶される第１記憶装置３とは別個に、第１記憶装置３に定義される第１スタックメモリ７に対するプッシュ命令又はポップ命令の実行時のみ、ＣＰＵ２がアクセス可能となるように構成される第２記憶装置４を備える。また、ＣＰＵ２には、第１スタックメモリ７のアクセスアドレス情報を保持する第１スタックポインタ８とは別に、第２記憶装置４に定義される第２スタックメモリ９のアクセスアドレス情報を保持する第２スタックポインタ１０を用意する。
【００１８】
ＣＰＵ２は、プログラムのメインルーチンからサブルーチンを呼び出す際に、退避させるレジスタ情報と戻りアドレス情報とを第１スタックメモリ７へプッシュする命令を実行すると、第２スタックメモリ９に対しても前記各情報のプッシュ動作を同時に行い、前記各情報を第１スタックメモリ７からポップする命令を実行すると、第２スタックメモリ９からも対応する情報のポップ動作を同時に行い、それらの情報内容を比較して、両者が異なればスタックオーバーフローの発生を検出する。加えて、第２スタックメモリ９からポップしたアドレス情報をプログラムカウンタにロードし、第２スタックメモリ９からポップしたレジスタ情報を対応する各レジスタにロードする。
【００１９】
すなわち、プログラムから参照できるのは第１記憶装置３のみであるから、たとえ改竄されたプログラムが実行されて、第１記憶装置３側の第１スタックメモリ７が不正に書き換えられることがあっても第２記憶装置４にアクセスすることはできず、第２スタックメモリ９の内容は保持される。そして、スタックオーバーフローの発生が検出されると、第２スタックメモリ９からポップした戻りアドレス情報がプログラムカウンタにロードされると同時にレジスタ情報が対応する各レジスタにロードされるので、ＣＰＵ２は本来のプログラムの実行を確実に継続することができる。
【００２０】
（第２実施形態）
以下、第１実施形態と同一部分には同一符号を付して説明を省略し、以下異なる部分について説明する。図３に示すように、第２実施形態のプロセッサ１２は、ＣＰＵ２に替わるＣＰＵ１２を備えると共に、第３記憶装置１３を備えている。第３記憶装置１３には
セキュリティプログラム１４（緊急時用プログラム）が配置されるが、第３記憶装置１３はＲＯＭでも良いし、第１記憶装置３と同様に、ＲＯＭからロードされたセキュリティプログラム１４が配置されているＲＡＭでも良い。セキュリティプログラム１４は、以下に説明するように、ＣＰＵ２がスタックオーバーフローを検出した際に、その検出を外部に通知するためのプログラムである。
【００２１】
次に、第２実施形態の作用について説明する。図４に示すように、第２実施形態では、ＣＰＵ１２がステップＳ１３においてスタックオーバーフローを検出すると、命令フェッチメモリを、第１記憶装置３から第３記憶装置１３に切り換え（Ｓ２１）、プログラムカウンタ（ＰＣ）の値を、セキュリティプログラム１４のスタート番地に書き換える（Ｓ２２）。尚、これらのステップＳ２１及びＳ２２の処理も、ハードロジックで行われる。それからステップＳ２に移行するので、セキュリティプログラム１４の実行が開始される。
【００２２】
図５に示すように、セキュリティプログラム１４では、第２記憶装置４をデータ記憶用のメモリとして使用する（Ｓ３１）。そして、命令フェッチを行い（Ｓ３２）データを読み出すと（Ｓ３３）、フェッチした命令を実行し（Ｓ３４）、実行した結果得られたデータを第２記憶装置４に書き込んで記憶させる（Ｓ３５）。それからステップＳ３２に戻る。このセキュリティプログラム１４の実質的な処理内容は、前述のように、スタックオーバーフローの検出をプロセッサ１２の外部に通知するもので、例えばペリフェラルのＩ／Ｏポートにスタックオーバーフロー信号を出力したり、外部ステータスレジスタのスタックオーバーフロー通知レジスタにおいてスタックオーバーフローのアサート信号をキャプチャしておくことで、外部システムに通知するなどの処理を行うようにしても良い。
【００２３】
以上のように第２実施形態によれば、プロセッサ１１に、セキュリティプログラム１４が記憶される第３記憶装置１３を別途備える。そして、ＣＰＵ１２は、スタックオーバーフローの発生を検出すると、プログラムカウンタにセキュリティプログラム１４へのアクセスアドレスをロードして、当該セキュリティプログラム１４を実行する。したがって、その実行によりスタックオーバーフローの発生に対処することができる。
【００２４】
本発明は上記した、又は図面に記載した実施例にのみ限定されるものではなく、以下のような変形又は拡張が可能である。
スタックオーバーフローが検出された場合、ＣＰＵ２をリセットさせるとともに、プログラムＲＯＭより第１記憶装置３にプログラムをリロードさせて再度実行させても良い。
緊急時用プログラムは、セキュリティプログラム１４に限ることなく、スタックオーバーフローが検出された際に実行することが適切なプログラムを、個別の設計に応じて適宜選択すれば良い。
第１，第３記憶装置については、処理時間に問題がなければ、書き換え可能なＲＯＭを用いても良い。
【符号の説明】
【００２５】
図面中、１はプロセッサ、２はＣＰＵ、３は第１記憶装置、４は第２記憶装置、７は第１スタックメモリ（第１スタックメモリ領域）、８は第１スタックポインタ、９は第２スタックメモリ（第２スタックメモリ領域）、１０は第２スタックポインタを示す。
【図１】
2015011436.tif 000003
【図２】
2015011436.tif 000004
【図３】
2015011436.tif 000005
【図４】
2015011436.tif 000006
【図５】
2015011436.tif 000007