一例である実施形態は、付随する図面を使用して、追加的具体性及び詳細さを伴って、記述され且つ説明される。
未知のバイナリプログラムに対する有効入力シーケンスを判定する受け入れ可能な方法は、種々の要素を含むことができる。1つの要素は、未知のバイナリプログラムに含まれるコード及びルーチン(デッドコードは除外)の高いパーセンテージをカバーすることを含むことができる。例えば、未知のバイナリプログラムをテストするために選択される1つ以上のテスト入力又は入力シーケンスは、未知のバイナリプログラムに対するコード及びルーチンの100%又は100%近くをカバーできる(例えば、デッドコード及びルーチンを除外して、バイナリプログラムの90%から100%)。幾つかの現在の方法は、未知のバイナリプログラムをテストするためのランダムなテスト入力の生成に依存している。残念なことに、ランダムに生成されるテスト入力は、未知のバイナリプログラムに対するコード及びルーチンの高いパーセンテージを一貫してカバーする目標とは本質的に相いれない可能性があるので、未知のバイナリプログラムをテストするためのランダムなテスト入力の生成を含むテスト方法は、未知のバイナリプログラムに対するコード及びルーチンの高いパーセンテージを一貫してカバーすることは可能ではない。結果として、幾つかの現存する方法は、バイナリプログラムに対するコード及びルーチンの高いパーセンテージを一貫してカバーすることは可能ではないので、これらの方法は受け入れることができないと考えられる。
未知のバイナリプログラムに対する有効入力シーケンスを判定する受け入れ可能な方法の別の要素は、未知のバイナリプログラムに関連する仕様、文書、又はソースコードなしに効果的に実現される能力を含むことができる。この必要条件は、コンピュータシステムが、ソフトウェアにおける弱点を自動的に判定することが利点である、自律ソフトウェアセキュリティの分野では利点であり得る。幾つかの状況では、未知のバイナリプログラムは、未知のバイナリプログラムの人間のテスト担当者が利用できるが、未知のバイナリプログラムに関連する仕様、文書、及びソースコードは利用できないことがある。幾つかの現存の方法は、未知のバイナリプログラムに対する有効入力を判定しようと試みている。しかし、これらの方法は、ランダムに生成されるテスト入力に依存、又は他の欠点を有している。
未知のバイナリプログラムに対する有効入力シーケンスを判定する受け入れ可能な方法の更に別の要素は、プラットフォーム独立性を含むことができる。プラットフォーム独立性は、他の有利点を提供すると共に、方法の移植性を有利に改善できる。
現在では、上記に検討した要素を含んでいる未知のバイナリプログラムに対する有効入力シーケンスを判定する方法は出現していない。未知のバイナリプログラムに対する有効入力シーケンスを判定するために、種々の方法が使用されている。しかし、これらの方法のうち、未知のバイナリプログラムに対する有効入力シーケンスを判定する受け入れ可能な方法の上記に検討した要素を全て、又は要素の幾つかさえも提供するものはない。
そのような方法の1つは、「シンボリック実行」と称することができる。シンボリック実行アプローチは、プログラムをクラッシュさせる可能性を含む種々の実行経路に沿ってプログラムを駆動できる、未知のバイナリプログラムに対する入力を判定することを含んでいる。このアプローチは、幾つかの隔離された例では成功する可能性がある。しかし、シンボリック実行アプローチに関連する1つの欠点は、未知のバイナリプログラムに関連するソースファイルを使用することである。幾つかの例では、ソースファイルが利用できないことがある。結果として、シンボリック実行アプローチの実現は、これらの例では可能ではない。他の欠点としては、シンボリック実行アプローチのスケール変更が容易ではないことであり、そのため、多くの通常の状況で作動できないことが挙げられる。例えば、シンボリック実行アプローチは、不動小数点演算を含むプログラム、又はプログラムの実行中に収集された入力に対する非線形制約を含むプログラムとの作動についての知られている問題を有している。少なくともこれらの理由のために、シンボリック実行アプローチは、未知のバイナリプログラムに対する有効入力を判定する受け入れ可能な方法ではない。
別の方法は、「ブラックボックスファジング」として知られている。このアプローチは、ストリングを選択すること、及びストリングをランダムに変更することを含むことができる。ストリングは、各変更の後に、入力として未知のバイナリプログラムに供給できる。このアプローチは、十分な時間があれば効果がある可能性があるが、ブラックボックスファジングにより生成される入力のほとんどは、無効入力である。このことは、追加の有効入力を変化させて識別するためには有効入力が必要であるために問題がある。ブラックボックスファジングに関連する追加的な問題は、このアプローチがランダム入力に依存しているため、未知のバイナリプログラムの高いカバレッジを保証せずに、ブラックボックスファジングを実現した結果が、高いカバレッジを達成するかを知ることは可能ではないということである。
別の方法は、「ホワイトボックスファジング」として知られている。ホワイトボックスファジングアプローチは、ブラックボックスファジングに類似しているが、解析してテスト入力を製造することができるシンボリック制約を収集するために有効入力が使用されることが異なる。ホワイトボックスファジングアプローチは、ランダムに達成されたのではない少なくとも幾つかの入力を含むために、ブラックボックスファジングよりも改善されていると考えることができる。しかし、ホワイトボックスアプローチは、テスト入力を判定するために実現される前に、有効入力を前提条件として要求する。幾つかの例では、有効入力は、ホワイトボックスファジングアプローチに対するシード(種)として利用できない。この理由のため、単独で実現されるホワイトボックスファジングアプローチは、未知のバイナリプログラムに対する有効入力を判定する問題を解決することは可能ではない。
別の方法は、「ユニットテスト」として知られており、プログラムに対するコードはユニットに分割され、系統的にテストされる。ユニットテストは、幾つかの例では、バイナリプログラムの高いカバレッジテストを達成可能できる可能性があるが、このアプローチは、未知のバイナリプログラムに対する仕様のような未知のバイナリプログラムに関連するソースファイル又は他の文書を常に必要とする。この情報なしでは、ユニットテストを実現することはできない。そのため、ユニットテストアプローチは、ソースファイル又は他の文書を必要とするので、未知のバイナリプログラムに対する有効入力を判定する問題を解決することは可能ではない。ユニットテストアプローチに関連する他の欠点は、プラットフォームに依存するということである。ユニットテストアプローチはまた、遅くて高価であるとも考えられている。
別の方法は、「仕様ベーステスト」として知られている。しかし、この名称が示すように、仕様ベーステストアプローチは、未知のバイナリプログラムに関連するソースファイル又は他の文書を常に必要とする。そのため、このアプローチは、ソースファイル又は他の文書を必要とするので、未知のバイナリプログラムに対する有効入力を判定する問題を解決することは可能ではない。ユニットテストと同様に、仕様ベーステストアプローチもまた、プラットフォームに依存し、遅くて高価であると考えられている。
他の方法としては、「リバースコードエンジニアリング」を含めることができる。リバースコードエンジニアリングアプローチは、「情報交換解析」アプローチ、「ディスアセンブリ」アプローチ、及び「デコンパイル」アプローチを含むことができる。情報交換解析アプローチは、情報が未知のバイナリプログラムにより交換されない場合は、有効でない可能性もあるので、このアプローチは制限があり、受け入れることができない。ディスアセンブリアプローチは、未処理アセンブリコードの静的又は動的解析に依存しており、多数の欠点を有している。例えば、未処理アセンブリコードの静的又は動的解析は、計算に掛る費用が高く、正確でなく、スケール変更が容易ではなく、重大な性能上のオーバヘッドをもたらす可能性がある。デコンパイルアプローチは、未知のバイナリプログラムに関連するソースコードを再構築して、ソースコード及び未知のバイナリプログラムを使用してテストに着手することを試みる。しかし、実際は、デコンパイルアプローチは、多くの状況で作動せず、デコンパイルアプローチで再構築を試みられた元々のソースコードファイルとは実際には実質的に異なるため、使用できず、品質が高くないソースコードファイルが作成される可能性がある。
本開示で検討される幾つかの実施形態は、未知のバイナリプログラムに対する有効入力シーケンスを判定するためのシステム及び/又は方法に関連している。これらの実施形態及び他の実施形態では、有効入力シーケンスは、未知のバイナリプログラムに対する有効入力として以前に判定された2つ以上の入力のシーケンスであってよい。未知のバイナリプログラムに対する有効入力シーケンスを判定することにより、未知のバイナリプログラムを、未知のバイナリプログラムに関する知識なしにテストすることができる。
幾つかの実施形態では、未知のバイナリプログラムに対する入力シーケンスは、未知のバイナリプログラムを、その入力シーケンスを使用して実行することに基づいて有効であると判定することができる。入力シーケンスを使用しての未知のバイナリプログラムの実行中に、アクセスされた1つ以上のメモリアドレスを記録することができる。アクセスされたメモリアドレスは、未知のバイナリプログラムにおける1つ以上の変数のそれぞれに対するメモリアドレス範囲と比較できる。記録されたメモリアドレスの1つ以上が、比較に基づいて、変数の1つ以上のメモリアドレス範囲に対応するときは、入力シーケンスは、未知のバイナリプログラムを新しいに状態に移動させる有効入力シーケンスの可能性があると判定できる。
幾つかの実施形態では、本開示で説明されるシステム及び/又は方法は、ランダムな入力生成に依存しないこともできる。このようにして、本開示で説明されるシステム及び/又は方法は、有効入力シーケンスを使用して、未知のバイナリプログラムの高いカバレッジを達成できる。これと比較して、ブラックボックスファジング及び他の技術のようなランダムな入力生成に依存する他の技術は、未知のバイナリプログラムの高いカバレッジを達成できない可能性がある。
幾つかの実施形態では、本開示で説明されるシステム及び/又は方法はまた、プラットフォームに依存しないものであってもよい。結果として、本開示で説明されるシステム及び/又は方法は、移植性を有することができ、多様な動作環境で使用できる。幾つかの実施形態では、本開示で説明されるシステム及び/又は方法はまた、未知のバイナリプログラムに関連するソースコード又は文書なしで首尾よく実現することもできる。幾つかの実施形態では、本開示で説明されるシステム及び/又は方法はまた、パケットスニッフィング(ネットワークを流れるパケットのモニタリング、調査、及び捕捉)、バス解析、又は情報の交換に依存する如何なる他の方法なしでも実現できる。結果として、本開示で説明されるシステム及び/又は方法は、リバースコードエンジニアリング技術なしで実現できる。
図1は、本開示で説明される少なくとも1つの実施形態に従って配置される入力シーケンス判定プロセス100を例示している。幾つかの実施形態では、プロセス100は、インスツルメンテーション(計装化又は実装化)モジュール110と、実行モジュール120と、有効化モジュール130を、未知のバイナリプログラム102に対する有効入力シーケンスを判定するために使用することができる。
インスツルメンテーションモジュール110は、未知のバイナリプログラム102を受信するように構成できる。未知のバイナリプログラム102は、バイナリプログラム全体であってよく、又は1つ以上の機能又はプログラムの他の態様のようなバイナリプログラムの一部であってよい。これらの実施形態及び他の実施形態では、未知のバイナリプログラム102は、プログラムのコンパイルされたバージョンを含むことができる。プログラムは、プログラムの機能を記述するコード及びルーチンを含むことができる。プログラムのコード及びルーチンは、プログラム、及びプログラムのコンパイルされたバージョンである未知のバイナリプログラム102に対して有効である可能性がある入力を定義できる。幾つかの実施形態では、プログラムに対する入力は、1つ以上の入力ストリングを含むことができる。コード及びルーチンにより有効と定義されない入力は、プログラムに対して有効でない可能性があるので、未知のバイナリプログラム102に対して有効でない可能性がある。
幾つかの実施形態では、未知のバイナリプログラム102は、ステートフルプログラム(ユーザとプログラムが複数ステップの対話に参加できるように、呼び出し間で情報を保持するプログラム)であってよい。これらの実施形態及び他の実施形態では、ステートフルプログラムは、過去の記憶を含むプログラムであってよい。ステートフルプログラムでは、以前のトランザクション(一連の処理)を覚えておくことができ、現在のトランザクションに影響を与えることができる。例えば、受信した以前のデータ入力について情報を変数に記憶して、現在のデータ入力の処理に影響を与えるために使用できる。ステートフルプログラムとして、プログラムはステートレスプログラムでなくてよい。これらの実施形態及び他の実施形態では、ステートレスプログラムは、過去の記憶を含んでいないプログラムであってよい。結果として、全ての要求又はトランザクションは、プログラムにより、あたかも初めて行われ、以前の要求又はトランザクションには関係しないように行うことができる独立した要求又はトランザクションであってよい。このため、後続の入力は、他の入力とは独立しており、以前の入力は、後続の結果又はプログラム応答には影響を与えない。
未知のバイナリプログラム102は、バイナリ形式で符号化され、処理装置による実行のために非持続的なコンピュータ読み取り可能記憶媒体に記憶されているコード及びルーチンを含むことができる。未知のバイナリプログラム102のコード及びルーチンは、人間によりテキストとして解釈され得る部分を含むことができるが、未知のバイナリプログラム102のコード及びルーチンは、人間が読み取り可能でなくてよい。これらの実施形態及び他の実施形態では、コード及びルーチンは、マシンにより読み取り可能であってよい。例えば、コード及びルーチンは、バイナリ又は他のマシン読み取り可能形式であってよい。
未知のバイナリプログラム102に対する有効入力が未知であってよいので、未知のバイナリプログラム102は「未知」であってよい。例えば、未知のバイナリプログラム102に関連する仕様、文書、又はソースコードは、未知のバイナリプログラム102の人間のテスト担当者、又は他のテスト機器に対して利用不可であってよい。結果として、人間のテスト担当者、又は他のテスト機器のテスト担当者は、未知のバイナリプログラム102に対する有効入力を判定可能でない。
インスツルメンテーションモジュール110は、未知のバイナリプログラム102に基づいて、インスツルメントされたバイナリプログラム112を生成するように構成できる。これらの実施形態及び他の実施形態では、インスツルメントされたバイナリプログラム112を生成するために、インスツルメンテーションモジュール110は、未知のバイナリプログラム102をインスツルメントできる。未知のバイナリプログラム102をインスツルメントするために、インスツルメンテーションモジュール110は、追加コード指令を未知のバイナリプログラム102に入力できる。追加コード指令は、未知のバイナリプログラム102の実行又はランタイムについての情報を出力できる。例えば、追加コード指令は、未知のバイナリプログラム102の実行中にアクセスされたメモリアドレスに関する情報を出力できる。
幾つかの実施形態では、インスツルメンテーションモジュール110は、PIN又は他のバイナリインスツルメンテーションプログラムのようなバイナリインスツルメンテーションプログラムを含むことができる。インスツルメンテーションモジュール110は、インスツルメントされたバイナリプログラム112を実行モジュール120に提供できる。
実行モジュール120は、インスツルメントされたバイナリプログラム112及び入力シーケンス104を受信するように構成できる。幾つかの実施形態では、各入力シーケンス104は、未知のバイナリプログラム102に対する2つ以上の異なる入力を含むことができる。幾つかの実施形態では、未知のバイナリプログラム102に対する入力は、以前に見出され、未知のバイナリプログラム102に対して有効入力と判定されていてよい。しかし、未知のバイナリプログラム102に対する入力を判定したということは、入力を未知のバイナリプログラム102に提供するための有効シーケンスを示してはいない。例えば、未知のバイナリプログラム102は4つの異なる入力を認識することが見出されてよい。入力の1つを受信後、未知のバイナリプログラム102は、別の入力又は同じ入力の1つを予期できる。これらの実施形態及び他の実施形態では、未知のバイナリプログラム102に提供できる入力の16の異なる2入力長シーケンスがあってよい。プロセス100は、入力の16の異なる2入力長シーケンスの何れが未知のバイナリプログラム102に対する有効入力シーケンスであるかを判定するように構成できる。
幾つかの実施形態では、有効2入力長シーケンスを判定後に、プロセス100は、有効な3入力長、4入力長、又は5入力長シーケンス、又は他の長さのシーケンスがあるかどうかを判定できる。幾つかの実施形態では、上記したように、未知のバイナリプログラム102はステートフルプログラムであってよい。これらの実施形態及び他の実施形態では、入力又は入力のシーケンスを入力することにより別の状態になった後に、未知のバイナリプログラム102に対する追加入力を見出すことができる。これらの実施形態及び他の実施形態では、プロセス100は、有効入力シーケンスを判定するときに、この追加入力を使用できる。
幾つかの実施形態では、シーケンスにおける2つ以上の異なる入力は、入力が未知のバイナリプログラム102にそれらに関連した順番で提供されるように順番を決めることができる。例えば、入力シーケンス104の1つにおける第1入力は、未知のバイナリプログラム102に最初に提供でき、入力シーケンス104の1つにおける第2入力は、未知のバイナリプログラム102に二番目に提供できる。
幾つかの実施形態では、入力シーケンス104に使用される各入力は、未知のバイナリプログラム102に対するコマンド及びコマンドに関連する引数を含むことができる。引数は、コマンドの受信後に、未知のバイナリプログラム102により予期できる。例えば、コマンドは、未知のバイナリプログラム102が特別な機能を呼び出す結果になる、未知のバイナリプログラム102における「呼び出し」コマンドであってよい。これらの実施形態及び他の実施形態では、「呼び出し」コマンドに関連する引数は、未知のバイナリプログラム102の実行時点で呼び出すことができる未知のバイナリプログラム102の内部機能であってよい。別の例としては、未知のバイナリプログラム102におけるコマンドは、未知のバイナリプログラム102における増大した機能を可能にする「オーソライズ(権限を与える)」コマンドであってよい。これらの実施形態及び他の実施形態では、「オーソライズ」コマンドの引数は、未知のバイナリプログラム102により使用され、未知のバイナリプログラム102が、未知のバイナリプログラム102の他のプロセスを実行することを可能にするトークン又はパスワードであってよい。入力シーケンスに対する有効コマンド及び引数をどのようにして判定するかの更なる説明は、図2に関してなされる。代替的に又は追加的に、入力シーケンス104の構築の更なる説明を、図2に関して説明できる。
実行モジュール120は、入力シーケンス104のそれぞれに対して別個に、インスツルメントされたバイナリプログラム112を実行するように構成できる。これらの実施形態及び他の実施形態では、インスツルメントされたバイナリプログラム112の各実行は、入力シーケンス104の1つを、インスツルメントされたバイナリプログラム112に対する入力として行なうことができる。例えば、3つの入力シーケンス104がある場合は、実行モジュール120は、インスツルメントされたバイナリプログラム112を3回実行でき、それぞれの実行は、3つの入力シーケンス104のそれぞれに対するものである。
入力シーケンス104の1つを使用したインスツルメントされたバイナリプログラム112の各実行中に、実行モジュール120は、インスツルメントされたバイナリプログラム112によりアクセスされたメモリアドレスを記録するように構成できる。これらの実施形態及び他の実施形態では、インスツルメントされたバイナリプログラム112は、実行されたときに、アクセスされたメモリアドレスを出力できる。実行モジュール120は、アクセスされたアクセスされたメモリアドレスを受信して記録できる。幾つかの実施形態では、アクセスされたメモリアドレスは、インスツルメントされたバイナリプログラム112の実行中に書き込まれたメモリアドレスを含むことができる。代替的に又は追加的に、アクセスされたメモリアドレスは、インスツルメントされたバイナリプログラム112の実行中に読み込まれたメモリアドレスを含むことができる。代替的に又は追加的に、アクセスされたメモリアドレスは、インスツルメントされたバイナリプログラム112の実行中に書き込まれ且つ読み込まれたメモリアドレスを含むことができる。
このようにして、実行モジュール120は、記録されたメモリアドレス122の複数の組を生成できる。記録されたメモリアドレス122の各組は、インスツルメントされたバイナリプログラム112の1回の実行により生成できる。例えば、入力シーケンス104の1つを使用しての実行モジュール120の1回の実行中に記録されたメモリアドレスは、記録されたメモリアドレス122の組の1つを形成できる。このため、記録されたメモリアドレス122の組の各組は、入力シーケンス104の1つに対応し、それと関連付けることができる。記録されたメモリアドレス122の組は、有効化モジュール130に提供できる。
ディスアセンブルモジュール140は、未知のバイナリプログラム102についての情報を有効化モジュール130に提供するように構成できる。幾つかの実施形態では、ディスアセンブルモジュール140は、未知のバイナリプログラム102を逆アセンブルするように構成できる。未知のバイナリプログラム102の逆アセンブルは、未知のバイナリプログラム102についての詳細情報を提供できる。例えば、幾つかの実施形態では、ディスアセンブルモジュール140は、未知のバイナリプログラム102を機械言語からアセンブリ言語に変換するように構成できる。
逆アセンブルされた未知のバイナリプログラム102に基づいて、ディスアセンブルモジュール140は、未知のバイナリプログラム102のデータ及びBSSメモリセクションにおける1つ以上の変数に対するメモリアドレス範囲142を判定するように構成できる。幾つかの実施形態では、ディスアセンブルモジュール140は、未知のバイナリプログラム102における静的変数、グローバル変数、又は静的グローバル変数の何れかの1つ以上に対するメモリアドレス範囲142を判定できる。幾つかの実施形態では、ディスアセンブルモジュール140は、未知のバイナリプログラム102についてのメモリアドレス範囲142を判定するプログラムを含むことができる。例えば、ディスアセンブルモジュール140は、objdump、TDUMP、DUMPBIN、readelf、又は他のプログラムのような未知のバイナリプログラム102についてのメモリアドレス範囲142を判定するためのプログラムを含むことができる。ディスアセンブルモジュール140は、メモリアドレス範囲142を有効化モジュール130に提供できる。
有効化モジュール130は、ディスアセンブルモジュール140からの情報を使用して、記録されたメモリアドレス122の1つ以上が、メモリアドレス範囲142の1つ以上に対応するかどうかを判定できる。記録されたメモリアドレス122の1つは、記録されたメモリアドレス122の1つが、メモリアドレス範囲142の1つ内にあるときは、メモリアドレス範囲142の1つに対応することができる。メモリアドレス範囲142の1つ内にある記録されたメモリアドレス122の1つは、メモリアドレス範囲に対応する変数は、未知のバイナリプログラム102の実行中に読み込まれた、又は書き込まれたかの何れかであることを示すことができる。
記録されたメモリアドレス122の1つ以上と、メモリアドレス範囲142の1つ以上の間の対応に基づいて、有効化モジュール130は、実行されたときに、記録されたメモリアドレス122の1つ以上を生成した入力シーケンス104は、有効入力シーケンス104であると判定できる。これらの実施形態及び他の実施形態では、有効な入力シーケンス104は、入力シーケンス104が未知のバイナリプログラム102により有効入力シーケンスとして認められるということを示すことができる。幾つかの実施形態では、有効な入力シーケンス104は、入力シーケンス104が未知のバイナリプログラム102を別の状態にさせるということを示すことができる。例えば、未知のバイナリプログラム102の実行中に未知のバイナリプログラム102に提供されると、有効入力シーケンス104は、未知のバイナリプログラム102を、動作の第1状態から動作の第2状態に遷移させることができる。
幾つかの実施形態では、有効化モジュール130は、有効化モジュール130がグローバル変数又は静的変数が、入力シーケンス104を使用しての未知のバイナリプログラム102の実行中に読み込まれた、又は書き込まれたと判定することに基づいて、入力シーケンス104は有効であると判定できる。代替的に又は追加的に、有効化モジュール130は、有効化モジュール130がグローバル変数又は静的変数が、入力シーケンス104を使用しての未知のバイナリプログラム102の実行中に読み込まれ且つ書き込まれたと判定することに基づいて、入力シーケンス104は有効であると判定できる。代替的に又は追加的に、有効化モジュール130は、有効化モジュール130がグローバル変数及び静的変数の両者が、入力シーケンス104を使用しての未知のバイナリプログラム102の実行中に読み込まれたと判定すること、又は書き込まれたと判定することに基づいて、入力シーケンス104は有効であると判定できる。有効化モジュール130は、入力シーケンス104及びメモリアドレス範囲142のそれぞれに対する記録されたメモリアドレス122に基づいて、入力シーケンス104のそれぞれに対する有効性を判定できる。
プロセス100の例を続ける。入力シーケンス104は、4つの異なるシーケンス、つまり、「HI OK」、「AUTH OK」、「AUTH <token>」、及び「HI <token>」を含むことができる。これらの実施形態及び他の実施形態では、入力は「HI」、「OK」、「AUTH」、及び「<token>」を含むことができる。これらの入力は、組み合わせて4つの異なる入力シーケンス104を形成できる。
実行モジュール120は、4つの異なる入力シーケンス104のそれぞれにより、インスツルメントされたバイナリプログラム112を実行できる。「HI OK」、「AUTH OK」、及び「HI <token>」入力シーケンス104に対しては、有効化モジュール130は、インスツルメントされたバイナリプログラム112におけるグローバル変数又は静的変数は、インスツルメントされたバイナリプログラム112の実行中に書き込まれ、又は読み込まれたのではないと判定できる。AUTH <token>入力シーケンス104に対しては、有効化モジュール130は、インスツルメントされたバイナリプログラム112におけるグローバル変数又は静的変数は、インスツルメントされたバイナリプログラム112の実行中に書き込まれ、又は読み込まれたかの何れかであると判定できる。結果として、有効化モジュール130は、「AUTH <token>」入力シーケンスは、未知のバイナリプログラム102対する有効入力シーケンスであると判定できる。本開示の範囲から逸脱することなく、プロセス100に対して修正、追加、又は省略を行うことができる。
図2は、本開示で説明される少なくとも1つの実施形態に従って配置できる入力判定プロセス200を例示している。プロセス200は、入力モジュール210及び実行モジュール220を使用して、未知のバイナリプログラム214に対する1つ以上の入力214、及び未知のバイナリプログラム214に対する入力シーケンス230を判定できる。未知のバイナリプログラム214における所与の状態に対する有効入力を判定するシステム及び方法は、2015年2月11日出願され、本願と同時に係属する米国特許出願第14/620,106号に記載されており、その全体は、本開示に参照文献として組み込まれる。
幾つかの実施形態では、プロセス200は、未知のバイナリプログラム214の状態に対する入力212を判定できる。幾つかの実施形態では、入力212は、1つ以上のインデックスを含むことができる入力ストリングにおける1つ以上の印刷可能文字であってよい。プログラムに対する入力ストリングは、1つ以上のインデックス及び1つ以上の印刷可能文字を含むことができる。インデックスは、ストリングで、印刷可能文字が発生する位置を含むことができる。例えば、受け入れる入力ストリングが、「Hello」及び「Howdy」である場合、インデックスは「0」、「1」、「2」、「3」、及び「4」である。この例では、インデックス「0」における有効文字は、印刷可能文字「H」を含む。インデックス「1」における有効文字は、印刷可能文字「e」及び「o」を含む。インデックス「2」における有効文字は、「l」及び「w」を含む。インデックス「3」における有効文字は、「l」及び「d」を含む。インデックス「4」における有効文字は、「o」及び「y」を含む。
有効入力ストリングであると考えられるためには、入力ストリングに含まれる各文字は、未知のバイナリプログラム214に対して有効である。有効入力ストリングの任意の所与のインデックスに対しても、入力ストリングにおける使用に利用できる印刷可能文字のほとんどは無効であってよい。プロセス200は、印刷可能文字の組を繰り返しテストして、それらが、未知のバイナリプログラム214に対する有効入力ストリングの異なるインデックスに対して有効文字であるかどうかを判定するように構成できる。
入力モジュール210は、印刷可能文字を実行モジュール220に入力212として選択して提供するように構成できる。実行モジュール220は、第1印刷可能文字を入力212として使用して未知のバイナリプログラム214を実行できる。実行モジュール220は、入力212を使用しての未知のバイナリプログラム214の実行中に、未知のバイナリプログラム214により行われる指令数を記録できる。行われた指令数は、実行モジュール220により指令カウント222として出力できる。指令カウント222は、入力モジュール210に提供できる。
入力モジュール210は、指令カウント222が閾値範囲を超えているかどうかを判定できる。指令カウント222が閾値範囲を超えているときは、入力モジュール210は第1印刷可能文字を、未知のバイナリプログラム214に対する状態における有効入力として含むことができる候補であると判定できる。指令カウント222が閾値範囲以下のときは、入力モジュール210は第1印刷可能文字を、未知のバイナリプログラム214に対する状態における有効入力として含めることができる候補でないと判定できる。
閾値範囲は、実行された指令数のモード(最頻値)及びテスト定数に基づいて判定できる。モードは、実行された指令数のモードを含むことができる。例えば、実行された指令数は組で記憶できる。組は1つ以上の数値を含むことができる。数値は、入力モジュール210により提供された各入力212に対して実行された指令数を表すことができる。例えば、第1入力が、実行される100の指令という結果となったとすると、第1入力に対する数値は「100」という数であってよい。組は、他の入力に対する他の数を含むことができる。モードは、組で最も多く出現する数値を含むことができる。
テスト定数は、「イプシロン」又は「テスト定数」と称することができる。テスト定数は、如何なる正の実数をも含むことができる。閾値範囲の上限は、テスト定数をモードに加算することにより判定できる。
第1印刷可能文字が、未知のバイナリプログラム214に対する状態における有効入力としての候補ではないとき、入力モジュール210は、実行のための第2印刷可能文字を実行モジュール220に提供できる。同様に、入力モジュール210は、第2印刷可能文字が、未知のバイナリプログラム214に対する状態における有効入力として含める候補であるかどうかを判定できる。プロセス200は示されているように、入力モジュール210が、未知のバイナリプログラム214の状態における有効入力に含める候補である文字を判定するまで動作を継続できる。
入力モジュール210は、別の文字を候補文字に連結して入力212を形成できる。特に、入力モジュール210は、第1候補文字を第1インデックス位置に、別の文字を第2インデックス位置に置くことができる。これらの実施形態及び他の実施形態では、候補文字と別の文字の連結は、部分的有効入力と称することができる。入力モジュール210は、入力212を実行モジュール220に提供できる。
実行モジュール220は、入力212を使用して未知のバイナリプログラム214を実行できる。未知のバイナリプログラム214の実行に基づいて、実行モジュール220は、指令カウント222を出力できる。入力モジュール210は、指令カウント222に基づいて、第2インデックス位置における別の文字が、未知のバイナリプログラム214に対する状態における有効入力に含めることができる候補であるかどうかを判定できる。
プロセス200は、未知のバイナリプログラム214の状態に対して、プロセス200により判定できる有効入力の全て、又は大半が判定されるまで同様な方法で継続できる。
幾つかの実施形態では、入力モジュール210は、有効入力を組み合わせて入力シーケンス230を形成できる。幾つかの実施形態では、入力シーケンス230に対する入力は、コマンド及びそれらに関連する引数であってよい。これらの実施形態及び他の実施形態では、プロセス200が、入力としてのコマンドを、可能性のある印刷可能文字と共に提供して、所与のコマンドに対する有効引数を提供できるとき以外は、コマンドは見つかるので、プロセス200は、同様な方法でコマンドに対する有効引数を判定できる。
幾つかの実施形態では、入力モジュール210は、判定された有効入力に対して、規定されている入力シーケンス長の全ての可能な入力シーケンスの順列を構築でき、全ての入力シーケンスの順列を入力シーケンス230として提供できる。本開示の範囲を逸脱することなく、プロセス200に対して修正、追加、又は省略を行うことができる。
図3は、本開示で説明される少なくとも1つの実施形態に従って配置できる入力及び入力シーケンス判定プロセス300を例示している。幾つかの実施形態では、プロセス300は、入力シーケンス判定プロセス310及び入力判定プロセス320を含むことができる。
入力シーケンス判定プロセス310は、図1に関して検討したプロセス100と類似したものであってよい。入力シーケンス判定プロセス310は、有効入力シーケンス312を判定し、有効入力シーケンス312を入力判定プロセス320に提供するように構成できる。入力判定プロセス320は、図2に関して検討したプロセス200と類似したものであってよい。入力判定プロセス320は、有効入力に基づいて入力シーケンス322を判定し、入力シーケンス322を入力シーケンス判定プロセス310に提供するように構成できる。
プロセス300の動作の例を続ける。入力判定プロセス320は、未知のバイナリプログラムの第1状態に対する複数の有効第1入力を判定できる。入力判定プロセス320は、第1状態に対する複数の有効第1入力に基づいて入力シーケンス322を判定して、入力シーケンス322を入力シーケンス判定プロセス310に提供できる。
入力シーケンス判定プロセス310は入力シーケンス322を受信して、何れの入力シーケンス322が、未知のバイナリプログラムの第1状態に対する有効入力シーケンスであるかを判定できる。有効入力シーケンスは、未知のバイナリプログラムを第2状態にさせることができる。入力シーケンス判定プロセス310は、第1状態に対する有効入力シーケンス312を入力判定プロセス320に提供できる。
入力判定プロセス320は有効入力シーケンス312を受信できる。有効入力シーケンス312を使用して、入力判定プロセス320は未知のバイナリプログラムを実行して、未知のバイナリプログラムを第2状態にさせることができる。第2状態の間は、入力判定プロセス320は、第1状態で有効入力ではなかった追加的な有効入力を判定できる。追加的な有効入力は、有効第2状態入力であってよい。
幾つかの実施形態では、入力判定プロセス320は、第1状態入力と第2状態入力を組み合わせて、第2状態に対する入力シーケンス322を判定できる。代替的に又は追加的に、入力判定プロセス320は、第2状態入力を使用し、第1状態入力を使用しないで、第2状態に対する入力シーケンス322を判定できる。入力判定プロセス320は、第2状態入力シーケンス322を、入力シーケンス判定プロセス310に提供できる。
入力シーケンス判定プロセス310は、第2状態に対する何れの入力シーケンス322が有効入力シーケンス312であるかを判定できる。第2状態に対する有効入力シーケンス312は、未知のバイナリプログラムを第3状態にさせることができる。入力シーケンス判定プロセス310は、第2状態に対する有効入力シーケンス312を、入力判定プロセス320に提供できる。プロセス300は、本開示で検討されるように、プロセス300に続く如何なる数の状態でも、有効入力及び有効入力シーケンス312の判定を継続できる。
幾つかの実施形態では、入力判定プロセス320は、入力シーケンス322の長さを変えるように構成できる。例えば、幾つかの実施形態では、第1状態からの入力シーケンス322は第1長であってよく、一方、第2状態からの入力シーケンス322は、第1長よりも長い又は短い第2長であってよい。幾つかの実施形態では、第3状態に対する入力シーケンス322は、可変の長さであってよい、これらの実施形態及び他の実施形態では、第1状態に対する入力シーケンス322は、第1状態及び任意の以前の状態に対して、入力判定プロセス320により判定された有効入力の全ての可能な組み合わせ/順列を含むことができる。例えば、入力判定プロセス320が、3つの有効入力A、B、及びCを判定すると仮定すると、入力A、B、及びCに対する入力シーケンス322は、A、B、C、AB、AC、BA、BC、CA、CB、ABC、ACB、BAC、BCA、CAB、及びCBAを含むことができる。代替的に又は追加的に、第1状態に対する入力シーケンス322は、第1状態及び任意の以前の状態に対して、入力判定プロセス320に判定された有効入力の可能な組み合わせ/順列の幾つか、又は全てを含むことができる。幾つかの実施形態では、入力シーケンスにおける入力の順序付けは、入力シーケンス322を、別の入力シーケンス322とは異なるものにさせることができる。例えば、入力シーケンスABは、入力シーケンスBAと異なるものであってよい。代替的に又は追加的に、入力シーケンスにおける入力の順序付けは、入力シーケンスを異なるものにさせなくてよい。
プロセス300は、異なる複数の有効入力及び有効入力シーケンスを判定して、未知のバイナリプログラム内で、異なる複数の状態間を行き交うための方法を提供するように構成できる。このようにして、未知のバイナリプログラムを、クラッシング、グリッチングのような適切な動作とは相いれないように動作させ、あるいは、不適切に動作させることができる入力の1つ以上のシーケンスを判定できる。更に、プロセス300の、有効入力及び有効入力シーケンス312を判定する機能は、未知のバイナリプログラムの適切な評価及び/又は動作を可能にできる。本開示におけるプロセス300及び他のプロセスの他の利点及び使用法もまた考慮及び予想される。
本開示の範囲から逸脱することなく、プロセス300に対して修正、追加、又は省略を行うことができる。例えば、入力シーケンス判定プロセス310と入力判定プロセス320は、単一のプロセスに組み合わせることができる。これらの実施形態及び他の実施形態では、入力シーケンス判定プロセス310及び入力判定プロセス320の実行モジュール220と他のモジュールは共有できる。
図4は、本開示で説明される少なくとも1つの実施形態に従って配置できる入力判定システム400のブロック図である。図4に例示されているように、システム400は、プロセッサ410と、メモリ412と、データストレージ414と、通信ユニット416を含むことができる。
一般的に、プロセッサ410は、任意の適切な特殊用途又は汎用コンピュータ、コンピューティングエンティティ、又は種々のコンピュータハードウェア又はソフトウェアモジュールを含む処理装置を含むことができ、任意の適用可能なコンピュータ読み取り可能記憶媒体に記憶されている指令を実行するように構成できる。例えば、プロセッサ410は、マイクロプロセッサ、マクロコントローラ、デジタル信号プロセッサ(DS)、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(Field-Programmable Gate Array:FPGA)、又はプログラム指令を解釈及び/又は実行し、及び/又はデータを処理するように構成されている任意の他のデジタル又はアナログ回路を含むことができる。図4では、単一プロセッサとして例示されているが、プロセッサ410は、任意の数のネットワーク又は物理的位置にわたって分散され、ここでて説明される任意の数の動作を個々に、又は一括して行うように構成されている任意の数のプロセッサを含むことができる。幾つかの実施形態では、プロセッサ410は、プログラム指令を解釈及び/又は実行し、及び/又はメモリ412、データストレージ414、又はメモリ412及びデータストレージ414に記憶されているデータを処理できる。幾つかの実施形態では、プロセッサ410は、データストレージ414からプログラム指令をフェッチし、プログラム指令をメモリ412にロードできる。プログラム指令がメモリ412にロードされた後、プロセッサ410は、図1、2、3、及び5それぞれのプロセス100、プロセス200、プロセス300及び/又は方法500を行う指令のようなプログラム指令を実行できる。
メモリ412及びデータストレージ414は、記憶されているコンピュータ実行可能指令又はデータ構造を保持又は有するためのコンピュータ読み取り可能記憶媒体又は1つ以上のコンピュータ読み取り可能記憶媒体を含むことができる。そのようなコンピュータ読み取り可能記憶媒体は、プロセッサ410のような汎用コンピュータ又は特殊用途コンピュータによりアクセスできる任意の利用可能媒体であってよい。例として、制限されることはないが、そのようなコンピュータ読み取り可能記憶媒体は、ランダムアクセスメモリ(Random Access Memory:RAM)、リードオンリメモリ(Read-Only Memory:ROM)、電気的消去可能型プログラマブルリードオンリメモリ(Electrically Erasable Programmable Read-Only Memory:EEPROM)、コンパクトディスクリードオンリメモリ(Compact Disc Read-Only Memory:CD−ROM)、又は他の光ディスクストレージ、磁気ディスクストレージ、又は他の磁気記憶装置、フラッシュメモリ装置(例えば、ソリッドステートメモリ装置)、又はコンピュータ実行可能指令又はデータ構造の形式の所望のプログラムコードを保持又は記憶するために使用でき、汎用コンピュータ又は特殊用途コンピュータによりアクセスできる任意の他の記憶媒体を含んでいる非持続的なコンピュータ読み取り可能記憶媒体を含むことができる。上記の組合せもまたコンピュータ読み取り可能記憶媒体の範囲内に含めることができる。コンピュータ実行可能指令は、例えば、プロセッサ410にある動作又は動作群を行わせるように構成されている指令及びデータを含むことができる。
通信ユニット416は、未知のバイナリプログラムを受信し、未知のバイナリプログラムをデータストレージ414に提供するように構成できる。データストレージ414により受信された後、未知のバイナリプログラムに対する入力及び入力シーケンスは、プロセッサ410及びデータストレージに記憶されている指令を使用して判定される。幾つかの実施形態では、判定された入力及び入力シーケンスは、通信ユニット416を使用して、システム400の外部に提供できる。
本開示の範囲から逸脱することなく、システム400に対して修正、追加、又は省略を行うことができる。例えば、データストレージ414は、複数の位置に位置させることができ、ネットワークを通して、プロセッサ410によりアクセスできる。
図5は、本開示で説明される少なくとも1つの実施形態に従って配置できる未知のバイナリプログラムに対する有効入力シーケンスを判定するための方法500のフローチャートの一例である。方法500は、幾つかの実施形態では、図4のシステム400のようなシステムにより実現できる。分離したブロックで例示されているが、所望されるインプレメンテーション(実現形態)に従って、種々のブロックを追加的ブロックに分割し、又はより少ないブロックに統合、又は消去できる。
方法500は、ブロック502で開始することができ、このブロックでは、未知のバイナリプログラムに対する入力シーケンスを得ることができる。入力シーケンスは、2つ以上の異なる入力を含むことができる。入力シーケンスに対する入力は、未知のバイナリプログラムに対する有効入力として判定されていてよい。幾つかの実施形態では、入力の1つ以上は、未知のバイナリプログラムに対して有効であると判定されたコマンドと、コマンドに関連する引数を含むことができる。幾つかの実施形態では、引数もまた、未知のバイナリプログラムに対して有効であると判定することもできる。
ブロック504では、未知のバイナリプログラムにおける1つ以上の変数のそれぞれに対するメモリアドレス範囲を得ることができる。幾つかの実施形態では、変数は、静的変数、グローバル変数、又は静的グローバル変数の何れかであってよい。幾つかの実施形態では、メモリアドレス範囲は、未知のバイナリプログラムのデータセクション、BSSセクション、又はデータセクション及びBSSセクションの両者内に位置することができる。
ブロック506では、未知のバイナリプログラムのインスツルメントされたバージョンを、入力シーケンスを、未知のバイナリプログラムのインスツルメントされたバージョンへの入力として実行することができる。
ブロック508では、未知のバイナリプログラムのインスツルメントされたバージョンの実行中にアクセスされた1つ以上のメモリアドレスを記録することができる。幾つかの実施形態では、メモリアドレスは、メモリアドレスが読み込まれる、又は書き込まれるかの何れかでアクセスできる。代替的に又は追加的に、メモリアドレスは、メモリアドレスが読み込まれるとき、及び書き込まれるときの両方でアクセスされる。
ブロック510では、未知のバイナリプログラムにおける変数の1つ以上のメモリアドレス範囲に対応する1つ以上の記録されたメモリアドレスの1つ以上に基づいて、未知のバイナリプログラムは、入力シーケンスを有効と認めると判定することができる。
当業者は、ここで開示されたこのプロセス及び方法、並びに他のプロセス及び方法に対して、プロセス及び方法で行われる機能は、異なる順序でも実現できるということを認識するであろう。更に、概略を説明したステップ及び動作は、例として提供されたものに過ぎず、ステップ又は動作の幾つかは任意であり、開示された実施形態の真髄を損なうことなく、より少ないステップ及び動作に統合、又は追加的ステップ及び動作へ拡張することができる。
例えば、方法500は、実行されたときに、未知のバイナリプログラムによりアクセスされたメモリアドレスを出力する未知のバイナリプログラムに、追加的コード指令を追加することにより、未知のバイナリプログラムをインスツルメントすることを更に含むことができる。
幾つかの実施形態では、入力シーケンスは第1入力シーケンスであって、メモリアドレスは第1メモリアドレスであってよい。これらの実施形態及び他の実施形態では、方法500は、未知のバイナリプログラムに対する第2入力シーケンスを得ることと、第1入力シーケンスと第2入力シーケンスを、未知のバイナリプログラムのインスツルメントされたバージョンへの入力として使用して、未知のバイナリプログラムのインスツルメントされたバージョンを実行することを更に含むことができる。これらの実施形態及び他の実施形態では、方法500は、第2入力シーケンスが、未知のバイナリプログラムのインスツルメントされたバージョンへ入力される間及びその後に、未知のバイナリプログラムのインスツルメントされたバージョンの実行中にアクセスされた1つ以上の第2メモリアドレスを記録することと、未知のバイナリプログラムにおける変数の1つ以上のメモリアドレス範囲に対応する1つ以上の記録された第2メモリアドレスの1つ以上に基づいて、未知のバイナリプログラムは、第2入力シーケンスを有効と認めると判定することを更に含むことができる。
幾つかの実施形態では、入力シーケンスは第1入力シーケンスであって、メモリアドレスは第1メモリアドレスであってよい。これらの実施形態及び他の実施形態では、方法500は、第1入力シーケンスを提供し、その後に文字シーケンスを入力として提供することにより、未知のバイナリプログラムを実行することを更に含むことができる。方法500はまた、未知のバイナリプログラムの指令カウントを記録することと、指令カウントに基づいて、文字シーケンスは有効入力であると判定することも含むことができる。方法500は、文字シーケンスを使用して、第2入力シーケンスを生成することを更に含むことができる。
これらの実施形態及び他の実施形態では、方法500は、第1入力シーケンスと第2入力シーケンスを、未知のバイナリプログラムのインスツルメントされたバージョンへの入力として、未知のバイナリプログラムのインスツルメントされたバージョンを実行することを更に含むことができる。これらの実施形態及び他の実施形態では、方法500は、第2入力シーケンスが入力される間及びその後に、未知のバイナリプログラムのインスツルメントされたバージョンの実行中にアクセスされた1つ以上の第2メモリアドレスを記録することと、未知のバイナリプログラムにおける変数の1つ以上のメモリアドレス範囲に対応する1つ以上の記録された第2メモリアドレスの1つ以上の1つ以上に基づいて、未知のバイナリプログラムは、第2入力シーケンスを有効と認めると判定することを更に含むことができる。
ここで説明される実施形態は、より詳細に下記で検討するように、種々のコンピュータハードウェア又はソフトウェアモジュールを含んでいる特殊用途又は汎用コンピュータの使用を含むことができる。
ここで説明される実施形態は、記憶されているコンピュータ実行可能指令又はデータ構造を保持又は有するためのコンピュータ読み取り可能媒体を使用して実現できる。そのようなコンピュータ読み取り可能媒体は、汎用コンピュータ又は特殊用途コンピュータによりアクセスできる任意の利用可能な媒体であってよい。例として、制限されることはないが、そのようなコンピュータ読み取り可能媒体は、ランダムアクセスメモリ(RAM)、リードオンリメモリ(ROM)、電気的消去可能型プログラマブルリードオンリメモリ(EEPROM)、コンパクトディスクリードオンリメモリ(CD−ROM)、又は他の光ディスクストレージ、磁気ディスクストレージ、又は他の磁気記憶装置、フラッシュメモリ装置(例えば、ソリッドステートメモリ装置)、又はコンピュータ実行可能指令又はデータ構造の形式の所望のプログラムコードを保持又は記憶するために使用でき、汎用コンピュータ又は特殊用途コンピュータによりアクセスできる任意の他の記憶媒体を含んでいる非持続的なコンピュータ読み取り可能記憶媒体を含むことができる。上記の組合せもまたコンピュータ読み取り可能媒体の範囲内に含めることができる。
コンピュータ実行可能指令は、例えば、汎用コンピュータ、特殊用途コンピュータ、又は特殊用途処理装置(例えば、1つ以上のプロセッサ)に、ある機能又は機能群を行わせることができる指令及びデータを備えている。主題を、構造的特徴及び/又は方法論的行動に関して特定の言語で説明してきたが、添付された請求項で定義される主題は、上述した特定の特徴又は行動に必ずしも制限されないということは理解されるべきである。上述した特定の特徴及び行動は、請求項を実現する形状の一例として開示されている。
ここで使用されているように、「モジュール」又は「構成要素」という用語は、モジュール又は構成要素の動作、及び/又はコンピューティングシステムの汎用ハードウェア(例えば、コンピュータ読み取り可能媒体、処理装置など)上に記憶され、及び/又はそれにより実行され得るソフトウェアオブジェクト又はソフトウェアルーチンを行うように構成されている特定のハードウェアインプレメンテーションのこと指すことができる。幾つかの実施形態では、ここで説明されている異なる構成要素、モジュール、エンジン、及びサービスは、コンピューティングシステム上で実行される(例えば、別個のスレッドのような)オブジェクト又はプロセスとして実現できる。
ここで説明されるシステム及び方法の幾つかは、全体的に、ソフトウェア(汎用ハードウェア上に記憶され、及び/又はそれにより実行される)で実現されるものとして説明されたが、特定のハードウェアインプレメンテーション又はソフトウェアと特定のハードウェアインプレメンテーションの組合せもまた可能であり、予想される。本説明では、「コンピューティングエンティティ」は、ここで以前に定義したような任意のコンピューティングシステムであってよく、又はコンピューティングシステム上で動作する任意のモジュール又はモジュールの組み合せであってよい。
ここで、及び特に添付された請求項(例えば、添付された請求項の本文)で使用される用語は、全体として「開いた」用語であることが意図されている(例えば、「〜を含んでいる」という用語は、「〜を含んでいるが、しかしそれに制限されない」と解釈されるべきであり、「〜を有している」という用語は、「少なくとも〜を有している」と解釈されるべきであり、「〜を含む」という用語は、「〜を含むが、しかしそれに制限されない」と解釈されるべきという具合である)。
追加的に、導入される請求項の詳説(recitation)の特定の数が意図された場合、そのような意図は、請求項で明示的に詳説され、そのような詳説がない場合は、そのような意図は存在しない。例えば、理解を支援するものとして、下記の添付された請求項は、導入のためのフレーズである「少なくとも1つ」及び「1つ以上」の使用を、請求項の詳説を導入するために含むことができる。しかし、その様なフレーズの使用は、たとえ同じ請求項が、導入のためのフレーズ「1つ以上」又は「少なくとも1つ」及び「a」(1つの)又は「an」(1つの)のような不定冠詞を含んでいる場合であっても、不定冠詞「a」(1つの)又は「an」(1つの)による請求項の詳説の導入は、そのような導入された請求項の詳説を含む如何なる特別な請求項を、そのような詳説を1つのみ含んでいる実施形態に制限するということを意味していると解釈されるべきではない(例えば、「a」(1つの)及び/又は「an」(1つの)は、「少なくとも1つ」又は「1つ以上」を意味すると解釈されるべきである)。同様のことが、請求項の詳説を導入するために使用される定冠詞についても当てはまる。
更に、導入された請求項の詳説の特定の数が明示的に詳説されていた場合でさえも、当業者は、そのような詳説は、少なくとも詳説された数を意味するものと解釈されるべきであることを認識するであろう(例えば、「2つの詳説」という他の修飾語がまったくない詳説は、少なくとも2つの詳説又は2つ以上の詳説を意味する)。更に、「A、B、C少なくとも1つなど」又は「A、B、C1つ以上など」に類似した用法が使用される例では、一般的に、そのような構文は、Aのみ、Bのみ、Cのみ、AとB共に、AとC共に、BとC共に、又はAとBとC共になどを含むように意図されている。例えば、「及び/又は」という用語の使用は、このように解釈されることが意図されている。
更に、詳細な説明、請求項、又は図面何れでも、2つ以上の代替の用語を提示している何れの分離接続詞的単語又はフレーズは、用語の1つ、用語の何れか、又は両者の用語を含んでいる可能性があると考えて理解されるべきである。例えば、「A又はB」というフレーズは、「A」又は「B」又は「AとB」の可能性を含んでいると理解されるべきである。
以上、実施形態を説明したが、ここに記載した全ての例や条件は、発明および技術に適用する発明の概念の理解を助ける目的で記載されたものであり、特に記載された例や条件は発明の範囲を制限することを意図するものではなく、明細書のそのような例の構成は発明の利点および欠点を示すものではない。発明の実施形態を詳細に記載したが、各種の変更、置き換え、変形が発明の精神および範囲を逸脱することなく行えることが理解されるべきである。