(57)【要約】本発明にかかる不正処理方法、データ処理装置、コンピュータプログラム、及び記録媒体は、バッファメモリに記憶させたデータをバイト単位で読出し、読出し位置がそれぞれ異なる複数の命令系列について、順次的にどのような命令コードが含まれているか解析してゆく。そして、解析した命令系列に、ｉｎｔ命令が含まれており、命令コードが特定の出現パターンを持ち、記憶させたコマンドデータに”／”に対応した文字コードが含まれている場合、当該命令系列に不正コードが含まれていると判定する。
2004077295.tif 000002
【特許請求の範囲】
【請求項１】
異なるバイト長の命令コードを複数含んだデータを受信する受信手段と、受信したデータを記憶する記憶手段とを備えるデータ処理装置を用いて、記憶したデータに含まれる命令コードに基づいて実行する処理が不正処理であるか否かを判定する不正処理判定方法において、前記記憶手段に記憶したデータをバイト単位で順次的に読出し、夫々が連続したバイト列からなり、各バイト列の先頭バイトが異なる読出し位置に対応した複数のデータ系列について、各データ系列に現れる命令コードの出現パターンを検出し、検出した命令コードの出現パターンに基づいて各データ系列による処理が不正処理であるか否かを判定することを特徴とする不正処理判定方法。
【請求項２】
異なるバイト長の命令コードを複数含んだデータを受信する受信手段と、受信したデータを記憶する記憶手段と、記憶したデータに含まれる命令コードに基づいて実行される処理が不正処理であるか否かを判定する判定手段とを備えるデータ処理装置において、前記記憶手段に記憶したデータをバイト単位で順次的に読出す手段と、夫々が連続したバイト列からなり、各バイト列の先頭バイトが異なる読出し位置に対応した複数のデータ系列について、各データ系列に現れる命令コードの出現パターンを検出する検出手段とを備え、前記判定手段は、前記検出手段が検出した命令コードの出現パターンに基づいて各データ系列による処理が不正処理であるか否かを判定すべくなしてあることを特徴とするデータ処理装置。
【請求項３】
命令コードの１バイト目のデータと該命令コードのバイト長との対応関係を記憶したテーブルを更に備えることを特徴とする請求項２に記載のデータ処理装置。
【請求項４】
前記検出手段が検出すべき出現パターンを含むデータ系列は、実行中の命令コード群が置かれた前記記憶手段上のアドレスを取得する処理を含むことを特徴とする請求項２に記載のデータ処理装置。
【請求項５】
前記検出手段が検出すべき出現パターンの１つは、所定の処理を実行する命令コード群を呼出すための命令コードを含み、前記命令コード群は、前記命令コードの復帰先のアドレスを取得する命令コードを含むことを特徴とする請求項２又は請求項４に記載のデータ処理装置。
【請求項６】
前記出現パターンは、分岐命令に係る命令コードを更に含み、該命令コードの分岐先のアドレスが、前記命令コード群を呼出すための命令コードに対応付けられていることを特徴とする請求項５に記載のデータ処理装置。
【請求項７】
前記出現パターンは、システムコールを起動する命令コードを更に含むことを特徴とする請求項５に記載のデータ処理装置。
【請求項８】
前記出現パターンは、前記アドレスを起点としたデータの書換えを指示する命令コードを更に含むことを特徴とする請求項５に記載のデータ処理装置。
【請求項９】
前記出現パターンは、前記命令コードの後に所定の文字コードを更に含むことを特徴とする請求項５に記載のデータ処理装置。
【請求項１０】
検出すべき出現パターンの１つを前記検出手段が検出した場合、前記判定手段は、検出したデータ系列が不正処理を実行するデータであると判定すべくなしてあることを特徴とする請求項２に記載のデータ処理装置。
【請求項１１】
前記判定手段が、検出したデータ系列が不正処理を実行するデータであると判定した場合、外部へその旨の情報を報知する手段を更に備えることを特徴とする請求項２に記載のデータ処理装置。
【請求項１２】
コンピュータに、入力された異なるバイト長の命令コードを複数含んだデータに基づいて実行される処理が不正処理であるか否かを判定させるステップを有するコンピュータプログラムにおいて、コンピュータに、夫々が連続したバイト列からなり、各バイト列の先頭バイトを異なる読出し位置に対応させて読出した複数のデータ系列について、各データ系列に現れる命令コードの出現パターンを検出させるステップと、コンピュータに、検出した命令コードの出現パターンに基づいて各データ系列による処理が不正処理であるか否かを判定させるステップとを有することを特徴とするコンピュータプログラム。
【請求項１３】
コンピュータに、入力された異なるバイト長の命令コードを複数含んだデータに基づいて実行される処理が不正処理であるか否かを判定させるステップを有するコンピュータプログラムが記録されているコンピュータでの読取りが可能な記録媒体において、コンピュータに、夫々が連続したバイト列からなり、各バイト列の先頭バイトを異なる読出し位置に対応させて読出した複数のデータ系列について、各データ系列に現れる命令コードの出現パターンを検出させるステップと、コンピュータに、検出した命令コードの出現パターンに基づいて各データ系列による処理が不正処理であるか否かを判定させるステップとを有するコンピュータプログラムが記録されていることを特徴とするコンピュータでの読取りが可能な記録媒体。
【発明の詳細な説明】
【技術分野】  本発明は、不正処理を実行するデータを検出する不正処理判定方法、データ処理装置、該データ処理装置を実現するためのコンピュータプログラム、及び該コンピュータプログラムが記録されているコンピュータでの読取りが可能な記録媒体に関する。
【背景技術】  インターネット網の普及に伴い、各種の情報処理装置がコンピュータウィルス、クラッキング等の攻撃の対象となり、それらの脅威に晒される可能性が高くなってきている。例えば、近年、「ニムダ」、「コードレッド」等のコンピュータウィルスに代表されるように、システムプログラム又はウェブブラウザのようなアプリケーションプログラムの脆弱性（セキュリティホール）を利用して自己増殖させ、甚大な被害を与えたケースが存在する。
前述のようなコンピュータウィルス、クラッキング等による攻撃では、不正な処理を行う命令コード（以下、不正コードという）を含む攻撃データを攻撃対象であるサーバ装置、パーソナルコンピュータ等の情報処理装置に対して送信し、その情報処理装置にて前記命令コードが実行されるようにしている。このような攻撃手法は様々なものが存在し、その１つとしてバッファオーバフローによる攻撃手法が知られている。バッファオーバフローでは、スタック内に確保されたバッファにおいて、確保されたバッファ以上のスタックエリアに書込みが行われている状態であり、バッファオーバフローの状態に陥った場合、予期せぬ変数破壊を招き、プログラムの誤動作の原因となり得る。バッファオーバフローによる攻撃では、プログラムの誤動作を意図的に引き起し、例えばシステムの管理者権限を取得することが行われる。
これらのコンピュータウィルス、クラッキング等の攻撃に対処するため、例えば、特開平９−３１９５７４号公報に記載されているように、不正コードにみられるような特定のビットパターンの有無を受信したデータに対して検出する処理が行われていた。そして、そのようなビットパターンが受信したデータに含まれている場合には、不正コードを含んだ攻撃データであると判定し、データの受信拒否、ユーザへの報知等を行うようにしていた。
そのため、従来の手法により様々なコンピュータウィルス、クラッキング等の攻撃に対処するためには、各コンピュータウィルス、クラッキングに対応した特定のビットパターンをデータベースに記憶させて予め用意しておく必要があり、新種のコンピュータウィルス、クラッキング手法が発見された場合には、前記データベースを更新して対処しなければならない。
ところで、攻撃データに対する従来の検出方法では、前述のように既知のビットパターンを検出するか、又はＮＯＰ命令（ＮＯＰ：ｎｏｎ−ｏｐｅｒａｔｉｏｎ）の単純な繰り返しといった攻撃処理にとって、本質的とはいえない部分の構造を検出するようにしてきた。そのため、攻撃データのバリエーションに弱く、未知の攻撃データが現れる毎に、検出に用いるビットパターンのデータベースを更新する必要があり、データベースが更新されるまでのタイムラグが問題になっていた。
本発明は斯かる事情に鑑みなされたものであり、その目的とするところは、夫々が連続したバイト列からなり、各バイト列の先頭バイトが異なる読出し位置に対応した複数のデータ系列について、各データ系列に現れる命令コードの出現パターンを検出し、その検出結果に基づいて各データ系列による処理が不正処理であるか否かを判定する構成とすることにより、不正な処理を行う命令コード群を検出するためのビットパターン等を予め用意する必要がなく、不正な処理を行う未知の命令コード群に対しても検出可能な不正処理判定方法、データ処理装置、該データ処理装置を実現するためのコンピュータプログラム、及び該コンピュータプログラムが記録されているコンピュータでの読取りが可能な記録媒体を提供することである。
【発明の開示】
第１発明に係る不正処理判定方法は、異なるバイト長の命令コードを複数含んだデータを受信する受信手段と、受信したデータを記憶する記憶手段とを備えるデータ処理装置を用いて、記憶したデータに含まれる命令コードに基づいて実行する処理が不正処理であるか否かを判定する不正処理判定方法において、前記記憶手段に記憶したデータをバイト単位で順次的に読出し、夫々が連続したバイト列からなり、各バイト列の先頭バイトが異なる読出し位置に対応した複数のデータ系列について、各データ系列に現れる命令コードの出現パターンを検出し、検出した命令コードの出現パターンに基づいて各データ系列による処理が不正処理であるか否かを判定することを特徴とする。
第２発明に係るデータ処理装置は、異なるバイト長の命令コードを複数含んだデータを受信する受信手段と、受信したデータを記憶する記憶手段と、記憶したデータに含まれる命令コードに基づいて実行される処理が不正処理であるか否かを判定する判定手段とを備えるデータ処理装置において、前記記憶手段に記憶したデータをバイト単位で順次的に読出す手段と、夫々が連続したバイト列からなり、各バイト列の先頭バイトが異なる読出し位置に対応した複数のデータ系列について、各データ系列に現れる命令コードの出現パターンを検出する検出手段とを備え、前記判定手段は、前記検出手段が検出した命令コードの出現パターンに基づいて各データ系列による処理が不正処理であるか否かを判定すべくなしてあることを特徴とする。
第３発明に係るデータ処理装置は、第２発明に係るデータ処理装置において、命令コードの１バイト目のデータと該命令コードのバイト長との対応関係を記憶したテーブルを更に備えることを特徴とする。
第４発明に係るデータ処理装置は、第２発明に係るデータ処理装置において、前記検出手段が検出すべき出現パターンを含むデータ系列は、実行中の命令コード群が置かれた前記記憶手段上のアドレスを取得する処理を含むことを特徴とする。
第５発明に係るデータ処理装置は、第２発明又は第４発明に係るデータ処理装置において、前記検出手段が検出すべき出現パターンの１つは、所定の処理を実行する命令コード群を呼出すための命令コードを含み、前記命令コード群は、前記命令コードの復帰先のアドレスを取得する命令コードを含むことを特徴とする。
第６発明に係るデータ処理装置は、第５発明に係るデータ処理装置において、前記出現パターンは、分岐命令に係る命令コードを更に含み、該命令コードの分岐先のアドレスが、前記命令コード群を呼出すための命令コードに対応付けられていることを特徴とする。
第７発明に係るデータ処理装置は、第５発明に係るデータ処理装置において、前記出現パターンは、システムコールを起動する命令コードを更に含むことを特徴とする。
第８発明に係るデータ処理装置は、第５発明に係るデータ処理装置において、前記出現パターンは、前記アドレスを起点としたデータの書換えを指示する命令コードを更に含むことを特徴とする。
第９発明に係るデータ処理装置は、第５発明に係るデータ処理装置において、前記出現パターンは、前記命令コードの後に所定の文字コードを更に含むことを特徴とする。
第１０発明に係るデータ処理装置は、第２発明に係るデータ処理装置において、検出すべき出現パターンの１つを前記検出手段が検出した場合、前記判定手段は、検出したデータ系列が不正処理を実行するデータであると判定すべくなしてあることを特徴とする。
第１１発明に係るデータ処理装置は、第２発明に係るデータ処理装置において、前記判定手段が、検出したデータ系列が不正処理を実行するデータであると判定した場合、外部へその旨の情報を報知する手段を更に備えることを特徴とする。
第１２発明に係るコンピュータプログラムは、コンピュータに、入力された異なるバイト長の命令コードを複数含んだデータに基づいて実行される処理が不正処理であるか否かを判定させるステップを有するコンピュータプログラムにおいて、コンピュータに、夫々が連続したバイト列からなり、各バイト列の先頭バイトを異なる読出し位置に対応させて読出した複数のデータ系列について、各データ系列に現れる命令コードの出現パターンを検出させるステップと、コンピュータに、検出した命令コードの出現パターンに基づいて各データ系列による処理が不正処理であるか否かを判定させるステップとを有することを特徴とする。
第１３発明に係るコンピュータでの読取りが可能な記録媒体は、コンピュータに、入力された異なるバイト長の命令コードを複数含んだデータに基づいて実行される処理が不正処理であるか否かを判定させるステップを有するコンピュータプログラムが記録されているコンピュータでの読取りが可能な記録媒体において、コンピュータに、夫々が連続したバイト列からなり、各バイト列の先頭バイトを異なる読出し位置に対応させて読出した複数のデータ系列について、各データ系列に現れる命令コードの出現パターンを検出させるステップと、コンピュータに、検出した命令コードの出現パターンに基づいて各データ系列による処理が不正処理であるか否かを判定させるステップとを有するコンピュータプログラムが記録されていることを特徴とする。
第１発明、第２発明、第１２発明、及び第１３発明にあっては、記憶手段からデータをバイト単位で順次的に読出して不正処理を実行する命令コードが含まれているか否かを判定する際、読出し位置が異なる複数のデータ系列について、命令コードの出現パターンを検出ようにしている。したがって、通常のデータには見られないような命令コードの出現パターンに着目して検出を行うことで、未知の不正コードが現れたときでも、不正コードの本質的な処理内容が変わらない限り対処することが可能となる。また、本発明では命令コードの出現パターンに基づいて検出を行うため、検出の開始位置をどこに設定するかによって検出する出現パターンが異なってくる場合が生じるが、読出し位置を順次異ならせた複数のデータ系列について検出するようにしているため、誤った判定をすることが少なくなり、検出精度が高まる。
第３発明にあっては、命令コードの１バイト目のデータと、命令コードのバイト長との対応関係を記憶したテーブルを備えているため、データの読出し位置がある命令系列において命令コードの先頭バイト以外に位置しているときには、不正コードの検出を行わないようにすることができ、処理速度の向上が図れる。
第４発明にあっては、実行中の命令コード群が置かれた記憶手段上のアドレスを取得する処理が含まれる出現パターンを検出するようにしているため、不正コードの本質的な構造に着目した検出手法の提案が可能となる。
第５発明にあっては、所定の処理を実行する命令コード群を呼出すための命令コードを含み、呼出し先の命令コード群において、前記命令コードの復帰先のアドレスを取得する命令コードを含んでいる出現パターンを検出するようにしている。したがって、不正処理を実行させるようなデータであるか否かを容易に判定することができ、しかもその本質的な構造に基づいて検出しているため、未知の不正コードに対しても対処することが可能となる。
第６発明にあっては、分岐命令の分岐先が前述の命令コード群に対応付けられている出現パターンを検出するようにしている。したがって、不正処理を実行させるようなデータであるか否かを容易に判定することができ、しかもその本質的な構造に基づいて検出しているため、未知の不正コードに対しても対処することが可能となる。
第７発明にあっては、更にシステムコールを起動する命令コードを含んだ出現パターンを検出するようにしている。したがって、不正コードが実行される蓋然性が高くなる場合を検出できるため、検出精度が高まる。
第８発明にあっては、復帰先アドレスを起点としたデータの書換えを指示する命令コードを含んだ出現パターンを検出するようにしている。したがって、実行前の段階でどのような処理が実行されるのかが分からないような不正コードにも対処することが可能となる。
第９発明にあっては、前述の命令コードを呼び出すための命令コードの後に所定の文字コードを含んでいるか否かを判定するようにしているため、特定のＣＰＵに対する不正コードの検出処理において検出精度が高まる。
第１０発明にあっては、検出すべき命令コードの出現パターンを検出した場合、そのデータが不正処理を実行するデータであると判定するようにしているため、不正処理を実行させるようなデータであるか否かを容易に判定することができ、しかもその本質的な構造に基づいて判定しているため、未知の不正コードに対しても対処することが可能となる。
第１１発明にあっては、検出したデータ系列が不正処理を実行するデータであると判定した場合、外部へその旨を報知するようにしている。したがって、不正コードを検出した時点で通信の遮断等を行って、当該不正コードにより生じる不具合を防止することが可能となる。
【図面の簡単な説明】  第１図は、本実施の形態に係るデータ処理装置のブロック図である。
第２図は、データ処理装置が実行する処理を説明する模式図である。
第３図は、解析対象データの構成を説明する模式図である。
第４図は、データ処理装置による不正コードの検出手順を説明するフローチャートである。
第５図は、データ処理装置による不正コードの検出手順を説明するフローチャートである。
第６図は、解析・判定処理ルーチンの手順を説明するフローチャートである。
第７図は、データ処理装置の解析処理により検出する命令コードの出現パターンを説明する模式図である。
第８図は、データ処理装置の解析処理により検出する命令コードの出現パターンを説明する模式図である。
第９図は、解析処理ルーチンの処理手順を説明するフローチャートである。
第１０図は、解析処理ルーチンの処理手順を説明するフローチャートである。
第１１図は、解析処理ルーチンの処理手順を説明するフローチャートである。
第１２図は、解析処理ルーチンの処理手順を説明するフローチャートである。
第１３図は、解析処理ルーチンの処理手順を説明するフローチャートである。
第１４図は、判定処理ルーチンの処理手順を説明するフローチャートである。
第１５図は、本実施の形態に係る解析処理ルーチンの処理手順を説明するフローチャートである。
第１６図は、本実施の形態に係る解析処理ルーチンの処理手順を説明するフローチャートである。
第１７図は、本実施の形態に係る解析処理ルーチンの処理手順を説明するフローチャートである。
第１８図は、本実施の形態に係る解析処理ルーチンの処理手順を説明するフローチャートである。
第１９図は、本実施の形態に係る解析処理ルーチンの処理手順を説明するフローチャートである。
第２０図は、本実施の形態に係る判定処理ルーチンの処理手順を説明するフローチャートである。
第２１図は、本実施の形態に係るデータ処理装置の構成を説明する模式図である。
【発明を実施するための最良の形態】  以下、本発明をその実施の形態を示す図面を参照して具体的に説明する。
（第１実施の形態）
第１図は本実施の形態に係るデータ処理装置のブロック図である。図中１０は、データ処理装置であり、ＣＰＵ１１、外部ネットワークへ接続するための通信インタフェース１５ａ、及び内部ネットワークへ接続するための通信インタフェース１５ｂを備えている。データ処理装置１０は、具体的にはルータ、ブロードバンドルータ、スイッチ等の通信ネットワーク上で送受信されるデータを中継する装置であり、通信インタフェース１５ａには通信相手となる情報処理装置及び通信装置等が外部ネットワークを介して接続され、通信インタフェース１５ｂにはユーザが利用する情報処理装置及び通信装置等が内部ネットワークを介して接続される。前記情報処理装置には、パーソナルコンピュータ、ワークステーション、サーバ装置、ＰＤＡ（Ｐｅｒｓｏｎａｌ  Ｄｉｇｉｔａｌ  Ａｓｓｉｓｔａｎｔ）等が含まれ、前記通信装置には携帯電話機等が含まれる。
ＣＰＵ１１には、メモリ１２、バッファメモリ１３、及びルーティング部１４等のハードウェアが接続されており、ＣＰＵ１１がメモリ１２に予め格納された制御プログラムを読込んで実行することにより前述の各ハードウェアを制御し、外部ネットワークと内部ネットワークとの間で送受信される各種データを中継する装置として動作させる。また、メモリ１２には、各ハードウェアを動作させるための制御プログラムの他、通信経路を定めるために送信先のネットワークアドレスを記憶したルーティングテーブル、及び本発明のコンピュータプログラムが格納されている。
内部ネットワーク側から外部ネットワーク側へデータを送信する際にデータ処理装置１０の通信インタフェース１５ｂが当該データを受信した場合、ＣＰＵ１１はメモリ１２内に格納されたルーティングテーブルを参照して通信経路を定め、定めた通信経路に従ってルーティング部１４を制御する。そして、通信インタフェース１５ａを介して送信先の情報処理装置又は通信装置へデータを送信する。
また、外部ネットワーク側から内部ネットワーク側へ送信するデータは、前述と同様の手順に従ってデータ処理装置１０により中継される。このときデータ処理装置１０は、通信インタフェース１５ａにて受信した外部ネットワーク側からのデータを一時的にバッファメモリ１３に記憶させ、記憶させたデータについて解析を行うことにより、ある特定のＣＰＵ（以下、保護対象ＣＰＵという）について不正処理を実行させるような命令コード（以下、不正コードという）がそのデータに含まれているか否かを判定する。バッファメモリ１３に記憶させたデータを解析・判定するにあたって、ＣＰＵ１１は、本発明のコンピュータプログラムをメモリ１２から読込んで実行し、自身の内部にデータを解析・判定するための環境を与える仮想ＣＰＵ実行環境部１１ａを作成する。仮想ＣＰＵ実行環境部１１ａは、保護対象ＣＰＵが用いるレジスタ、スタックに対応する仮想レジスタ、仮想スタック等を備えており、解析対象のデータを保護対象ＣＰＵの命令コードと解釈して仮想的にデコードし、そのときに生成されたパラメータ等を記憶する。そして、ＣＰＵ１１は、仮想ＣＰＵ実行環境部１１ａが備える仮想レジスタ及び仮想スタックの状態等を監視することで不正コードの有無を判定する。
なお、本実施の形態では、ＣＰＵ１１、メモリ１２、及びバッファメモリ１３を夫々個別に設ける構成としたが、バッファメモリ及び本発明のコンピュータプログラムを記憶したＩＣ（Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）を１つのチップに実装したＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｅｄ  ＩＣ）等を設ける構成としても良い。
第２図はデータ処理装置１０が実行する処理を説明する模式図である。データ処理装置１０が実行する処理は、大別して（１）外部ネットワークからのデータの受信、（２）解析対象とするデータの抽出、（３）解析対象のデータから派生させた複数の命令系列に対する解析、（４）各命令系列における不正コードの検出、に分かれる。以下では各処理について説明する。
（１）データの受信
データ処理装置１０の通信インタフェース１５ａは、接続された外部ネットワークの通信規格に準拠した通信手順に従って所定の単位（例えば、パケット単位）でデータを受信する。受信するデータの各単位は所定のバイト長を有しており、送信元及び送信先のアドレス情報を含んだ通信ヘッダ、並びにユーザが任意に作成したユーザデータから構成される。ユーザデータには、ユーザが所望する処理を実行させるための命令コードが含まれており、当該命令コードによって不正処理が実行される虞がある。
（２）解析対象データの抽出
そこで、データ処理装置１０は、受信したデータをバイト単位で順次的に抽出し、バッファメモリ１３に記憶させて解析を行う。データの抽出を開始する位置、すなわち解析開始位置は予め定められた任意の位置とすることができる。例えば、受信したデータの先頭バイトを解析開始位置としても良く、通信ヘッダを除いたユーザデータの先頭バイトを解析開始位置としても良い。また、解析対象として抽出したデータを記憶させるバッファメモリ１３のバッファサイズは予め定められており、保護対象ＣＰＵがデコードすることができる命令コードの内、最大の命令長を有する命令コードが少なくとも１つ以上記憶されるようなサイズに予め設定されている。
（３）複数の命令系列の解析
次いで、バッファメモリ１３に記憶させた解析対象データについて複数の命令系列を派生させながら解析を行う。ここで、命令系列とは解析対象データについて指定した位置から始まる保護対象ＣＰＵの命令コードの並びをいう。
ＣＰＵ１１は、解析対象データについて解析を行うにあたり、バッファメモリ１３の先頭バイトから順次的に１バイトずつデータを読込む。ＣＰＵ１１は、読込んだ１バイトのデータが保護対象ＣＰＵにおいてどのような命令コードの先頭バイトに該当するか解釈し、その解釈結果に基づいて命令の種類、次の命令の開始位置、及び当該命令で使用されるパラメータを記憶する。実際には本発明のコンピュータプログラム中に保護対象ＣＰＵで使用される命令コードの先頭バイトの文字コードと、当該命令コードの命令長及び使用されるパラメータ等との間の対応関係を規定したテーブル（以下、命令テーブルという）を有しており、ＣＰＵ１１が本発明のコンピュータプログラムをロードした際に前記命令テーブルがメモリ１２上に格納される。ＣＰＵ１１は、当該命令テーブルを参照することによって、バッファメモリ１３から読込んだ１バイトのデータの解釈を行う。
読込んだ１バイトのデータの解釈を終えた後、バッファメモリ１３からの読出し位置に対応する解析開始バッファ位置を１バイトずらして更にデータを１バイト読込み、読込んだデータの読出し位置を先頭バイトとした命令系列について解析を行う。このような処理を解析開始バッファ位置を順次的にずらしながら繰返して実行することにより、読出し位置が異なる複数の命令系列について解析を行う。
また、解析を終えたバッファメモリ１３の解析開始バッファ位置には、受信したデータから次の読込みデータ位置のデータが記憶される
（４）不正コードの検出
次いで、データ処理装置１０のＣＰＵ１１は、仮想ＣＰＵ実行環境部１１ａが備える仮想レジスタ及び仮想スタックの状態等に基づいて特定の構造（出現パターン）を有する命令系列を検出するようにしており、特定の構造を有する命令系列を検出した場合、不正コードを検出したと判定する。本実施の形態では以下の２種類の構造を有するデータを検出する。
１つは、分岐命令（以下、ｊｍｐ命令という）の分岐先が、命令コード群を呼出す命令コード（以下、ｃａｌｌ命令という）のアドレスに対応付けられており、そのｃａｌｌ命令の呼出し先が、ｊｍｐ命令とｃａｌｌ命令との間のアドレスに対応している構造である。以下では本構造を「ｊｍｐ→ｃａｌｌ」構造と称する。通常、後述する「ｃａｌｌ→ｐｏｐ」構造と組み合わされ攻撃者の不正コードに見出されることが多い。
本構造をもつ不正コードでは、ｊｍｐ命令とｃａｌｌ命令との間の命令コード群でｃａｌｌ命令直後のアドレス（復帰先のアドレス）の情報を取得し、そのアドレスを手掛かりとして不正コード自身の中に埋め込まれた外部コマンドを取得し、当該外部コマンドを実行したり、不正コード自身を書き換えたりすることが行われる。
もう１つは、ｃａｌｌ命令の呼出し先において、ｐｕｓｈ命令が先行しないｐｏｐ命令が存在する構造である。ここで、ｐｕｓｈ命令は、アドレス値等をスタック領域へ一時的に格納させるための命令であり、ｐｏｐ命令は、逆にスタック領域へ格納されたアドレス値等を取得する命令である。以下では本構造を「ｃａｌｌ→ｐｏｐ」構造と称する。
本構造をもつ不正コードも基本的には前述の「ｊｍｐ→ｃａｌｌ」構造と同様の手法を用いて、外部コマンドを実行したり、不正コード自身を書き換えたりする。すなわち、ｃａｌｌ命令が実行されたときに、スタック領域に格納される復帰先のアドレスの情報をｐｏｐ命令により取得し、そのアドレスを手掛かりとして、外部コマンドを実行したり、不正コード自身を書き換えたりする。
前述の２種類の命令構造は一般のデータに見られる構造ではないため、データ処理装置１０がそれらの構造を持つ命令コードの出現パターンを検出した場合、不正コードが含まれている蓋然性が高いと判定する。
なお、「ｊｍｐ→ｃａｌｌ」構造、及び「ｃａｌｌ→ｐｏｐ」構造を用いた不正コードの動作については、後に詳述することとする。
第３図は解析対象データの構成を説明する模式図である。保護対象ＣＰＵで使用される命令コードの命令長は必ずしも一定ではなく、様々な命令長の命令コードを使用する場合がある。また、受信するデータには、例えば、画像データ、文書データ等の命令コードではない単なるデータが含まれている場合もある。したがって、解析対象とするデータの読出し位置を適切に設定しないときは、命令コードを正しく解釈できない虞があり、不正コードの有無についての判定を誤る場合が生じる。
そこで、本実施の形態では、単なるデータと命令コードとの境界及び２つの命令コード間の境界（命令境界）を正しく把握するために、バッファメモリ１３に記憶させた解析対象のデータを１バイトずつ読込み、それをある命令コードの先頭バイトとみなしてデータの解析を進める。前述した命令テーブルを参照することにより、読込んだ１バイトのデータから次の命令コードの位置が分かるため、順次的に命令コードを把握することが可能となり、解析対象データを複数の命令コードが連続した１つの並び（命令系列）と解釈することができる。また、１バイトずつデータの読込み位置をずらしながら解釈を行うため、先頭バイトの位置がそれぞれ異なる複数の命令系列を順次的に派生させることができ、それらの命令系列の中に含まれることとなる正しい命令境界を持つ命令系列について解析を行うことが可能となる。
以下、第３図を用いて具体的に説明する。第３図に示した解析対象データは、先頭から４バイトの単なるデータ、２バイトの命令コード（命令１）、４バイトの命令コード（命令２）、４バイトの命令コード（命令３）、１バイトの命令コード（命令４）…が連続したデータである。まず、解析開始バッファ位置をｂ１に設定して１バイトのデータを読込み、命令内容、次の命令コードの位置、及びその命令コードで使用されるパラメータ等の情報を取得するとともに、ｂ１を先頭バイトとした命令系列１についての解析を始める。そして、解析開始バッファ位置をｂ２，ｂ３，ｂ４…と順次的にずらしながら、各読込み位置が先頭バイトとなる命令系列２、命令系列３、命令系列４…についての解析を同時並行して行う。第３図に示した例では、ｂ５の位置を先頭バイトとした命令系列５が正しい命令コードの並びとなり、命令系列５を解析したときに「ｊｍｐ→ｃａｌｌ」構造、又は「ｃａｌｌ→ｐｏｐ」構造が検出された場合に、不正コードを検出したと判定する。
なお、ｂ７から始まるデータ系列７、ｂ１１から始まるデータ系列１１、及びｂ１５から始まるデータ系列１５等はデータ系列５の一部として含まれているため、データの解析を省略することができる。
以下では、データ処理装置１０による不正コードの検出手順について説明する。第４図及び第５図はデータ処理装置１０による不正コードの検出手順を説明するフローチャートである。外部ネットワークからのデータを通信インタフェース１５ａにて受信した場合、まず、読込みデータ位置、及び解析開始位置を初期化し（ステップＳ１）、バッファメモリ１３へデータを読込む（ステップＳ２）。この初期段階での読込みでは、バッファメモリ１３のバッファサイズ分だけデータを読込む。そして、読込データ位置にバッファサイズを加算した位置を次の読込データ位置として設定する（ステップＳ３）。また、解析中の命令系列がある場合には、その命令系列の集合を初期化する（ステップＳ４）。
そして、解析開始バッファ位置のデータが受信したデータの終端であるか否かを判断する（ステップＳ５）。解析開始バッファ位置のデータが終端した場合（Ｓ５：ＹＥＳ）、本フローチャートによる不正コードの検出処理を終了し、解析開始バッファ位置のデータが終端していない場合（Ｓ５：ＮＯ）、解析開始バッファ位置のデータを１バイト読込む（ステップＳ６）。次いで、読込んだ１バイトのデータに基づいて次の命令開始位置、命令の種類、及びパラメータを取得し、それらをメモリ１２に記憶させる（ステップＳ７）。
次いで、ＣＰＵ１１は、解析中の命令系列の中で、現在位置が記憶させた次の開始位置に一致する命令系列があるか否かを判断する（ステップＳ８）。現在位置と記憶させた次の開始位置とが一致する命令系列がある場合（Ｓ８：ＹＥＳ）、それらすべての命令系列について後述する解析・判定処理を実行する（ステップＳ１０）。
現在位置と記憶させた次の開始位置とが一致する命令系列がない場合（Ｓ８：ＮＯ）、現在位置から始まる命令系列を解析・判定処理の対象とするために新しい命令系列として追加した上で（ステップＳ９）、解析・判定処理を実行する（Ｓ１０）。
次いで、書込みバッファ位置を解析開始バッファ位置とし（ステップＳ１１）、読込みデータ位置を１つだけ増加させる（ステップＳ１２）。そして、読込みデータ位置からバッファメモリ１３上の書込みバッファ位置へデータを１バイト読込む（ステップＳ１３）。次いで、解析バッファ位置を１つだけ増加させた値をバッファサイズで除算したときの余りを次の解析開始バッファ位置として設定し（ステップＳ１４）、処理をステップＳ５へ戻し、解析を繰返し行う。
第６図は解析・判定処理ルーチンの手順を説明するフローチャートである。バッファメモリ１３から読込んだ１バイトのデータが命令コードの先頭バイトに該当するものを含んだ命令系列の全てについて後述の解析処理を行う（ステップＳ２１）。解析処理については後に詳述することとするが、ここでは、読込んだ１バイトのデータを元に命令テーブルを参照して、命令の内容及び使用するパラメータ、並びに次の命令の位置等を記憶するとともに、仮想ＣＰＵ実行環境部１１ａ内の仮想スタック内の状態を監視して解析を行う。
解析処理が終了した場合、ＣＰＵ１１は解析した命令系列が終端したか否かを判断し（ステップＳ２２）、また、命令系列が終了していない場合（Ｓ２２：ＮＯ）、本解析・判定処理ルーチンを終了して、第５図のステップＳ１１の処理へ移行させる。
また、命令系列が終端したと判定した場合（Ｓ２２：ＹＥＳ）、後述する判定処理を行う（ステップＳ２３）。そして、ＣＰＵ１１は、その判定処理の結果を受けて不正コードを検出したか否かを判断し（ステップＳ２４）、不正コードを検出していないと判断した場合（Ｓ２４：ＮＯ）、現在の命令系列を削除し（ステップＳ２６）、不正コードを検出したと判断した場合（Ｓ２４：ＹＥＳ）、不正コードを検出した旨の情報を出力する（ステップＳ２５）。情報の出力は、通信インタフェース１５ｂを介して内部ネットワークに接続された情報処理装置へ送信する構成であってもよく、また、データ処理装置１０に文字情報として表示する表示部、又は光により報知する発光部を設けて出力する構成であってもよい。また、不正コードを検出した旨の情報を出力した後に通信を遮断するような処理を行う構成としても良い。
第７図及び第８図はデータ処理装置１０の解析処理により検出する命令コードの出現パターンを説明する模式図である。第７図では「ｊｍｐ→ｃａｌｌ」構造を用いた不正コードの要部構成を示し、第８図には「ｃａｌｌ→ｐｏｐ」構造を用いた不正コードの要部構成を示す。
前述したように「ｊｍｐ→ｃａｌｌ」構造は、当該ｊｍｐ命令の分岐先がｃａｌｌ命令のアドレスに対応し、そのｃａｌｌ命令の呼出し先がｊｍｐ命令とｃａｌｌ命令との間にあるような構造を有している（第７図（ｂ）参照）。第７図（ａ）に示した例では、アドレスＡ１のｊｍｐ命令によって、アドレスＡ１０のｃａｌｌ命令へ分岐し、そのｃａｌｌ命令によってアドレスＡ２〜Ａ６の命令コード群を呼出している。アドレスＡ１０のｃａｌｌ命令が実行されたとき、そのｃａｌｌ命令の復帰先のアドレス（Ａ１１）がスタック領域に一時的に格納される。スタック領域に格納された復帰先のアドレスは、ｐｏｐ命令により取得できるため、そのアドレスを手がかりとして外部コマンドを実行させることが可能となる。すなわち、第７図に示した不正コードは、アドレスＡ２のｐｏｐ命令によりｃａｌｌ命令の復帰先であるアドレスＡ１１を取得し、ソフトウェア割込みであるｉｎｔ命令によりシステムコールの呼出して、攻撃者がアドレスＡ１１に作成した外部コマンド（例えば、シェルプログラム）を実行させる構成である。
次に、「ｃａｌｌ→ｐｏｐ」構造は、ｃａｌｌ命令の呼出先の命令コード群においてｐｕｓｈ命令が先行しないｐｏｐ命令を有する構造をしている（第８図（ｂ）参照）。第８図（ａ）に示した例では、アドレスＡ１のｃａｌｌ命令によって、Ａ１６〜Ａ２０の命令コード群を呼出し、その中でｐｏｐ命令によりｃａｌｌ命令の復帰先のアドレスを取得している。なお、第８図（ａ）に示した例では、ｃａｌｌ命令の直後に起動したい外部コマンドの文字列を配置する構成とせずに、攻撃者が予め定めた固定長のダミーの命令コードを挿入しているが、この場合でも前述と同様の効果が得られる。すなわち、第８図（ａ）に示した例では、ｃａｌｌ命令の呼出し先の命令コード群に存在するｐｕｓｈ命令が先行しないｐｏｐ命令により、ｃａｌｌ命令の復帰先であるアドレスＡ２を取得し、演算処理によってアドレスＡ７の値を算出してアドレスＡ２０のｉｎｔ命令によりシステムコールを呼出し、アドレスＡ７に配置された文字列の外部コマンド（シェルプログラム）を実行させる構成としている。
なお、第７図及び第８図に示したアドレスは便宜的に付与したアドレスであって、必ずしもスタック領域上の連続したメモリアドレスを表している訳ではない。
第９図〜第１３図は解析処理ルーチンの処理手順を説明するフローチャートである。データ処理装置１０のＣＰＵ１１は、前述の命令テーブルを参照することにより、バッファメモリ１３から読込んだ１バイトのデータから始まる命令系列がｊｍｐ命令であるか否かを判断する（ステップＳ３１）。ｊｍｐ命令であると判断した場合（Ｓ３１：ＹＥＳ）、当該ｊｍｐ命令により指示される分岐先のアドレスが、現在位置のアドレスよりも大きいか否かを判断する（ステップＳ３２）。分岐先のアドレスが現在位置のアドレスよりも小さいと判断した場合（Ｓ３２：ＮＯ）、本ルーチンを終了して解析・判定処理ルーチンへ処理を戻す。
また、分岐先アドレスが現在位置のアドレスよりも大きいと判断した場合（Ｓ３２：ＹＥＳ）、メモリ１２内の所定の記憶領域（以下、分岐先テーブルとする）に既に記憶された分岐先アドレスが存在するか否かを判断する（ステップＳ３３）。分岐先テーブルに既に記憶された分岐先アドレスが存在しない場合（Ｓ３３：ＮＯ）、ステップＳ３１で検出したｊｍｐ命令の分岐先アドレスを分岐先テーブルに記憶する（ステップＳ３４）。また、既に記憶された分岐先のアドレスが存在する場合（Ｓ３３：ＹＥＳ）、小さい方の分岐先のアドレスを選択して（ステップＳ３５）、分岐先テーブルに記憶させる分岐先アドレスを更新する（ステップＳ３６）。
分岐先アドレスを更新又は記憶した場合、次の命令位置をメモリ１２に記憶させ（ステップＳ３７）、処理を解析・判定処理ルーチンへ戻す。
ステップＳ３１においてｊｍｐ命令でないと判断した場合（Ｓ３１：ＮＯ）、バッファメモリ１３から読込んだ１バイトのデータがｉｎｔ命令であるか否かを判断する（ステップＳ４１）。ｉｎｔ命令であると判断した場合（Ｓ４１：ＹＥＳ）、ｉｎｔ命令を検出した旨をメモリ１２に記憶させる（ステップＳ４２）。そして、前述の分岐先テーブルに既に記憶された分岐先アドレスがあるか否かを判断する（ステップＳ４３）。分岐先テーブルに記憶された分岐先テーブルがない場合（Ｓ４３：ＮＯ）、現在解析している命令系列を終端させ（ステップＳ４４）、処理を解析・判定ルーチンへ戻して後述する判定処理へ移行させる。
また、既に記憶された分岐先アドレスがある場合（Ｓ４３：ＹＥＳ）、現在位置のアドレスが分岐先テーブルに記憶された分岐先アドレスよりも大きいか否かを判断する（ステップＳ４５）。現在位置のアドレスが記憶された分岐先アドレスよりも小さい場合（Ｓ４５：ＮＯ）、現在解析している命令系列を終端させ（Ｓ４４）、解析・判定処理ルーチンへ戻して判定処理へ移行させる。また、現在位置のアドレスが記憶された分岐先アドレスよりも大きい場合（Ｓ４５：ＹＥＳ）、命令系列を終端させることなく解析・判定処理ルーチンへ処理を戻す。
ステップＳ４１においてｉｎｔ命令でないと判断した場合（Ｓ４１：ＮＯ）、バッファメモリ１３から読込んだ１バイトのデータから始まる命令コードがｃａｌｌ命令であるか否かを判断する（ステップＳ５１）。ｃａｌｌ命令であると判断した場合（Ｓ５１：ＹＥＳ）、当該ｃａｌｌ命令の呼出先アドレスが現在位置のアドレスよりも大きいか否かを判断する（ステップＳ５２）。呼出先アドレスが現在位置のアドレスよりも大きいと判断した場合（Ｓ５２：ＹＥＳ）、既に記憶された呼出先アドレスがあるか否かを判断する（ステップＳ５３）。既に記憶された呼出先アドレスがない場合（Ｓ５３：ＮＯ）、ステップＳ５１で検出したｃａｌｌ命令の呼出先アドレスを記憶させる（ステップＳ５４）。また、既に記憶された呼出先アドレスがある場合（Ｓ５３：ＹＥＳ）、小さい方の呼出先アドレスを選択して（ステップＳ５５）、記憶している呼出先アドレスを更新する（ステップＳ５６）。
呼出先アドレスを更新又は記憶した場合、次の命令位置から数バイトのデータをコマンドデータとしてメモリ１２に記憶させる（ステップＳ５７）。
ステップＳ５２において、ステップＳ５１で検出したｃａｌｌ命令の呼出先アドレスが現在位置よりも小さいと判断した場合（Ｓ５２：ＮＯ）、次の命令位置から数バイトのデータをコマンドデータとしてメモリ１２に記憶させる（ステップＳ５８）。
そして、ｐｏｐ命令が置かれた場所のリストに呼出先アドレスがあるか否かを判断する（ステップＳ５９）、ここで、リストとは、ｐｏｐ命令が置かれているアドレスをリスト形式で記憶させている記憶領域のことをいう。リスト上に呼出先アドレスがあると判断した場合（Ｓ５９：ＹＥＳ）、「ｃａｌｌ→ｐｏｐ」構造を検出した旨をメモリ１２に記憶させ（ステップＳ６０）、現在解析している命令系列を終端させる（ステップＳ６１）。命令系列を終端させた場合、処理を解析・判定処理ルーチンへ戻し、判定処理へと移行させる。
リスト上に呼出先アドレスがないと判断した場合（Ｓ５９：ＮＯ）、ｉｎｔ命令が検出されているか否かを判断し（ステップＳ６２）、ｉｎｔ命令が検出されていない場合（Ｓ６２：ＮＯ）、命令系列を終端させることなく処理を解析・判定処理ルーチンへ戻す。
ｉｎｔ命令が検出されている場合（Ｓ６２：ＹＥＳ）、分岐先テーブルを参照してｊｍｐ命令の分岐先アドレスが現在位置のアドレスより小さいか否かを判断する（ステップＳ６３）。分岐先アドレスが現在位置より大きいと判断した場合（Ｓ６３：ＮＯ）、命令系列を終端させることなく処理を解析・判定処理ルーチンへ戻す。
分岐先アドレスが現在位置より小さいと判断した場合（Ｓ６３：ＹＥＳ）、呼出先アドレスがｊｍｐ命令と現在位置との間にあるか否かを判断する（ステップＳ６４）。呼出先アドレスがｊｍｐ命令と現在位置との間にない場合（Ｓ６４：ＮＯ）、命令系列を終端させることなく処理を解析・判定処理ルーチンへ戻す。また、呼出先アドレスがｊｍｐ命令と現在位置との間にあると判断した場合（Ｓ６４：ＹＥＳ）、「ｊｍｐ→ｃａｌｌ」構造を検出した旨をメモリ１２に記憶させ（ステップＳ６５）、現在解析している命令系列を終端させる（ステップＳ６６）。命令系列を終端させた場合、処理を解析・判定処理ルーチンへ戻し、判定処理へと移行させる。
ステップＳ５１においてｃａｌｌ命令でないと判断した場合（Ｓ５１：ＮＯ）、バッファメモリ１３から読込んだ１バイトのデータから始まる命令コードがｐｏｐ命令であるか否かを判断する（ステップＳ７１）。ｐｏｐ命令であると判断した場合（Ｓ７１：ＹＥＳ）、リストに現在位置のアドレスを記憶させる（ステップＳ７２）。そして、ｃａｌｌ命令の呼出先アドレスが現在位置のアドレスに一致するか否かを判断する（ステップＳ７３）。一致する場合（Ｓ７３：ＹＥＳ）、「ｃａｌｌ→ｐｏｐ」構造を検出した旨をメモリ１２に記憶させ（ステップＳ７４）、処理を解析・判定処理ルーチンへ戻す。また、ｃａｌｌ命令の呼出先アドレスが現在位置のアドレスに一致しない場合（Ｓ７３：ＮＯ）、処理を解析・判定処理ルーチンへ戻す。
なお、解析対象データにおいて、ｊｍｐ命令とｃａｌｌ命令との間、又はｃａｌｌ命令とｐｏｐ命令との間にダミーのデータが挿入されているケースでは、命令境界を正しく解釈できない場合があり、１つの命令系列の中で「ｊｍｐ→ｃａｌｌ」構造、及び「ｃａｌｌ→ｐｏｐ」構造を検出できないことがある。しかしながら、本実施の形態では、次の命令位置よりも大きい分岐先アドレスをもつｊｍｐ命令、及び次の命令位置よりも大きい呼出先アドレスをもつｃａｌｌ命令を検出した場合、分岐先アドレス及び呼出先アドレスを、それぞれの次の命令コードの開始位置として解析を行うため、ダミーのデータが挿入されている場合にも前述の「ｊｍｐ→ｃａｌｌ」構造、及び「ｃａｌｌ→ｐｏｐ」構造を検出することができる。
ステップＳ７１においてｃａｌｌ命令でないと判断した場合（Ｓ７１：ＮＯ）、バッファメモリ１３から読込んだ１バイトのデータがｒｅｔ命令、ｌｒｅｔ命令、ｉｎｔ３命令、又はｉｒｅｔ命令の何れかであるか否かを判断する（ステップＳ８１）。これらの命令は何れも呼出先のルーチンから呼出元のルーチンへ制御を戻すための命令を表している。前述の何れかの命令である場合には（Ｓ８１：ＹＥＳ）、現在解析している命令系列を終端させ（ステップＳ８２）、処理を解析・判定処理ルーチンへ戻す。また、前述の何れの命令でもないと判断した場合（Ｓ８１：ＮＯ）、命令系列を終端させることなく、処理を解析・判定処理ルーチンへ戻す。
第１４図は判定処理ルーチンの処理手順を説明するフローチャートである。データ処理装置１０のＣＰＵ１１は、前述の解析処理ルーチンによって終端した命令系列にｉｎｔ命令が検出されているか否かを判断する（ステップＳ９１）。ｉｎｔ命令が検出されていない場合（Ｓ９１：ＮＯ）、割込み処理によりシステムコールが呼出されて外部コマンドが実行されることがないため、不正コード無しと判定する（ステップＳ９２）。
解析処理により終端した命令系列にｉｎｔ命令が検出されている場合（Ｓ９１：ＹＥＳ）、ＣＰＵ１１は、「ｃａｌｌ→ｐｏｐ」構造、又は「ｊｍｐ→ｃａｌｌ」構造が検出されているか否かを判断する（ステップＳ９３）。何れの構造も検出されていない場合（Ｓ９３：ＮＯ）、不正コード無しと判断する（Ｓ９２）。
「ｃａｌｌ→ｐｏｐ」構造、又は「ｊｍｐ→ｃａｌｌ」構造の何れかを検出した場合（Ｓ９３：ＹＥＳ）、コマンドデータにパスの区切りを表す”／”に対応する文字コードがあるか否かを判断する（ステップＳ９４）。コマンドデータに前記文字コードがない場合（Ｓ９４：ＮＯ）、不正コード無しと判定する（Ｓ９２）。また、コマンドデータに前記文字コードがある場合（Ｓ９４：ＹＥＳ）、割込み処理によってシステムコールが呼出されて外部コマンド（シェルコード）が実行される蓋然性が高いと判断し、不正コード有りと判定する（ステップＳ９５）。
なお、本実施の形態では、不正コードの検出精度を高めるために外部コマンドにパスの区切りを示す”／”が含まれているか否かを判断して傍証を行うようにしているが、ステップＳ９３で「ｊｍｐ→ｃａｌｌ」構造又は「ｃａｌｌ→ｐｏｐ」構造を検出した段階で不正コード有りと判定するようにしても良い。したがって、検出精度が要求されるような環境での使用が予定されている場合にはステップＳ９４による傍証まで行い、検出精度が要求されないような環境での使用が予定されている場合にはステップＳ９４による傍証を省略するようにしても良い。
また、本実施の形態では、パスの区切りを表す文字コードの例として”／”を挙げたが、異なる種類の保護対象ＣＰＵでは、パスの区切りを示す文字コードとして”￥”が使用されている場合もあり、傍証に用いる文字コードは必ずしも”／”に限定されず、保護対象ＣＰＵの種類に応じて予め設定しておくことが必要となる。
（第２実施の形態）
第１実施の形態で説明した解析・判定処理ルーチンを用いて不正コードを検出する手法の他に、本実施の形態で説明するルーチンを用いて不正コードを検出することも可能である。なお、データ処理装置１０のハードウェアの構成、第４図及び第５図に示したデータの読込みに関するルーチン、及び第６図に示した解析・判定処理ルーチンは、本実施の形態においてもそのまま援用できるため、その説明は省略することとする。
第１５図〜第１９図は本実施の形態に係る解析処理ルーチンの処理手順を説明するフローチャートである。データ処理装置１０のＣＰＵ１１は、まず、状態、変数、カウンタのそれぞれに付随する生存期間をデクリメントする（ステップＳ１０１）。本実施の形態では解析中の状況を示すパラメータとして状態、変数、及びカウンタを導入しており、それぞれのパラメータをセットしたときに生存期間として正の既定値をセットするようにしている。後述するように、状態としては、ｐｏｐ命令が出現することを待機している状態を示す「ｐｏｐ命令待機中」状態、「ｃａｌｌ→ｐｏｐ」構造を確認すべき状態にあることを示す「ｃａｌｌ→ｐｏｐ確認」状態を導入する。また、変数としては、ｐｕｓｈ命令及びｐｏｐ命令の出現回数のバランスを調べるためのｐｕｓｈ−ｐｏｐバランス変数を導入する。また、カウンタには、「ｃａｌｌ→ｐｏｐ」構造が出現する蓋然性が高い状態を計数するｃａｌｌ→ｐｏｐ確認カウンタを導入する。生存期間は、各パラメータ毎に予め設定された値であり、解析処理ルーチンを繰り返す毎に１ずつ減少させてゆくことで、解析処理ルーチンの実行回数に対する有効性を示している。なお、本ステップで生存期間をデクリメントした結果、生存期間が０となったものは、ここで初期化が行われる。
次いで、ＣＰＵ１１は、命令テーブルを参照することにより、バッファメモリ１３から読込んだ１バイトのデータがｊｍｐ命令であるか否かを判断する（ステップＳ１０２）。ｊｍｐ命令であると判断した場合（Ｓ１０２：ＹＥＳ）、当該ｊｍｐ命令により指示される分岐先アドレスが、次の命令位置よりも大きいか否かを判断する（ステップＳ１０３）。分岐先アドレスが次の命令位置よりも小さいと判断した場合（Ｓ１０３：ＮＯ）、本ルーチンを終了して解析・判定処理ルーチンへ処理を戻す。
また、分岐先アドレスが次の命令位置よりも大きいと判断した場合（Ｓ１０３：ＹＥＳ）、分岐先アドレスとともに次の命令位置を対として分岐先リストに記憶する（ステップＳ１０４）。ここで、分岐先リストは複数のアドレスを記憶できるリスト形式の記憶領域であり、メモリ１２内にその記憶領域が確保される。そして、次の命令位置を分岐先アドレスに変更した後（ステップＳ１０５）、処理を解析・判定処理ルーチンへ戻す。
ステップＳ１０２においてｊｍｐ命令でないと判断した場合（Ｓ１０２：ＮＯ）、ＣＰＵ１１は、バッファメモリ１３から読込んだ１バイトのデータがｃａｌｌ命令であるか否かを判断する（ステップＳ１０６）。ｃａｌｌ命令であると判断した場合（Ｓ１０６：ＹＥＳ）、呼出先アドレスが次の命令位置より大きいか否かを判断する（ステップＳ１０７）。呼出先アドレスが次の命令位置よりも大きいと判断した場合（Ｓ１０７：ＹＥＳ）、呼出先アドレスと次の命令位置との差が既定値（例えば、１０バイト程度）より小さいか否かを判断する（ステップＳ１０８）。差が既定値よりも大きいと判断した場合（Ｓ１０８：ＮＯ）、処理を解析・判定処理ルーチンへ戻す。
差が既定値よりも小さいと判断した場合（Ｓ１０８：ＹＥＳ）、ｐｕｓｈ−ｐｏｐバランス変数をクリアし、「ｐｏｐ命令待機中」状態であることを記憶する（ステップＳ１０９）。本実施の形態では、ｃａｌｌ命令から１０バイト程度の範囲内にその呼出先アドレスが有る場合、ｐｕｓｈ命令が先行しないｐｏｐ命令を検出するために、ｐｕｓｈ−ｐｏｐバランス変数を導入する。すなわち、ステップＳ１１８以降で、ｐｕｓｈ命令を見つけた場合、ｐｕｓｈ−ｐｏｐバランス変数をインクリメントし、ｐｏｐ命令を見つけた場合、ｐｕｓｈ−ｐｏｐバランス変数をデクリメントして、最終的にｐｕｓｈ−ｐｏｐバランス変数の正負を判定することでｐｕｓｈ命令が先行しないｐｏｐ命令を検出するようにしている。
「ｐｏｐ命令待機中」状態であることを記憶した後、ＣＰＵ１１は、次の命令位置を呼出先アドレスに変更し（ステップＳ１１０）、処理を解析・判定処理ルーチンへ戻す。
一方、ステップＳ１０７において、ｃａｌｌ命令の呼出先アドレスが次の命令位置よりも小さいと判断した場合（Ｓ１０７：ＮＯ）、呼出先アドレスが解析開始位置より小さいか否かを判断する（ステップＳ１１１）。呼出先アドレスが解析開始位置よりも小さいと判断した場合（Ｓ１１１：ＹＥＳ）、処理を解析・判定処理ルーチンへ戻す。また、呼出先アドレスが解析開始位置よりも大きいと判断した場合（Ｓ１１１：ＮＯ）、前述した分岐先リストに記憶されている次の命令位置と分岐先アドレスとの間に、呼出先アドレスが位置するものがあるか否かを判断する（ステップＳ１１２）。次の命令位置と分岐先アドレスとの間に、呼出先アドレスが位置するものがある場合（Ｓ１１２：ＹＥＳ）、ｐｏｐ命令が置かれた場所のリスト内のアドレスが、呼出先アドレスから所定範囲（例えば、数バイト）内に存在するか否かを判断する（ステップＳ１１３）。
呼出先アドレスから所定範囲内に、ｐｏｐ命令が置かれた場所のリスト内のアドレスが存在する場合（Ｓ１１３：ＹＥＳ）、呼出先アドレスが、ｐｏｐ命令が置かれた場所のリスト内のアドレスに一致するか否かを判断する（ステップＳ１１４）。そして、一致すると判断した場合（Ｓ１１４：ＹＥＳ）、「ｃａｌｌ→ｐｏｐ」構造を検出した旨を記憶し（ステップＳ１１５）、一致しない場合（Ｓ１１４：ＮＯ）、「ｊｍｐ→ｃａｌｌ」構造を検出した旨を記憶する（ステップＳ１１６）。そして、命令系列を終端させ（ステップＳ１１７）、処理を解析・判定処理ルーチンへ処理を戻す。なお、ステップＳ１１２において、呼出先アドレスが次の命令位置と分岐先アドレスとの間にない場合（Ｓ１１２：ＮＯ）、ステップＳ１１３において、呼出先アドレスから所定範囲内に、ｐｏｐ命令が置かれた場所のリスト内のアドレスが存在しない場合（Ｓ１１３：ＮＯ）、命令系列を終端させることなく解析・判定処理ルーチンへ処理を戻す。
ステップＳ１０６においてｃａｌｌ命令でないと判断した場合（Ｓ１０６：ＮＯ）、ＣＰＵ１１は、バッファメモリ１３から読込んだ１バイトのデータがｐｏｐ命令であるか否かを判断する（ステップＳ１１８）。ｐｏｐ命令であると判断した場合（Ｓ１１８：ＹＥＳ）、リストに現在位置を記憶し（ステップＳ１１９）、ｐｕｓｈ−ｐｏｐバランス変数をデクリメントする（ステップＳ１２０）。そして、ＣＰＵ１１は、現在の状態が「ｐｏｐ命令待機中」状態であり、しかもｐｕｓｈ−ｐｏｐバランス変数が負であるか否かを判断する（ステップＳ１２１）。「ｐｏｐ命令待機中」状態であり、しかもｐｕｓｈ−ｐｏｐバランス変数が負であると判断した場合（Ｓ１２１：ＹＥＳ）、ｐｏｐ命令で使用されたレジスタ番号を記憶し、「ｃａｌｌ→ｐｏｐ確認」状態であることをメモリ１２に記憶する（ステップＳ１２２）。そして、ｃａｌｌ→ｐｏｐ確認カウンタをクリアした上で（ステップＳ１２３）、処理を解析・判定ルーチンへ戻す。また、「ｐｏｐ命令待機中」でない場合、又はｐｕｓｈ−ｐｏｐバランス変数が負でない場合（Ｓ１２１：ＮＯ）、本ルーチンを終了して解析・判定処理ルーチンへ処理を戻す。
ステップＳ１１８においてｐｏｐ命令でないと判断した場合（Ｓ１１８：ＮＯ）、ＣＰＵ１１は、バッファメモリ１３から読込んだ１バイトのデータがｐｕｓｈ命令であるか否かを判断する（ステップＳ１２４）。ｐｕｓｈ命令であると判断した場合（Ｓ１２４：ＹＥＳ）、ｐｕｓｈ−ｐｏｐバランス変数をインクリメントした上で（ステップＳ１２５）、処理を解析・判定処理ルーチンへ戻す。
ステップＳ１２４においてｐｕｓｈ命令でないと判断した場合（Ｓ１２４：ＮＯ）、ＣＰＵ１１は、バッファメモリ１３から読み込んだ１バイトのデータがｍｏｖ命令であるか、又は論理演算命令であるか否かを判断する（ステップＳ１２６）。ｍｏｖ命令又は論理演算命令であると判断した場合（Ｓ１２６：ＹＥＳ）、「ｃａｌｌ→ｐｏｐ確認」状態でメモリアドレッシングのベースレジスタに記憶されているレジスタ番号を使用しているか否かを判断する（ステップＳ１２７）。前記レジスタ番号を使用していると判断した場合（Ｓ１２７：ＹＥＳ）、ｃａｌｌ→ｐｏｐ確認カウンタをインクリメントし（ステップＳ１２８）、ｃａｌｌ→ｐｏｐ確認カウンタの値が既定値（例えば、３〜５程度）以上であるか否かを判断する（ステップＳ１２９）。ｃａｌｌ→ｐｏｐ確認カウンタの値が既定値以上であると判断した場合（Ｓ１２９：ＹＥＳ）、「ｃａｌｌ→ｐｏｐ」構造を検出した旨を記憶し（ステップＳ１３０）、命令系列を終端させた上で（ステップＳ１３１）、処理を解析・判定処理ルーチンへ戻す。なお、ステップＳ１２７において、記憶されているレジスタ番号を使用していないと判断した場合（Ｓ１２７：ＮＯ）、また、ステップＳ１２９において、ｃａｌｌ→ｐｏｐ確認カウンタの値が既定値よりも小さいと判断した場合（Ｓ１２９：ＮＯ）、命令系列を終端させることなく処理を解析・判定処理ルーチンへ戻す。
ステップＳ１２６において、ｍｏｖ命令でも論理演算命令でもないと判断した場合（Ｓ１２６：ＮＯ）、終端命令とマークされた命令であるか否かを判断する（ステップＳ１３２）。本実施の形態では、命令コードとその命令コードの命令長等との関係を規定した命令テーブルを用いているが、その命令テーブルにて終端命令を予めマークしておくことで、終端命令とマークされた命令であるか否かを判断することができる。終端命令としてマークしておくべき命令には以下のものが存在する。（１）システムプログラムでしか使われない保護機能命令（ＡＲＰＬ，ＬＧＤＴ，ＬＩＤＴ，ＳＧＤＴ，ＳＩＤＴ，ＬＬＤＴ，ＬＴＲ，ＳＬＤＴ，ＳＴＲ，ＬＭＳＷ，ＳＭＳＷ，ＬＡＲ，ＬＳＬ，ＶＥＲＷ，ＣＬＴＳ，ＨＬＴ，コントロールレジスタ、デバックレジスタに対するＭＯＶ等）、（２）セグメントセレクタを使用する命令（ｍｏｖ，ｐｕｓｈ，ｐｏｐの一部、ＬＥＳ，ＬＤＳ等）、（３）入出力命令（ＩＮ，ＯＵＴ，ＩＮＳ，ＯＵＴＳ等）、（４）まれにしか使用されない命令（ＤＡＡ，ＤＡＳ，ＡＡＡ，ＡＡＳ，ＢＯＵＮＤ，ＰＵＳＨＦ，ＰＯＰＦ，ＳＡＨＦ，ＬＡＨＦ）、（５）関数又は割込みルーチンの開始、終了を指示する命令（ＥＮＴＥＲ，ＬＥＡＶＥ，ＲＥＴ，ＬＲＥＴ，ＩＮＴ３，ＩＮＴＯ，ＩＲＥＴ）。なお、これらの命令は、特定のＣＰＵに特化した命令であり、保護対象ＣＰＵが変われば終端命令としてマークしておくべき命令が変わるのは勿論のことである。ステップＳ１３２において、終端命令とマークされた命令であると判断した場合（Ｓ１３２：ＹＥＳ）、解析中の命令系列を終端させた上で（Ｓ１３１）、処理を解析・判定処理ルーチンへ戻し、終端命令とマークされた命令でないと判断した場合（Ｓ１３２：ＮＯ）、命令系列を終端させることなく処理を解析・判定処理ルーチンへ戻す。また、終端命令を検出する代わりに、不正なアドレッシング形式を持つ命令を検出した場合、不正なプレフィックスが使用されていることを検出した場合にも、命令系列を終端させた上で処理を解析・判定処理ルーチンへ戻すようにしても良い。
第２０図は本実施の形態に係る判定処理ルーチンの処理手順を説明するフローチャートである。本判定処理ルーチンでは、データ処理装置１０のＣＰＵ１１が、「ｃａｌｌ→ｐｏｐ」構造又は「ｊｍｐ→ｃａｌｌ」構造が検出されているか否かを判断し（ステップＳ１４１）、何れかの構造が検出されたと判断した場合（Ｓ１４１：ＹＥＳ）、不正コード有りと判定し（ステップＳ１４２）、何れの構造も検出されていないと判断した場合（Ｓ１４１：ＮＯ）、不正コード無しと判定する（ステップＳ１４３）。そして、解析・判定処理ルーチンへ処理を戻す。
（第３実施の形態）
第１実施の形態では、ルータ、ブロードバンドルータ、スイッチ等のデータ通信で利用される中継装置に本発明を適用した形態について説明したが、パーソナルコンピュータ、サーバ装置、携帯電話機、ＰＤＡ等の通信機能を有した情報処理装置に適用することも可能である。
第２１図は本実施の形態に係るデータ処理装置の構成を説明する模式図である。図中１００は、パーソナルコンピュータのような情報処理装置であり、情報処理装置１００は、ＣＰＵ１０１を備えており、バス１０２を介して、ＲＯＭ１０３、ＲＡＭ１０４、操作部１０５、表示部１０６、通信部１０７、内部記憶装置１０８、及び補助記憶装置１０９等の各種ハードウェアに接続されている。ＣＰＵ１０１は、ＲＯＭ１０３に格納された制御プログラムに従って、それらのハードウェアを制御する。ＲＡＭ１０４は、ＳＲＡＭ又はフラッシュメモリ等で構成され、ＲＯＭ１０３に格納された制御プログラムの実行時に発生するデータ、通信部１０７を介して受信した外部ネットワークからの各種のデータを受信する。
操作部１０５は、キーボード、マウス等の入力装置であり、表示部１０６は、ＣＲＴ、液晶ディスプレイ等の表示装置である。操作部１０５及び表示部１０６は、例えば、送信すべきデータの入力及び表示をする際に利用される。通信部１０７は、モデム等の回線終端装置を備えており、外部ネットワークとの間でやり取りされる各種データの送受信を制御する。
補助記憶装置１０９は、本発明のコンピュータプログラム等を記録したＦＤ、ＣＤ−ＲＯＭ等の記録媒体Ｍからコンピュータプログラム等を読取るＦＤドライブ、ＣＤ−ＲＯＭドライブ等からなり、読取られたコンピュータプログラムは、内部記憶装置１０８に格納される。内部記憶装置１０８に格納されたコンピュータプログラムは、ＣＰＵ１０１からの指示に応じて適宜ＲＡＭ１０４に読込まれて実行される。ＣＰＵ１０１が本発明のコンピュータプログラムを実行することによって情報処理装置１００は通信部１０７にて受信したデータから不正コードを検出する装置として機能する。
前述のコンピュータプログラムは、情報処理装置１００の起動時に自動的にＲＡＭ１０４に読込まれる常駐型のプログラムであることが望ましく、通信部１０７にて外部からデータを受信した際に、自動的に不正コードを検出するようにしておくとよい。なお、不正コードの検出手順については、実施の形態１で説明した通りであるので説明を省略する。
なお、本発明のコンピュータプログラムは、記録媒体Ｍにより提供される形態として説明したが、通信部１０７を介した通信手段によって提供される形態であってもよい。
また、本実施の形態では、パーソナルコンピュータのような情報処理装置１００を利用して不正コードを検出する構成としたが、パーソナルコンピュータの他、携帯電話機、ＰＤＡ、コンピュータゲーム機、車載通信装置、各種の情報家電に適用できることは勿論である。
また、本発明のコンピュータプログラムをＦＤ、ＣＤ−ＲＯＭ等の記録媒体に記録させて提供することにより、コンピュータウィルスを検出するアプリケーションソフトウェアのパッケージとして提供することも可能である。
【産業上の利用可能性】  第１発明、第２発明、第１２発明、及び第１３発明による場合は、記憶手段からデータをバイト単位で順次的に読出して不正処理を実行する命令コードが含まれているか否かを判定する際、読出し位置が異なる複数のデータ系列について、命令コードの出現パターンを検出ようにしている。したがって、通常のデータには見られないような命令コードの出現パターンに着目して検出を行うことで、未知の不正コードが現れたときでも、不正コードの本質的な処理内容が変わらない限り対処することが可能となる。また、本発明では命令コードの出現パターンに基づいて検出を行うため、検出の開始位置をどこに設定するかによって検出する出現パターンが異なってくる場合が生じるが、読出し位置を順次異ならせた複数のデータ系列について検出するようにしているため、誤った判定をすることが少なくなり、検出精度を高めることができる。
第３発明による場合は、命令コードの１バイト目のデータと、命令コードのバイト長との対応関係を記憶したテーブルを備えているため、データの読出し位置がある命令系列において命令コードの先頭バイト以外に位置しているときには、不正コードの検出を行わないようにすることができ、処理速度の向上を図ることができる。
第４発明による場合は、実行中の命令コード群が置かれた記憶手段上のアドレスを取得する処理が含まれる出現パターンを検出するようにしているため、不正コードの本質的な構造に着目した検出手法の提案が可能となる。
第５発明による場合は、所定の処理を実行する命令コード群を呼出すための命令コードを含み、呼出し先の命令コード群において、前記命令コードの復帰先のアドレスを取得する命令コードを含んでいる出現パターンを検出するようにしている。したがって、不正処理を実行させるようなデータであるか否かを容易に判定することができ、しかもその本質的な構造に基づいて検出しているため、未知の不正コードに対しても対処することが可能となる。
第６発明による場合は、分岐命令の分岐先が前述の命令コード群に対応付けられている出現パターンを検出するようにしている。したがって、不正処理を実行させるようなデータであるか否かを容易に判定することができ、しかもその本質的な構造に基づいて検出しているため、未知の不正コードに対しても対処することができる。
第７発明による場合は、更にシステムコールを起動する命令コードを含んだ出現パターンを検出するようにしている。したがって、不正コードが実行される蓋然性が高くなる場合を検出できるため、検出精度を高めることができる。
第８発明による場合は、復帰先アドレスを起点としたデータの書換えを指示する命令コードを含んだ出現パターンを検出するようにしている。したがって、実行前の段階でどのような処理が実行されるのかが分からないような不正コードにも対処することが可能となる。
第９発明による場合は、前述の命令コードを呼び出すための命令コードの後に所定の文字コードを含んでいるか否かを判定するようにしているため、特定のＣＰＵに対する不正コードの検出処理において検出精度を高めることができる。
第１０発明による場合は、検出すべき命令コードの出現パターンを検出した場合、そのデータが不正処理を実行するデータであると判定するようにしているため、不正処理を実行させるようなデータであるか否かを容易に判定することができ、しかもその本質的な構造に基づいて判定しているため、未知の不正コードに対しても対処することが可能となる。
第１１発明による場合は、検出したデータ系列が不正処理を実行するデータであると判定した場合、外部へその旨を報知するようにしている。したがって、不正コードを検出した時点で通信の遮断等を行って、当該不正コードにより生じる不具合を防止することができる。
【図１】
2004077295.tif 000003
【図２】
2004077295.tif 000004
【図３】
2004077295.tif 000005
【図４】
2004077295.tif 000006
【図５】
2004077295.tif 000007
【図６】
2004077295.tif 000008
【図７】
2004077295.tif 000009
【図８】
2004077295.tif 000010
【図９】
2004077295.tif 000011
【図１０】
2004077295.tif 000012
【図１１】
2004077295.tif 000013
【図１２】
2004077295.tif 000014
【図１３】
2004077295.tif 000015
【図１４】
2004077295.tif 000016
【図１５】
2004077295.tif 000017
【図１６】
2004077295.tif 000018
【図１７】
2004077295.tif 000019
【図１８】
2004077295.tif 000020
【図１９】
2004077295.tif 000021
【図２０】
2004077295.tif 000022
【図２１】
2004077295.tif 000023
【国際調査報告】
2004077295.tif 000024
2004077295.tif 000025
2004077295.tif 000026
2004077295.tif 000027