(57)【要約】  バッファオーバーフロー攻撃があり得る書き込み動作を、書き込み動作が記録される元の目的地の代りに他の場所に保存しながら、書き込み動作中にバッファオーバーフロー攻撃があるか否かを感知し、バッファオーバーフロー攻撃があると感知されない場合には、所定の間隔で保存された内容を書き込み動作が記録される元の目的地に保存し、バッファオーバーフロー攻撃があると感知される場合、攻撃による安全でない書き込みは捨て、バッファオーバーフロー攻撃があると感知されれば、それ以後の安全でない書き込みを保存せずに無視し、効果的にコンピュータに発生しうるバッファオーバーフロー攻撃を感知し、攻撃を受けた場合にも被害を最小化しながら攻撃以前の状態に復旧／復帰でき、本発明の方法によってコンピュータシステムの性能低下は最小化しつつ、効果的にシステムを防御できるようにするので、その結果、コンピュータ及びインターネットを使用する環境を大きく改善できる。
2007529818.tif 000002
【特許請求の範囲】
【請求項１】
バッファオーバーフロー攻撃を感知する方法において、
(ａ)プロセッサ復帰命令語をフェッチする時に、復帰命令語が示すアドレスを感知する段階と、
(ｂ)前記感知されたアドレスがプロセッサのスタック領域に存在する否かを判断する段階と、
(ｃ)前記感知されたアドレスがスタック領域に存在する場合、前記復帰命令は不正であり、バッファオーバーフロー攻撃があると判断する段階と、を含むことを特徴とするバッファオーバーフロー攻撃の感知方法。
【請求項２】
前記(ｃ)段階で、不正命令であると判断された復帰命令は、実行せずに捨てることを特徴とする請求項１に記載のバッファオーバーフロー攻撃の感知方法。
【請求項３】
バッファオーバーフロー攻撃を感知する装置において、
プロセッサ復帰命令語をフェッチする時に、復帰命令語が示すアドレスを感知するアドレス感知部と、
前記アドレス感知部で感知したアドレスがプロセッサのスタック領域に存在する否かを判断する確認部と、
前記確認部で、前記アドレス感知部で感知したアドレスがスタック領域に存在すると判断する場合、前記復帰命令は不正であり、バッファオーバーフロー攻撃があると判断する攻撃判断部と、を備えることを特徴とするバッファオーバーフロー攻撃の感知装置。
【請求項４】
前記攻撃判断部は、バッファオーバーフロー攻撃によって不正命令であると判断された復帰命令は、それ以上実行させずに無視することを特徴とする請求項３に記載のバッファオーバーフロー攻撃の感知装置。
【請求項５】
バッファオーバーフロー攻撃を感知する方法において、
(ａ)所定の保存命令を行った後に復帰するアドレスを感知する段階と、
(ｂ)プロセッサのスタック領域内の連続的な保存命令が前記復帰するアドレスを修正するか否かを判断する段階と、
(ｃ)前記(ｂ)段階で、連続的な保存命令が前記復帰するアドレスを修正すると判断されれば、バッファオーバーフロー攻撃があると判断する段階と、を含むことを特徴とするバッファオーバーフロー攻撃の感知方法。
【請求項６】
前記(ａ)段階で、前記所定の保存命令を行った後に復帰するアドレスを所定のスタックに保存し、
前記(ｂ)段階で、前記連続的な保存命令の保存範囲が前記スタックに保存されたアドレスと相反するか否かを判断して、前記復帰するアドレスが侵犯されて修正されると判断することを特徴とする請求項５に記載のバッファオーバーフロー攻撃の感知方法。
【請求項７】
バッファオーバーフロー攻撃を感知する装置において、
所定の保存命令を行った後に復帰するアドレスを感知するアドレス感知部と、
プロセッサのスタック領域内の連続的な保存命令が前記アドレス感知部により復帰するアドレスを修正するか否かを判断するアドレス修正判断部と、
前記アドレス修正判断部で連続的な保存命令が前記復帰するアドレスを修正すると判断すれば、バッファオーバーフロー攻撃があると判断する攻撃判断部と、を備えることを特徴とするバッファオーバーフロー攻撃の感知装置。
【請求項８】
前記アドレス感知部は、前記所定の保存命令を行った後に復帰するアドレスを所定のスタックに保存し、
前記アドレス修正判断部は、前記連続的な保存命令の保存範囲が前記スタックに保存されたアドレスと相反するか否かを判断して、前記復帰するアドレスが侵犯されて修正されると判断することを特徴とする請求項７に記載のバッファオーバーフロー攻撃の感知装置。
【請求項９】
バッファオーバーフロー攻撃からプロセッサの動作状態を復旧する方法において、
(ａ)バッファオーバーフロー攻撃があり得る書き込み動作を、書き込み動作が記録される元の目的地の代りに所定の他の場所に保存しながら、前記書き込み動作中にバッファオーバーフロー攻撃があるか否かを感知する段階と、
(ｂ)バッファオーバーフロー攻撃があると感知されない場合には、所定の間隔で前記保存された内容を書き込み動作が記録される元の目的地に保存し、バッファオーバーフロー攻撃があると感知される場合、攻撃による安全でない書き込みは捨てる段階と、
(ｃ)バッファオーバーフロー攻撃があると感知されれば、それ以後の安全でない書き込みを保存せずに無視する段階と、を含むことを特徴とするバッファオーバーフロー攻撃からの復旧方法。
【請求項１０】
前記(ｂ)段階で、バッファオーバーフロー攻撃が感知される場合、攻撃の発生前に保存された書き込みも書き込み動作が記録される元の目的地に保存することを特徴とする請求項９に記載のバッファオーバーフロー攻撃からの復旧方法。
【請求項１１】
前記(ａ)段階で、前記書き込み動作が記録される元の目的地の連続的なメモリ領域で、二番目の継続的な書き込みがある場合には、前記書き込みを所定の他の場所に保存し、そうでない場合には、書き込み動作が記録される元の目的地に記録することを特徴とする請求項９に記載のバッファオーバーフロー攻撃からの復旧方法。
【請求項１２】
前記書き込み動作の元の目的地に読み取り動作を通じて接近する場合、前記元の目的地と前記書き込み動作が保存される場所とに同時に接近し、
読み取り動作のアドレスが前記書き込み動作が保存される場所にあり、まだ元の目的地に保存されない場合には、前記書き込み動作が保存される場所から前記読み取り動作が要求するデータを供給することを特徴とする請求項９に記載のバッファオーバーフロー攻撃からの復旧方法。
【請求項１３】
バッファオーバーフロー攻撃からプロセッサの動作状態を復旧する装置において、
バッファオーバーフロー攻撃があり得る書き込み動作を書き込み動作が記録される元のメモリ領域の代りに所定の他の保存手段に保存する保存部と、
前記書き込み動作中にバッファオーバーフロー攻撃があるか否かを感知する攻撃感知部と、
バッファオーバーフロー攻撃があると感知されない場合には、所定の間隔で前記所定の他の保存手段に保存された内容を書き込み動作が記録される元のメモリ領域に保存し、バッファオーバーフロー攻撃があると感知される場合、攻撃による安全でない書き込みは捨てる保存管理部と、
バッファオーバーフロー攻撃があると感知されれば、その後の安全でない書き込みを前記所定の他の保存手段に保存せずに無視する記録管理部と、を備えることを特徴とするバッファオーバーフロー攻撃からの復旧装置。
【請求項１４】
前記保存管理部は、バッファオーバーフロー攻撃が感知される場合、攻撃の発生前に保存された書き込みも書き込み動作が記録される元のメモリ領域に保存することを特徴とするバッファオーバーフロー攻撃からの復旧装置。
【請求項１５】
前記保存部は、前記書き込み動作が記録される元のメモリ領域の連続的な領域で、二番目の継続的な書き込みがある場合には、前記書き込みを所定の他の保存手段に保存し、そうでない場合には、書き込み動作が記録される元のメモリ領域に記録することを特徴とする請求項１３に記載のバッファオーバーフロー攻撃からの復旧装置。
【請求項１６】
前記書き込み動作が記録される元のメモリ領域への読み取り動作を管理する引出し管理部をさらに備え、
前記引出し管理部は、前記書き込み動作の元のメモリ領域に読み取り動作がある場合、前記元のメモリ領域と前記保存部により保存される所定の他の保存手段に同時に接近して、読み取り動作の目的地アドレスが前記所定の他の保存手段にあり、まだ元のメモリ領域に保存されない場合には、前記所定の他の保存手段から前記読み取り動作が要求するデータを供給することを特徴とする請求項１３に記載のバッファオーバーフロー攻撃からの復旧装置。
【請求項１７】
前記保存部が保存する所定の他の保存手段は、先入れ先出し方式のＦＩＦＯ素子であることを特徴とする請求項１３ないし請求項１６のうちいずれか一項に記載のバッファオーバーフロー攻撃からの復旧装置。
【請求項１８】
前記保存管理部が前記ＦＩＦＯ素子に保存された内容を書き込み動作が記録される元のメモリ領域に保存する所定の間隔は、ＦＩＦＯ素子の容量で決定されうることを特徴とする請求項１７に記載のバッファオーバーフロー攻撃からの復旧装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はコンピュータに係り、コンピュータ動作を妨害するバッファオーバーフロー攻撃を感知し、復旧する方法及びその装置に関する。
【背景技術】
【０００２】
バッファオーバーフロー(ｂｕｆｆｅｒ  ｏｖｅｒｆｌｏｗ)攻撃は、Ｃｏｄｅ  ＲｅｄとＳＱＬ  Ｓｌａｍｍｅｒワーム(Ｗｏｒｍ)のような最近のワームの発生から分かるように、最も強力で致命的な形態の悪性コード攻撃である。
【０００３】
本発明は、そのような悪性コードを利用した攻撃を探知し且つ復旧できる方法を提供する。
【０００４】
バッファオーバーフロー攻撃は、一般的にシステムのデータを破壊し、またプログラム実行の流れを変更させるかのように異常な症状を引き起こすが、このような症状は、プログラム実行中に命令語参照とデータ参照との安全性を点検することによってハードウェアが簡単に感知できる。かかる命令語参照及びデータ参照の安全点検装置と共にセキュリティ（保安）のレベルを上昇させるための方策として、変造復旧バッファ(Ｃｏｒｒｕｐｔｉｏｎ  Ｒｅｃｏｖｅｒｙ  Ｂｕｆｆｅｒ、ＣＲＢ)と呼ばれるさらに強い技術を提案する。安全点検装置と結合されたＣＲＢは、バッファオーバーフロー攻撃により引き起こされる疑わしいメモリ記録を一時的に保存することによって、攻撃が感知される場合にメモリの状態を攻撃以前の状態に復旧させることができる。
【０００５】
バッファバッファオーバーフローに対する脆弱性及びこれを利用した悪性コード攻撃は、インターネット/コンピュータセキュリティ問題のうち最も致命的な形態のセキュリティ問題である。第一の理由は、バッファがオーバーフローされることは、バッファ近くのデータを破壊するだけでなく、プログラムに対する制御を奪って悪意の目的を持った任意のコードを実行させうるからである。第二の理由は、悪性コードは、人の操作がなくても自ら複製、伝播されるため、悪性コード攻撃のあらゆる形態のうちでも、最も速い伝播速度を有するからである。第三の理由は、バッファオーバーフロー攻撃は、１９８８年に最初のワームウイルスが、このようなバッファオーバーフロー攻撃の形態で起こり、最も長くかつ今後も最も持続的に攻撃が予想されるからである。最後に、バッファオーバーフロー攻撃は、悪性コード攻撃のうち最も頻繁に発生する攻撃形態でもある。
【０００６】
多様なソフトウェア的な解決策が運営体制の修正、コンパイラツールとパッチ、デバッギングツール、及び動的ライブラリなどの形態で提案されたが、それらは根本的にレガシー(ｌｅｇａｃｙ)応用プログラムにはとても無力であるか、または深刻な性能障害要因を含むこともある。相変らず、対応策として最も多く使われるものは、脆弱点が発見された部分のソースコードを修正した後、再度コンパイルしてパッチ及び修正事項を製作した後、これを該当プログラムユーザーをして直接にダウンロードさせるものである。しかし、これは、脆弱なソースが公開的に知られた後に特定された製品の特定の脆弱性をさらに公開するだけで、根本的な対策ではない。
【発明の開示】
【発明が解決しようとする課題】
【０００７】
本発明が達成しようとする技術的な課題は、前記の問題点を解決するために、コンピュータにおいて発生する悪性コードを利用したバッファオーバーフロー攻撃を感知し、復旧できる方法及びその装置を提供するところにある。
【課題を解決するための手段】
【０００８】
前記技術的課題を解決するための本発明によるバッファオーバーフロー攻撃の感知方法の一態様は、(ａ)プロセッサ復帰命令語をフェッチする時に、復帰命令語が示すアドレスを感知する段階と、(ｂ)前記感知されたアドレスがプロセッサのスタック領域に存在する否かを判断する段階と、(ｃ)前記感知されたアドレスがスタック領域に存在する場合、前記復帰命令は不正であり、バッファオーバーフロー攻撃があると判断する段階とを含むことを特徴とする。
【０００９】
前記他の技術的課題を解決するための本発明によるバッファオーバーフロー攻撃の感知装置の一態様は、プロセッサ復帰命令語をフェッチする時に、復帰命令語が示すアドレスを感知するアドレス感知部と、前記アドレス感知部で感知したアドレスがプロセッサのスタック領域に存在する否かを判断する確認部と、前記確認部で前記アドレス感知部で感知したアドレスがスタック領域に存在すると判断する場合、前記復帰命令は不正であり、バッファオーバーフロー攻撃があると判断する攻撃判断部とを備えることを特徴とする。
【００１０】
前記技術的課題を解決するための本発明による、バッファオーバーフロー攻撃の感知方法の他の態様は、(ａ)所定の保存命令を行った後に復帰するアドレスを感知する段階と、(ｂ)プロセッサのスタック領域内の連続的な保存命令が前記復帰するアドレスを修正するか否かを判断する段階と、(ｃ)前記(ｂ)段階で、連続的な保存命令が前記復帰するアドレスを修正すると判断されれば、バッファオーバーフロー攻撃があると判断する段階とを含むことを特徴とする。
【００１１】
前記他の技術的課題を解決するための本発明によるバッファオーバーフロー攻撃の感知装置の他の態様は、所定の保存命令を行った後に復帰するアドレスを感知するアドレス感知部と、プロセッサのスタック領域内の連続的な保存命令が前記アドレス感知部により復帰するアドレスを修正するか否かを判断するアドレス修正判断部と、前記アドレス修正判断部で連続的な保存命令が前記復帰するアドレスを修正すると判断すれば、バッファオーバーフロー攻撃があると判断する攻撃判断部とを備えることを特徴とする。
【００１２】
前記技術的課題を解決するための本発明によるバッファオーバーフロー攻撃からの復旧方法は、バッファオーバーフロー攻撃からプロセッサの動作状態を復旧する方法において、(ａ)バッファオーバーフロー攻撃があり得る書き込み動作を、書き込み動作が記録される元の目的地の代りに所定の他の場所に保存しながら、前記書き込み動作中にバッファオーバーフロー攻撃があるか否かを感知する段階と、(ｂ)バッファオーバーフロー攻撃があると感知されない場合には、所定の間隔で前記保存された内容を書き込み動作が記録される元の目的地に保存し、バッファオーバーフロー攻撃があると感知される場合、攻撃による安全でない書き込みは捨てる段階と、(ｃ)バッファオーバーフロー攻撃があると感知されれば、それ以後の安全でない書き込みを保存せずに無視する段階とを含むことを特徴とする。
【００１３】
前記他の技術的課題を解決するための本発明によるバッファオーバーフロー攻撃からの復旧装置は、バッファオーバーフロー攻撃からプロセッサの動作状態を復旧する装置において、バッファオーバーフロー攻撃があり得る書き込み動作を、書き込み動作が記録される元のメモリ領域の代りに所定の他の保存手段に保存する保存部と、前記書き込み動作中にバッファオーバーフロー攻撃があるか否かを感知する攻撃感知部と、バッファオーバーフロー攻撃があると感知されない場合には、所定の間隔で前記所定の他の保存手段に保存された内容を書き込み動作が記録される元のメモリ領域に保存し、バッファオーバーフロー攻撃があると感知される場合、攻撃による安全でない書き込みは捨てる保存管理部と、バッファオーバーフロー攻撃があると感知されれば、それ以後の安全でない書き込みを前記所定の他の保存手段に保存せずに無視する記録管理部とを備えることを特徴とする。
【発明の効果】
【００１４】
本発明を利用すれば、効果的にコンピュータに発生しうるバッファオーバーフロー攻撃を感知し、攻撃を受けた場合にも被害を最小化しながら攻撃以前の状態に復旧／復帰でき、具現方法によってコンピュータシステムの性能の低下は最小化しつつ、効果的にシステムを防御できるので、その結果、コンピュータ及びインターネットを使用する環境を大きく改善できる。
【発明を実施するための最良の形態】
【００１５】
以下、添付した図面を参照して、本発明の望ましい一実施形態を詳細に説明する。
【００１６】
バッファオーバーフロー攻撃は、ハードウェアによって簡単に感知できる異常な症状や跡を残すことが普通である。例えば、スタックスマッシングと呼ばれるバッファオーバーフロー攻撃の最も多い形態は、プロセスのローカルスタックフレームの復帰アドレスを変更し、これは普通プログラム遂行中には可能でない。同様に、悪性コードは、よくプログラムアドレス空間のスタックやデータ領域から命令語をフェッチしようとするが、これも普通のプログラム遂行ではあまり生じない動作である。
【００１７】
このような異常な症状を検出するために、本発明は、命令語とデータ参照のアドレス領域とを検査して、その安全性を検証する安全保護装置(ｓａｆｅｔｙ  ｇｕａｒｄ)と呼ばれるマイクロ構造技術を導入する。また、疑わしい書き込みを保存して攻撃が感知される場合、システムを攻撃以前の状態に戻しうる変造復旧バッファ(Ｃｏｒｒｕｐｔｉｏｎ  Ｒｅｃｏｖｅｒｙ  Ｂｕｆｆｅｒ：ＣＲＢ)というさらに強いセキュリティ技術を提示する。
【００１８】
バッファオーバーフロー攻撃は、オーバーフローされた変数近くの変造されるデータによって始まる。プロセスアドレス空間のプログラムテキスト領域は、書き込みが禁止されているために、スタック、ヒープ、あるいは静的データのようなデータ領域のみ変造される。図１は、スタックスマッシング攻撃がどのようにｘ８６系列プロセッサの復帰アドレスを変更できるかを示す。
【００１９】
ｘ８６プロセッサにおいて、ＥＢＰはスタックの底部、ＥＳＰはスタックの上部を示し、ＥＢＰとＥＳＰとが示す領域は、一プロシージャに該当するスタックフレーム１００である。スタックフレーム１００には、ローカル変数１１０、因子１２０、復帰アドレス１３０、以前フレームポインタ(ＥＢＰ)１４０が保存されている。ここで、ローカル変数１１０または因子１２０がオーバーフロー攻撃の対象となるバッファ変数であり、このようなバッファ攻撃は、参照番号１００のスタックフレームの下から上にスタックにある近くのデータを上書きし、結局は、復帰アドレス１３０を変更させる。この変更された復帰アドレス１５０は、一般的に外部から入力された悪性コードの開始アドレスを示し、現在攻撃が発生した関数が復帰するときの変更された復帰アドレス１５０への復帰、すなわち悪性コードを開始して悪性コードが実行されるのである。
【００２０】
ｓｔｒｃｐｙのように脆弱点がある関数がローカル変数に入力を読み込む時、外部入力は関数のスタックフレーム内で該当変数のみならず、近く領域のデータにオーバーフローされ、これは、結果的に復帰アドレスを変造させうる。
【００２１】
図２は、バッファオーバーフロー攻撃により作られた制御及びデータ変造の種類を分類した図である。何時そして何処でデータが変造されたかによって、プログラム実行中のエラー発生如何が決定される。変造されたデータ項目がそれ以後に全く参照されなければ、データ変造は、プログラム実行に影響を及ぼさないであろう。以下では、かかる場合を“使用しないデータ変造”という。もし、同じ位置でさらに早い時点で同じ攻撃が発生すれば、そのデータは、参照され且つ深刻な問題を起こしうる。したがって、データ変造の効果は、その位置だけでなく攻撃の時点にも影響を受ける。変造されたデータ項目が後に参照される場合を、以下では“活動性データ変造”と言及する。
【００２２】
活動性データ変造は、次のような３種類に分類されうる。第一の種類は、変造されたデータがリターン命令あるいは間接分岐命令のような分岐命令語の目的アドレスとして使われる場合、これを“目的アドレス変造”と呼ぶ。このような場合、変更された分岐目的アドレスから命令語をフェッチする場合に、プログラムの実行流れが変更される。ほとんどのバッファオーバーフロー攻撃は、スタックフレームの復帰アドレスあるいはスタックまたはヒープ領域での関数ポインタを目標として、このような制御データの変造を通じて悪性コード攻撃を試みる。
【００２３】
データ変造の第二の種類は、攻撃が分岐命令の条件を変更する時に発生する。これも復帰アドレスや関数ポインタを変更せずとも、プログラム制御流れに対する変更を誘発しうる。以下では、このようなものを“分岐条件変造”という。例えば、
if (a>0) then call func#a(a) else func#b(a);
のようなコードで変数ａの値によって他の関数が引出されうる。すなわち、変数ａの値が変造されれば、正常に引出される関数でない他の関数を引き出すことによって制御流れを変更するのである。
【００２４】
以下では、活動性（ライブ）データ変造の他のあらゆる場合を“純粋データ変造”という。この場合、制御の流れを直接的に変えないが、その後プログラムによって参照される活動性データを変更する。この場合、正常なプログラムの実行のように見えるが、誤った結果や状態を引き起こし得る。なお、データ変造は、他のデータ位置に伝播され、その結果、分岐目標変造あるいは分岐条件変造につながりうる。
【００２５】
前記の活動性データ変造の３種類の場合、いずれも異常な実行または終了を起こしうる。変造されたデータ項目を参照することは、正しくない被演算子によって発生するエラーと関連したデータ参照例外あるいは実行につながりやすい。例えば、変造されたデータアドレスからロードすることは、ＴＬＢミス、ページミス、あるいは接近違反につながりうる。たとえ、変造されたデータ項目が成功的に参照されるとしても、以後の演算過程でオーバーフローやフローティングポイント例外などを起こしうる。
【００２６】
変造されたデータ項目が条件分岐の分岐条件あるいは間接分岐の分岐目標として使われる場合、実行制御流れを変更させる。特に、正しくない目標アドレスから命令語をフェッチする場合を“制御変造”と呼ぶ。これは、バッファオーバーフロー攻撃によって発生した正しくない制御流れを意味する。これは、分岐目標が外部から入ったワームコードに対するポインタに変更される場合、悪性コードの実行につながりうる。以下では、このような制御変造を“外部コード制御変造”という。悪性コードは、自ら複製されて他の脆弱なホストに伝播されるため、バッファオーバーフロー攻撃の最も深刻な結果と言える。また、これは、バッファオーバーフロー攻撃の最も多い形態でもある。制御変造のさらに他の形態は、変更された分岐目標がテキスト領域の正常なコードを示す時である。これを“内部コード制御変造”と呼ぶ。
【００２７】
以下、本発明によってバッファオーバーフロー攻撃感知を行う安全点検の流れを説明する。
【００２８】
攻撃を受けるシステムは、データ及び命令語の参照時に異常な症状を示す。例えば、スタックスマッシング攻撃は、スタック内部のローカル変数のみならず、復帰アドレスまで上書きされる。さらに、よく現在のスタックフレームの外側のスタック領域に自身に随伴した悪意のコードを複写するが、このいずれの場合も普通のプログラム実行中には可能でない。また、攻撃を受けたプログラムは、スタック領域から命令語をフェッチする。リナックスの「シグナルハンドラ（ｓｉｇｎａｌ ｈａｎｄｌｅｒｓ）」あるいはｇｃｃの「トランポリン（ｔｒａｍｐｏｌｉｎｅｓ）」関数のようなまれな場合以外には、スタックから命令語をフェッチすることは普通でない。異常な命令語または異常なデータ参照は、参照されているアドレスに対する安全検査を通じて実行途中に容易に探知できる。
【００２９】
図３は、本発明によってバッファオーバーフロー攻撃を感知する方法の一例を示すフローチャートである。
【００３０】
この方法は、プロセッサ復帰命令語をフェッチする時に復帰命令語が示すアドレスを感知し(３００段階)、感知されたアドレスがプロセッサのスタック領域に存在するか否かを判断し(３１０段階)、感知されたアドレスがスタック領域に存在する場合、前記復帰命令は不正であり、バッファオーバーフロー攻撃があると判断する(３２０段階)。
【００３１】
図４は、図３の方法を実施するためのバッファオーバーフロー攻撃を感知装置の構成を示すブロック図である。
【００３２】
この装置は、プロセッサ復帰命令語をフェッチする時に復帰命令語が示すアドレスを感知するアドレス感知部４００、アドレス感知部４００で感知したアドレスがプロセッサのスタック領域に存在する否かを判断する確認部４１０、及び確認部４１０で、アドレス感知部４００で感知したアドレスがスタック領域に存在すると判断する場合、前記復帰命令は不正であり、バッファオーバーフロー攻撃があると判断する攻撃判断部４２０を備える。
【００３３】
この場合、攻撃判断部４２０は、３２０段階で不正命令であると判断された復帰命令は実行せずに捨てることが望ましい。
【００３４】
以下、本発明がＣＰＵのようなプロセッサに含まれて具現化された場合を例として挙げて詳細に説明する。これは、プロセッサがどのようにバッファオーバーフロー攻撃によるデータあるいは制御変造に対抗してシステムを防御できるかを示す。
【００３５】
プロセッサから命令語をフェッチするときに、図４の装置は、結局次のような動作を行う。
【００３６】
復帰命令が示すアドレスがスタック領域に存在する時、復帰命令は、正しくないと判断する。
【００３７】
もし、プログラムカウンターがスタック領域内の一地点を示すならば、該当命令語は安全でないと判断されて捨てられる。しかし、このような方法は、ｇｃｃ  ｔｒａｍｐｏｌｉｎｅｓ関数またはリナックスシグナルハンドラのように、スタック領域から命令語をフェッチしなければならない例外的な場合に問題となりうる。
【００３８】
バッファオーバーフローを発生させる悪性コードは、多くの場合に復帰アドレスを上書きするため、スタック領域に制御を変える命令語は、復帰命令語となる。しかし、ｔｒａｍｐｏｌｉｎｅｓまたはリナックスシグナルハンドラの場合は、復帰命令語ではない呼び出し命令語によって呼ばれる。したがって、復帰命令語の目標アドレスがスタック領域を表すか否かを検査することで、ｔｒａｍｐｏｌｉｎｅｓ関数による正常な命令語と悪性コード攻撃による異常な命令語とを区分できる。命令語を実行する間のこのような種類の安全検査を安全点検といい、復帰命令語に対する特定の場合の参照安全検査を命令語参照安全点検という。
【００３９】
これは、簡単な範囲チェックであり、本発明を具現化する場合にハードウェアー的な費用または性能面での損失なしにハードウェアで具現化されうる。
【００４０】
外部から入った悪性コードは、ほどんどの場合、プログラムのアドレス空間のうちスタック領域にのみ存在できるため、命令語参照安全点検は、バッファオーバーフロー攻撃によって作られた外部コード制御変造を効果的に除去できる。しかし、これは、テキスト領域から命令語をフェッチする内部コード制御変造は防止し難い場合が発生しうる。また、これは、分岐条件でない分岐目標アドレスのみを検査するので、分岐条件変造によって発生する制御変造も防止し難いこともある。
【００４１】
攻撃の初期段階で攻撃を感知して防止することがいつも有利な方法である。したがって、データ変造段階でシステムを防御することが、制御変造後にシステムを防御することよりシステムに加えられる被害を減らすことができる。命令語参照安全保護以外に、図５に示すように他の安全保護策がデータ変造段階で提供されうる。
【００４２】
図５は、本発明によるバッファオーバーフロー攻撃を感知する方法の他の例を示すフローチャートである。
【００４３】
この方法は、所定の保存命令を行った後に復帰するアドレスを感知し(５００段階)、プロセッサのスタック領域内の連続的な保存命令が前記復帰するアドレスを修正するか否かを判断し(５１０段階)、５１０段階で連続的な保存命令が前記復帰するアドレスを修正すると判断されれば、バッファオーバーフロー攻撃があると判断する(５２０段階)。
【００４４】
図６は、図５の方法を実施するためのバッファオーバーフロー攻撃を感知する装置の構成を示すブロック図である。
【００４５】
この装置は、所定の保存命令を行った後に復帰するアドレスを感知するアドレス感知部６００、プロセッサのスタック領域内の連続的な保存命令がアドレス感知部６００によって復帰するアドレスを修正するか否かを判断するアドレス修正判断部６１０、及びアドレス修正判断部６１０で連続的な保存命令が前記復帰するアドレスを修正すると判断すれば、バッファオーバーフロー攻撃があると判断する攻撃判断部６２０を備える。
【００４６】
図６の装置は、結果的に次のような動作を行う。
【００４７】
スタック領域内の連続的な保存命令が復帰アドレスを修正する時、これは異常なものであると判断する。
【００４８】
復帰アドレスが保存された位置に対して連続的な保存命令語のアドレス領域を検査することで、復帰アドレスあるいはフレームポインタの変造からシステムを保護することができる。このような安全保護をデータ参照安全点検という。復帰アドレスが修正されることを防止することによって、スタックスマッシング攻撃によって制御変造が起こることを防止することができる。この安全保護を使用するために、復帰アドレスが保存される所のアドレスを知っている必要がある。そのために、この場合、アドレス感知部６００は、参照番号５００段階で所定の保存命令を行った後に復帰するアドレスを所定のスタックに保存し、アドレス修正判断部６１０は、前記連続的な保存命令の保存範囲が前記スタックに保存されたアドレスと相反するか否かを判断して、前記復帰するアドレスが侵犯されて修正されると判断することが望ましい。
【００４９】
これに関する説明のために、本発明では、復帰アドレスポインタスタック(Ｒｅｔｕｒｎ  Ａｄｄｒｅｓｓ  Ｐｏｉｎｔｅｒ  Ｓｔａｃｋ、以下ＲＡＰＳという）の概念を使用する。
【００５０】
図７は、本発明によるＲＡＰＳの構造を示す。復帰アドレスがスタックに保存される度に、保存される所のアドレスがＲＡＰＳにプッシュされる。復帰アドレスがスタックから読み取られるとき、ＲＡＰＳでポップ(ｐｏｐ)演算が起こる。ｘ８６プロセッサにおいてｓｅｔｊｍｐ、ｌｏｎｇｊｍｐのような場合には、下記数式のように数回のポップ演算が同時に起こらなければならない。
【００５１】
while (RAPS(top) < ESP) pop RAPS;
二つの連続的な保存演算がスタック内の低いアドレスから高いアドレス方向につながる連続的な領域に起こるとき、ＲＡＰＳは、開始地点と終了地点とを記憶する二つのポインタ(それぞれ、ＳｔａｒｔＰｔｒとＥｎｄＰｔｒ)を利用してこの範囲を記憶する。もし、連続的な保存範囲がＲＡＰＳのＴｏｐに保存されたアドレスを侵犯すれば(すなわち、連続的な保存範囲とＲＡＰＳに保存されたアドレスとの間に衝突が発生すれば)データ参照安全点検装置は、安全違反を知らせる。
【００５２】
ほとんどのバッファオーバーフロー攻撃は、最も外側のスタックフレーム付近の復帰アドレスを変造させる。もし、オーバーフローされた変数が現在スタックフレーム内のローカル変数である場合、すぐ以前のスタックフレーム内の復帰アドレスが悪性コードによって変造される。しかし、オーバーフローされた変数がポインタによる呼び出しによって伝えられた因子である場合、実際のバッファオーバーフローは、以前スタックフレームで発生し、その一つ以前のスタックフレーム内の復帰アドレスが変造される。すなわち、オーバーフローが起こる変数が参照による呼び出し方式で伝えられる場合、いかなるスタックフレームでもバッファオーバーフロー攻撃が発生しうる。したがって、ＲＡＰＳ内のあらゆる値に対して連続的な保存の範囲が検査されなければならない。しかし、ほとんどの攻撃は、最も最近のスタックフレーム付近の復帰アドレスを目標とするので、数個の最近復帰アドレスのみを検査することも十分に良い方法となる。
【００５３】
前記のように動作されるデータ参照安全点検装置が具現化される場合、ハードウェアコスト面では命令語参照安全点検に比べて高くなるが、制御及びデータ変造に対してはさらに高いレベルの防御を提供するようになる。
【００５４】
バッファオーバーフロー攻撃からの元の状態の復旧
プロセッサのような素子に具現化されうる前述された本発明による安全点検装置によって、危険なメモリ参照を探知すれば、いくつかの対応方法を選択できる。
【００５５】
第一の方法は、攻撃を受けるプロセスを終了しうる。しかし、これは、攻撃者がプロセスを終了するのに成功することであるので、サービス拒否状態を発生させうる。
【００５６】
第二の方法は、現在攻撃される関数の実施を終了し、その制御流れを強制的に呼び出し者に戻す方法である。これを強制復帰(ｃｏｍｐｕｌｓｏｒｙ  ｒｅｔｕｒｎ)という。これは、本発明による装置が復帰アドレスの位置を追跡して、強制的にＰＣ値を変更することができるために可能である。
【００５７】
第三の方法は、あらゆる安全でない保存演算を無視し、元の実行流れは変化させない方法である。これを静かな復旧(ｃａｌｍ  ｒｅｃｏｖｅｒｙ)という。この方法は、元の実行流れは変えないが、ローカル変数に対するデータ変造によって異常な実行を誘発しる。
【００５８】
最後の方法は、攻撃以前の状態に復旧させた後に呼び出し者に復帰させる方法である。しかし、これは、以前または新しい構造的な状態を保存するためのハードウェアー的な保存手段あるいはバッファを必要とする。
【００５９】
本発明では、バッファオーバーフロー攻撃を感知する時の復旧あるいは復帰技術であって、前記の方法を複合して使用できる。以下、前記各復旧あるいは復帰方法について説明する。
【００６０】
強制復帰(ｃｏｍｐｕｌｓｏｒｙ  ｒｅｔｕｒｅｎ)
簡単なハードウェア解決策で攻撃を受けた関数を終え、その制御の流れが呼び出し者に復帰するように強制的に変更する。これは、スタックに保存された復帰アドレスの値でプログラムカウンターを更新し、現在のスタックフレームをポップアップして具現できる。多くの場合、攻撃を受けた関数の目的は、単に外部の入力をローカル変数に複写するだけである。したがって、オーバーフローが発生した変数は、悪意のコードだけを含んでいるので、ほとんどの場合に入力を捨てることが安全である。
【００６１】
静かな復旧
攻撃によって発生するあらゆる安全でない書き込みを単純に無視する方法である。データ参照安全点検装置は、復帰アドレスを保護するので、攻撃は制御を奪うことができず、攻撃を受けたプロセスは、攻撃以後に正常な実行を続けるようになる。プロセッサは、静かに安全でない書き込みのみを無視し、攻撃されたプロセスの元の制御流れを変更しないので、これを静かな復旧と呼ぶ。したがって、この方法は、強制復帰方法に比べて強制的でない。しかし、この方法は、データ変造に脆弱であり、データ参照安全点検装置が安全違反を知らせる以前にスタックフレーム内のローカル変数が既に変造されるので、異常な実行を誘発しうる。
【００６２】
変造復旧バッファ(ＣＲＢ)
さらに積極的な方法は、攻撃が感知されたときに元ののバッファ状態を復旧することである。このために、変造復旧バッファ(ＣＲＢ)と呼ばれる特別なハードウェアバッファに疑わしい書き込みを保存する。データ参照安全保護装置違反が発生した時、プロセッサは、ＣＲＢ内のあらゆる安全でない値を捨て、静かにそれ以後の安全でない書き込みを無視する。そして、その後に続くあらゆる演算を静かな復旧のように行う。これにより、メモリの入力バッファは、元の状態を維持し、いかなる種類のスタック領域に対するデータ変造も避けるようになる。
【００６３】
図８は、ＣＲＢを利用して本発明によってバッファオーバーフロー攻撃から復旧する方法を示すフローチャートである。
【００６４】
プロセッサの動作状態を復旧するこの方法は、バッファオーバーフロー攻撃があり得る書き込み動作を、書き込み動作が記録される元の目的地の代りに所定の他の場所に保存しながら(８００段階)、前記書き込み動作中にバッファオーバーフロー攻撃があるか否かを感知する(８１０段階)。そして、バッファオーバーフロー攻撃があると感知されない場合には、所定の間隔で前記保存された内容を書き込み動作が記録される元の目的地に保存し、バッファオーバーフロー攻撃があると感知される場合、攻撃による安全でない書き込みは捨て(８２０段階)、バッファオーバーフロー攻撃があると感知されれば、それ以後の安全でない書き込みを保存せずに無視する(８３０段階)。
【００６５】
図９は、図８の方法を実施するためのバッファオーバーフロー攻撃からの復旧装置の構成を示すブロック図である。
【００６６】
バッファオーバーフロー攻撃からプロセッサの動作状態を復旧するこの装置は、バッファオーバーフロー攻撃があり得る書き込み動作を、書き込み動作が記録される元のメモリ領域９１０の代りに所定の他の保存手段９２０に保存する保存部９００、前記書き込み動作中にバッファオーバーフロー攻撃があるか否かを感知する攻撃感知部９３０、バッファオーバーフロー攻撃があると感知されない場合には、所定の間隔で所定の他の保存手段９２０に保存された内容を書き込み動作が記録される元のメモリ領域９１０に保存し、バッファオーバーフロー攻撃があると感知される場合、攻撃による安全でない書き込みは捨てる保存管理部９４０、及びバッファオーバーフロー攻撃があると感知されれば、それ以後の安全でない書き込みを所定の他の保存手段９２０に保存せずに無視する記録管理部９５０を備える。
【００６７】
そして、この装置は、前記書き込み動作が記録される元のメモリ領域９１０への読み取り動作を管理する引出し管理部９６０をさらに備え、引出し管理部９６０は、前記書き込み動作の元のメモリ９１０領域に読み取り動作がある場合、元のメモリ９１０領域と、保存部９００によって保存される所定の他の保存手段９２０とに同時に接近して、読み取り動作の目的地アドレスが所定の他の保存手段９２０にあり、まだ元のメモリ９１０領域に保存されない場合には、所定の他の保存手段９２０から前記読み取り動作が要求するデータを供給することが望ましく、保存部９００が保存する所定の他の保存手段９２０は、先入れ先出し方式のＦＩＦＯ素子であることが望ましい。
【００６８】
また、保存管理部９４０は、バッファオーバーフロー攻撃が感知される場合、攻撃の発生前に保存された書き込みも、書き込み動作が記録される元のメモリ領域９１０に保存することが望ましい。
【００６９】
さらに、保存部９００は、前記書き込み動作が記録される元のメモリ領域９１０の連続的な領域で二番目の継続的な書き込みがある場合には、前記書き込みを所定の他の保存手段９２０に保存し、そうでない場合には、書き込み動作が記録される元のメモリ領域９１０に記録することが望ましい。この動作のために、保存管理部９４０の制御を受ける。
【００７０】
そして、保存管理部９４０がＦＩＦＯ素子９２０に保存された内容を書き込み動作が記録されるメモリ領域９１０に保存する所定の間隔は、ＦＩＦＯ素子９２０の容量により決定されることが望ましい。
【００７１】
図１０は、ＦＩＦＯから構成された本発明によるＣＲＢの構造を示す。以下の説明は、必要時には図９の図面と同時に参照番号を引用する。
【００７２】
ＣＲＢ１０００は、潜在的なバッファオーバーフロー攻撃の結果である疑わしい書き込みを保存するのに使われる。該疑わしい書き込みが安全なものと判明された後、この値はメモリ１０１０に伝達される。したがって、メモリ１０１０は、攻撃以前のバッファの原状態を常に維持するようになる。メモリ１０１０は、普通のシステムメモリまたはＣＰＵ内部あるいはＣＰＵに接続されているキャッシュメモリとなり、いずれの場合にも本発明の要旨は維持して具現化される。
【００７３】
バッファオーバーフロー攻撃は、メモリの連続的な領域に継続的な書き込みを実行することを伴う。単一書き込みは、メモリのバッファのオーバーフローを引き起こさないため、本発明では、望ましくメモリ１０１０の連続的な領域に二番目の継続的な書き込みを疑わしい書き込みの始まりと見なす。したがって、二つの継続的な保存演算だけでなく、メモリの連続的な領域も疑わしい攻撃の成立のための必須条件である。以下では、このような連続的なメモリ領域の二番目の記録をＣＲＢトリガーと言及する。保存管理部９４０、１０２０がＣＲＢトリガーに応じてＣＲＢにデータを記録し、この記録されたデータを元の記録されるメモリ１０１０に保存させる。
【００７４】
保存管理部１０２０は、ＣＲＢトリガーが発生しない場合には、バッファオーバーフロー攻撃でないので、ＣＲＢ１０００に記録する必要なく、すぐ目的地メモリ１０１０に記録する。もし、ＣＲＢトリガーが発生した場合であれば、これは疑わしい書き込みである可能性があるので、全ての書き込みは、保存管理部１０２０によって元の記録されるメモリ１０１０ではないＣＲＢ１０００、特にテール部分に記録される。
【００７５】
ＣＲＢトリガーが保存管理部１０２０によって感知されれば、次の継続的な書き込みがＣＲＢトリガー条件が満たされなくなるまで、保存部９００によってメモリ１０１０の代わりにＣＲＢ１０００に書き込まれる。もし、この継続的な書き込みの実行中に攻撃感知部９３０によってバッファオーバーフロー攻撃、すなわち、データ参照安全点検装置違反が発生しなければ、ＣＲＢ１０００に保存されたその継続的な記録は、安全したものと見なされてメモリ１０１０に伝えられる。
【００７６】
データ参照安全点検装置に対する違反が発生すれば、ＣＲＢ１０００に保存された値は安全でなく、記録管理部９５０によりそれ以後の記録は無視される。また、静かな復旧の場合と同様に、本発明が適用されたプロセッサは、あらゆる安全でない書き込みを無視した後、正常実行を続ける。このバッファオーバーフロー攻撃の間にそのメモリは、そのまま維持されるので、データも制御も変造されない。
【００７７】
プロセッサのような装置に本発明によるＣＲＢ１０００あるいは図９の構成を追加することは、読み取り演算を複雑にする。最新のデータがそのメモリに存在しない場合もあるので、読み取りは、ＣＲＢとメモリとを同時に接近しなければならない。これに関する機能を引出し管理部９６０、１０３０が支援する。
【００７８】
読み取り演算のアドレスがメモリ１０１０にのみある場合(Ｍｉｓｓ)には、引出し管理部１０３０は、メモリ１０１０からそのデータを供給させる。そして、もし読み取り演算のアドレスがＣＲＢ１０００に書き込まれたデータもあり、メモリ１０１０にもある場合には、ＣＲＢ１０００とメモリ１０１０とのうちいずれからデータを供給してもよい。
【００７９】
もし、読み取り演算のアドレスがＣＲＢ１０００に書かれたデータにあるが、まだメモリ１０１０に伝えられなかったとすれば(Ｈｉｔ)、ＣＲＢ１０００がそのデータを供給しなければならない。これは、ＣＲＢ１０００によって維持される開始と終わりアドレスを読み取り演算のアドレスと比較して簡単に検査できる。図１０に示されたように、ヘッド(Ｈｅａｄ)とテール(Ｔａｉｌ）とは、それぞれまだメモリ１０１０に伝達していないＣＲＢ１０００で最も古い記録と最新の記録とを示す。ＣＲＢ１０００は、継続的な書き込みの最後の実行のみを保管しているので、ＣＲＢの以前値は、他のＣＲＢトリガー条件を満足する前にメモリにフラッシュされなければならない。したがって、ＣＲＢトリガーが感知されれば、遅延(ｓｔａｌｌ）が発生する。
【００８０】
遅延は、ＣＲＢ１０００を構成するＦＩＦＯ素子のような保存素子の制限された容量によって発生する。もし、ＣＲＢ１０００がいっぱいに満ちていれば、疑わしい記録は、ＣＲＢ１０００の新しいデータの一部がメモリ１０１０にフラッシュされるまで遅延されなければならない。
【００８１】
前記の場合と同様に、遅延の長さは、ＣＲＢ１０００の容量によって決まる。ＣＲＢが小さいほど遅延は、さらに長くさらに頻繁に発生する。
【００８２】
本発明を適用したシステムの性能を試験するために、ＳＰＥＣ２０００ＣＰＵベンチマーク、ＣＰＵ２０００ベンチマークの多様なアプリケーションを利用した試験と、ＳｉｍｐｌｅＳｃａｌａｒ２．０ツールを使用して基本キャッシュ／ＴＬＢを有し、４個の無秩序なパイプラインを有しながら本発明によるＣＲＢを含むプロセッサモデルを使用して、各アプリケーションごとに５０個の独立的なシミュレーションを行った結果、１ＫＢのＣＲＢは、２％以下の性能低下であらゆる制御及びデータ変造を除去するのに十分であるということが分かる。
【００８３】
したがって、本発明を適用したプロセッサは、性能面ではほとんど低下することなく、バッファオーバーフロー攻撃に対してとても効率的な手段を提供することが分かり、これは本発明の効果を十分に立証すると言える。
【００８４】
前述された本発明による方法と装置は多様に具現化されうる。例えば、ＡＳＩＣあるいはＦＰＧＡのような素子を使用して別途のチップとして具現して、ＣＰＵのようなプロセッサと接続して使われるように具現化されてもよく、あるいはプロセッサの内部の一構成部として具現化されてバッファオーバーフロープロセッサを具現化するために使われてもよい。このような多様な具現化が可能であるということは、当業者は容易に理解できるであろう。
【００８５】
本発明が属する技術分野で当業者は、本発明が本発明の本質的な特性から逸脱しない範囲で変形された形態に具現化されうることが理解できるであろう。したがって、本発明の開示された実施例は、限定的な観点でなく説明的な観点で考慮されなければならない。前記の説明に含まれた例は、本発明についての理解のために導入されたものであり、その例は、本発明の思想と範囲を限定しない。当業者ならば、前述した例以外にも、本発明による多様な実施形態が可能であるということが分かるであろう。本発明の範囲は、前記説明ではなく、特許請求の範囲に現れており、それと同等な範囲内にある全ての差異点は、本発明に含まれていると解釈されなければならない。
【００８６】
また、当業者ならば、本発明による前記の各段階は、一般的なプログラミング技法を利用してソフトウェア的に、またはハードウェア的に多様に具現化できるということが容易に分かるであろう。
【００８７】
さらに、本発明の一部段階は、また、コンピュータで読み取り可能な記録媒体にコンピュータが読み取り可能なコードとして具現化可能である。コンピュータが読み取り可能な記録媒体は、コンピュータシステムによって読み取れるデータが保存されるあらゆる種類の記録装置を含む。
【産業上の利用可能性】
【００８８】
本発明は、コンピュータ産業に利用され、特に、外部からの悪意的な攻撃に対応してコンピュータを管理して、その結果コンピュータ動作を妨害するバッファオーバーフロー攻撃を感知し、それから復旧することが可能である。
【図面の簡単な説明】
【００８９】
【図１】スタックスマッシング攻撃がどのようにｘ８６系列プロセッサの復帰アドレスを変更できるかを示す。
【図２】バッファオーバーフロー攻撃により作られた制御及びデータ変造の種類を分類した図面である。
【図３】本発明によってバッファオーバーフロー攻撃を感知する方法の一例を示すフローチャートである。
【図４】図３の方法を実施するためのバッファオーバーフロー攻撃を感知装置の構成を示すブロック図である。
【図５】本発明によるバッファオーバーフロー攻撃を感知する方法の他の例を示すフローチャートである。
【図６】図５の方法を実施するためのバッファオーバーフロー攻撃を感知する装置の構成を示すブロック図である。
【図７】本発明による復帰アドレスポインタスタックの構成を示す図面である。
【図８】変造復旧バッファを利用して、本発明によってバッファオーバーフロー攻撃から復旧する方法を示すフローチャートである。
【図９】図８の方法を実施するためのバッファオーバーフロー攻撃からの復旧装置の構成を示すブロック図である。
【図１０】ＦＩＦＯから構成された本発明による変造復旧バッファの構造を示す図面である。
【図１】
2007529818.tif 000003
【図２】
2007529818.tif 000004
【図３】
2007529818.tif 000005
【図４】
2007529818.tif 000006
【図５】
2007529818.tif 000007
【図６】
2007529818.tif 000008
【図７】
2007529818.tif 000009
【図８】
2007529818.tif 000010
【図９】
2007529818.tif 000011
【図１０】
2007529818.tif 000012
【国際調査報告】
2007529818.tif 000013
2007529818.tif 000014