(57)【要約】      （修正有）【課題】バッファオーバーフローを低減する方法を提供する。【解決手段】方法４００は、バッファをオーバーフローさせる入力を用いてプログラムを作動させる４０２。バッファをオーバーフローさせる最小入力長さ及びバッファをオーバーフローさせない最大入力長さを決定する４０４。最大入力長さを含む第１入力及び最小入力長さを含む第２入力を用いてプログラムを作動させる４０６。第１及び第２入力を用いてプログラムの各関数についてｃａｌｌ／ｒｅｔｕｒｎ対を収集する４０８。ｃａｌｌ／ｒｅｔｕｒｎ対の間の差に基づき、バッファをオーバーフローさせる関数を決定する４１０。ｃａｌｌの数が閾値を超えるかどうかを判定する４１２。ｃａｌｌの数が閾値を超えることＹｅｓに応答して、バッファオーバーフローを防ぐよう構成されたパッチを呼び出し関数に挿入する４１４。【選択図】図４
2019215847.tif 000002
【特許請求の範囲】
【請求項１】
メモリと、
前記メモリへ動作上結合されるプロセッサと
を有し、
前記プロセッサは、
バッファをオーバーフローさせる特定の入力長さを含む入力を用いてプログラムを作動させることと、
前記バッファをオーバーフローさせる最小入力長さ、及び前記バッファをオーバーフローさせない最大入力長さを決定することと、
前記最大入力長さを含む第１入力、及び前記最小入力長さを含む第２入力を用いて、前記プログラムを作動させることと、
前記第１入力及び前記第２入力を用いて、前記プログラムの各関数についてｃａｌｌ／ｒｅｔｕｒｎ対を収集することと、
前記第１入力についてのｃａｌｌ／ｒｅｔｕｒｎ対と前記第２入力についてのｃａｌｌ／ｒｅｔｕｒｎ対との間の差に基づき、前記バッファをオーバーフローさせる特定の関数を決定することと、
前記特定の関数に対するｃａｌｌの数がｃａｌｌ閾値を超えるかどうかを判定することと、
前記特定の関数に対するｃａｌｌの数が前記ｃａｌｌ閾値を超えることに応答して、前記特定の関数が前記バッファをオーバーフローさせることを防ぐよう構成された境界を含むパッチを前記プログラムの呼び出し関数に挿入することと
を有する動作を実行するよう構成される、
システム。
【請求項２】
前記特定の関数に対するｃａｌｌの数が前記ｃａｌｌ閾値を超えないことに応答して、前記特定の関数に対するｃａｌｌの数がｃａｌｌ閾値を超えるかどうかを判定する前記動作は、前記パッチを前記プログラムの前記特定の関数に挿入することを有する、
請求項１に記載のシステム。
【請求項３】
前記第１入力についてのｃａｌｌ／ｒｅｔｕｒｎ対と前記第２入力についてのｃａｌｌ／ｒｅｔｕｒｎ対との間の差に基づき、前記バッファをオーバーフローさせる特定の関数を決定する前記動作は、
前記第１入力に対応する前記プログラムの関数呼び出しシーケンスを決定することと、
前記第２入力に対応する前記プログラムの関数呼び出しシーケンスを決定することと
を有し、
前記特定の関数は、前記第１入力に対応する関数呼び出しシーケンスと前記第２入力に対応する関数呼び出しシーケンスとの間の差に基づき決定される、
請求項１に記載のシステム。
【請求項４】
前記動作は、
前記第１入力に対応する第１スタックにおけるメモリの割り当てを解析することと、
前記第２入力に対応する第２スタックにおけるメモリの割り当てを解析することと、
前記第１スタックを前記第２スタックと比較することと、
前記第１スタックと前記第２スタックとの比較に基づき、破損した戻りアドレスを決定することと
を更に有する、
請求項１に記載のシステム。
【請求項５】
前記動作は、
前記バッファに対応するスタック位置を決定することと、
前記戻りアドレスに対応するスタック位置を決定することと、
前記パッチを生成することと
を更に有し、
前記特定の関数が前記バッファをオーバーフローさせることを防ぐよう構成された前記境界は、前記バッファに対応するスタック位置、及び前記戻りアドレスに対応するスタック位置に基づく、
請求項４に記載のシステム。
【請求項６】
前記動作は、
前記第１入力に基づき複数のファズ入力を生成することと、
前記複数のファズ入力を用いて前記プログラムを作動させることと、
前記複数のファズ入力を用いて前記プログラムの前記特定の関数に対するｃａｌｌの数を決定することと
を更に有する、
請求項１に記載のシステム。
【請求項７】
前記動作は、前記特定の関数又は前記呼び出し関数に対応する中間表現及びアセンブリ言語のうちの少なくとも１つで前記パッチを挿入することを更に有する、
請求項１に記載のシステム。
【請求項８】
バッファをオーバーフローさせる特定の入力長さを含む入力を用いてプログラムを作動させることと、
前記バッファをオーバーフローさせる最小入力長さ、及び前記バッファをオーバーフローさせない最大入力長さを決定することと、
前記最大入力長さを含む第１入力、及び前記最小入力長さを含む第２入力を用いて、前記プログラムを作動させることと、
前記第１入力及び前記第２入力を用いて、前記プログラムの各関数についてｃａｌｌ／ｒｅｔｕｒｎ対を収集することと、
前記第１入力についてのｃａｌｌ／ｒｅｔｕｒｎ対と前記第２入力についてのｃａｌｌ／ｒｅｔｕｒｎ対との間の差に基づき、前記バッファをオーバーフローさせる特定の関数を決定することと、
前記特定の関数に対するｃａｌｌの数がｃａｌｌ閾値を超えるかどうかを判定することと、
前記特定の関数に対するｃａｌｌの数が前記ｃａｌｌ閾値を超えることに応答して、前記特定の関数が前記バッファをオーバーフローさせることを防ぐよう構成された境界を含むパッチを前記プログラムの呼び出し関数に挿入することと
を有する方法。
【請求項９】
前記最大入力長さは、二分探索法により決定され、
前記最小入力長さは、前記最大入力長さに１測定単位を足したものに等しい、
請求項８に記載の方法。
【請求項１０】
前記第１入力についてのｃａｌｌ／ｒｅｔｕｒｎ対と前記第２入力についてのｃａｌｌ／ｒｅｔｕｒｎ対との間の差に基づき、前記バッファをオーバーフローさせる特定の関数を決定することは、
前記第１入力に対応する前記プログラムの関数呼び出しシーケンスを決定することと、
前記第２入力に対応する前記プログラムの関数呼び出しシーケンスを決定することと
を有し、
前記特定の関数は、前記第１入力に対応する関数呼び出しシーケンスと前記第２入力に対応する関数呼び出しシーケンスとの間の差に基づき決定される、
請求項９に記載の方法。
【請求項１１】
当該方法は、
前記第１入力に対応する第１スタックにおけるメモリの割り当てを解析することと、
前記第２入力に対応する第２スタックにおけるメモリの割り当てを解析することと、
前記第１スタックを前記第２スタックと比較することと、
前記第１スタックと前記第２スタックとの比較に基づき、破損した戻りアドレスを決定することと
を更に有する、
請求項８に記載の方法。
【請求項１２】
当該方法は、
前記バッファに対応するスタック位置を決定することと、
前記戻りアドレスに対応するスタック位置を決定することと、
前記パッチを生成することと
を更に有し、
前記特定の関数が前記バッファをオーバーフローさせることを防ぐよう構成された前記境界は、前記バッファに対応するスタック位置、及び前記戻りアドレスに対応するスタック位置に基づく、
請求項１１に記載の方法。
【請求項１３】
当該方法は、
前記第１入力に基づき複数のファズ入力を生成することと、
前記複数のファズ入力を用いて前記プログラムを作動させることと、
前記複数のファズ入力を用いて前記プログラムの前記特定の関数に対するｃａｌｌの数を決定することと
を更に有する、
請求項８に記載の方法。
【請求項１４】
パッチを前記特定の関数に挿入することは、前記特定の関数を中間表現に引き上げることを有し、
前記パッチは、前記特定の関数に対応する前記中間表現で挿入される、
請求項８に記載の方法。
【請求項１５】
バッファをオーバーフローさせる特定の入力長さを含む入力を用いてプログラムを作動させることと、
前記バッファをオーバーフローさせる最小入力長さ、及び前記バッファをオーバーフローさせない最大入力長さを決定することと、
前記最大入力長さを含む第１入力、及び前記最小入力長さを含む第２入力を用いて、前記プログラムを作動させることと、
前記第１入力及び前記第２入力を用いて、前記プログラムの各関数についてｃａｌｌ／ｒｅｔｕｒｎ対を収集することと、
前記第１入力についてのｃａｌｌ／ｒｅｔｕｒｎ対と前記第２入力についてのｃａｌｌ／ｒｅｔｕｒｎ対との間の差に基づき、前記バッファをオーバーフローさせる特定の関数を決定することと、
前記特定の関数に対するｃａｌｌの数がｃａｌｌ閾値を超えるかどうかを判定することと、
前記特定の関数に対するｃａｌｌの数が前記ｃａｌｌ閾値を超えることに応答して、前記特定の関数が前記バッファをオーバーフローさせることを防ぐよう構成された境界を含むパッチを前記プログラムの呼び出し関数に挿入することと、
前記特定の関数に対するｃａｌｌの数が前記ｃａｌｌ閾値を超えないことに応答して、前記パッチを前記プログラムの前記特定の関数に挿入することと
を有する動作を実行するようプロセッサによって実行可能なプログラミングコードが符号化されている非一時的なコンピュータ可読媒体。
【請求項１６】
前記第１入力についてのｃａｌｌ／ｒｅｔｕｒｎ対と前記第２入力についてのｃａｌｌ／ｒｅｔｕｒｎ対との間の差に基づき、前記バッファをオーバーフローさせる特定の関数を決定することは、
前記第１入力に対応する前記プログラムの関数呼び出しシーケンスを決定することと、
前記第２入力に対応する前記プログラムの関数呼び出しシーケンスを決定することと
を有し、
前記特定の関数は、前記第１入力に対応する関数呼び出しシーケンスと前記第２入力に対応する関数呼び出しシーケンスとの間の差に基づき決定される、
請求項１５に記載の非一時的なコンピュータ可読媒体。
【請求項１７】
前記動作は、
前記第１入力に対応する第１スタックにおけるメモリの割り当てを解析することと、
前記第２入力に対応する第２スタックにおけるメモリの割り当てを解析することと、
前記第１スタックを前記第２スタックと比較することと、
前記第１スタックと前記第２スタックとの比較に基づき、破損した戻りアドレスを決定することと
を更に有する、
請求項１５に記載の非一時的なコンピュータ可読媒体。
【請求項１８】
前記動作は、
前記バッファに対応するスタック位置を決定することと、
前記戻りアドレスに対応するスタック位置を決定することと、
前記パッチを生成することと
を更に有し、
前記特定の関数が前記バッファをオーバーフローさせることを防ぐよう構成された前記境界は、前記バッファに対応するスタック位置、及び前記戻りアドレスに対応するスタック位置に基づく、
請求項１７に記載の非一時的なコンピュータ可読媒体。
【請求項１９】
前記動作は、
前記第１入力に基づき複数のファズ入力を生成することと、
前記複数のファズ入力を用いて前記プログラムを作動させることと、
前記複数のファズ入力を用いて前記プログラムの前記特定の関数に対するｃａｌｌの数を決定することと
を更に有する、
請求項１５に記載の非一時的なコンピュータ可読媒体。
【請求項２０】
パッチを前記特定の関数に挿入することは、前記特定の関数を中間表現に引き上げることを有し、
前記パッチは、前記特定の関数に対応する前記中間表現で挿入される、
請求項１５に記載の非一時的なコンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示で説明される実施形態は、バッファオーバーフローの低減に関係がある。
【背景技術】
【０００２】
メモリスタックの戻りアドレス部分又は他の部分へのバッファを対象としたデータのオーバーフロー（例えば、バッファオーバーフロー）は、プログラム及び／又はプログラム関数を不適切に作動させる可能性がある。その上、バッファオーバーフローは、プログラム及び／又はプログラムと通信する電子機器の安全性を危うくさせる可能性がある安全上の欠陥を露わにすることがある。
【０００３】
本開示で請求される主題は、記載されている環境においてしか動作しない実施形態、又は記載されている如何なる欠点も解消する実施形態に制限されない。むしろ、この背景は、本開示で記載されるいくつかの実施形態が実施され得る技術分野の一例を説明するためにのみ提供されている。
【発明の概要】
【０００４】
実施形態の態様に従って、方法は、バッファをオーバーフローさせる特定の入力長さを含む入力を用いてプログラムを作動させることを含んでよい。方法は、前記バッファをオーバーフローさせる最小入力長さ、及び前記バッファをオーバーフローさせない最大入力長さを決定することを更に含んでよい。方法は、前記最大入力長さを含む第１入力、及び前記最小入力長さを含む第２入力を用いて、前記プログラムを作動させることを更に含んでよい。方法は、前記第１入力及び前記第２入力を用いて、前記プログラムの各関数についてｃａｌｌ／ｒｅｔｕｒｎ対を収集することを含んでよい。方法は、前記バッファをオーバーフローさせる特定の関数を決定することを更に含んでよい。該特定の関数は、前記第１入力についてのｃａｌｌ／ｒｅｔｕｒｎ対と前記第２入力についてのｃａｌｌ／ｒｅｔｕｒｎ対との間の差に基づき、決定されてよい。方法は、前記特定の関数に対するｃａｌｌの数がｃａｌｌ閾値を超えるかどうかを判定することを更に含んでよい。前記特定の関数に対するｃａｌｌの数が前記ｃａｌｌ閾値を超えることに応答して、方法は、パッチを前記プログラムの呼び出し関数に挿入することを含んでよい。該パッチは、前記特定の関数が前記バッファをオーバーフローさせることを防ぐよう構成された境界を含んでよい。
【０００５】
実施形態の目的及び利点は、少なくとも、特許請求の範囲で特に指し示されている要素、特徴、及び組み合わせによって、実現及び達成されるだろう。
【０００６】
前述の概要及び以下の詳細な説明は、実例及び説明であって、請求されている発明を制限するものではない点が理解されるべきである。
【図面の簡単な説明】
【０００７】
例となる実施形態は、添付の図面の使用を通じて、更なる特定及び詳細をもって記載及び説明されることになる。
【０００８】
【図１】プログラムを作動させることと、スタックにおけるバッファのオーバーフローが起きたかどうかを判定することと、バッファオーバーフローを低減及び／又は阻止するようプログラムにパッチを当てることとに関連した環境の例を表す。
【図２】プログラムを作動させ、スタックにおけるバッファのオーバーフローが起きたかどうかを判定し、プログラムにパッチを当ててバッファオーバーフローを低減及び／又は阻止するよう構成され得るコンピューティングシステムの例を表す。
【図３】バッファオーバーフローを自動的に検出し、バッファオーバーフローを引き起こす関数にパッチを当てることに関連した方法の例のフロー図を表す。
【図４】バッファオーバーフローを自動的に検出し、バッファオーバーフローを引き起こす関数にパッチを当てることに関連した方法の他の例のフロー図を表す。
【図５】プログラムの制御フローグラフを表す。
【０００９】
全ては、本開示で記載される少なくとも１つの実施形態に従って配置される。
【発明を実施するための形態】
【００１０】
ある場合には、バッファオーバーフロー（例えば、スタックバッファオーバーラン）を自動的に検出し、バッファオーバーフローを引き起こす関数（例えば、サブルーチン）にパッチを当てることは、プログラムの機能性を高め、且つ／あるいは、関数及び／又はプログラムに関連した安全上の結果を取り除くことができる。いくつかの実施形態に従って、関数を自動的に検出しパッチを当てることは、オーバーフロー検出モジュール（ＯＤＭ；Overflow  Detection  Module）及びパッチモジュールを含むコンピューティング装置によって実行されてよい。
【００１１】
いくつかの実施形態において、コンピューティング装置は、入力データを受け、該入力データを用いてプログラムを作動させてよい。入力データは、プログラムの特定の関数にバッファをオーバーフローさせる入力長さを含むことがある。バッファオーバーフローは、スタックに格納されているデータに、スタック内でバッファに割り当てられているメモリ空間を超えさせる入力長さを含む場合に、起こる可能性がある。バッファのオーバーフローは、スタック内の戻りアドレス部分に上書きする可能性があり、このことは、呼び出し関数への復帰及び／又は他の関数の呼び出しを変造することがある。呼び出し関数への復帰及び／又は他の関数の呼び出しを変造することは、プログラムが特定の関数にアクセスし、スタック内の変造された戻りアドレスを用いて呼び出し関数へ復帰しようと試みる場合に、プログラムを不適切に作動（例えば、クラッシュ）させる可能性がある。
【００１２】
いくつかの実施形態に従って、ＯＤＭは、プログラム及び／又は特定の関数に対応するマシンコード（例えば、バイナリコード）及び／又はアセンブリ言語においてバッファオーバーフローを検出してよい。ＯＤＭは、バッファオーバーフローを引き起こさない最大入力長さ、及びバッファオーバーフローを引き起こす最小入力長さを決定してよい。ＯＤＭは、最大入力長さを含む第１入力、及び最小入力長さを含む第２入力を用いて、プログラムを作動させてよい。第１入力及び第２入力の両方に対応するｃａｌｌ／ｒｅｔｕｒｎ対が収集され、メモリに記憶されてよい。ｃａｌｌ／ｒｅｔｕｒｎ対は、関数に対応するアセンブリ言語において収集及び記憶されてよい。ＯＤＭは、第１入力及び第２入力に対応する特定の関数までの関数呼び出しシーケンスを決定してよい。関数呼び出しシーケンスは、第１入力についてのｃａｌｌ／ｒｅｔｕｒｎ対を第２入力と比較することによって決定されてよい。その上、ＯＤＭは、バッファオーバーフローを引き起こす特定の関数までの関数呼び出しシーケンスを決定してよい。
【００１３】
いくつかの実施形態において、ＯＤＭは、第１入力に対応する第１スタックにおけるメモリの割り当てを解析してよい。ＯＤＭはまた、第２入力に対応する第２スタックにおけるメモリの割り当てを解析してよい。ＯＤＭは、アセンブリ言語において第１スタック及び／又は第２スタックにおけるメモリの割り当てを解析してよい。第１スタックは、第２スタックと比較されてよく、変造される戻りアドレス部分は、第１スタックと第２スタックとの間の差に基づき決定されてよい。その上、ＯＤＭは、戻りアドレス部分及びバッファに対応するスタック位置を決定してよい。
【００１４】
いくつかの実施形態に従って、パッチモジュールは、複数のファズ入力を生成してよい。ファズ入力は、第１入力、又はプログラムに特定の関数を呼び出させる何らかの他の入力に基づき、生成されてよい。その上、パッチモジュールは、ファズ入力を用いてプログラムを作動させてよい。ファズ入力を用いてプログラムにおいて作動する特定の関数に対するｃａｌｌの数が収集され、メモリに記憶されてよい。特定の関数に対するｃａｌｌの数は、ｃａｌｌ閾値と比較されてよい。特定の関数に対するｃａｌｌの数がｃａｌｌ閾値を超える場合には、パッチモジュールは、特定の関数がバッファをオーバーフローさせるのを防ぐよう構成された境界を含むパッチを、特定の関数を呼び出した呼び出し関数に挿入してよい。特定の関数に対するｃａｌｌの数がｃａｌｌ閾値を超えない場合には、パッチモジュールは、パッチを特定の関数に挿入してよい。
【００１５】
いくつかの実施形態において、パッチモジュールは、呼び出し関数又は特定の関数に対応するアセンブリ言語でパッチを挿入してよい（例えば、ホットパッチング）。他の実施形態においては、パッチモジュールは、アセンブリ言語を中間表現へ引き上げてよく、パッチモジュールは、呼び出し関数又は特定の関数に対応する中間表現でパッチを挿入してよい。
【００１６】
バッファオーバーフローを引き起こす関数を自動的に検出しパッチを当てることは、プログラム及び／又は電子機器の安全上のリスクを低減及び／又は防止することによって、コンピューティング装置の機能性を改善し得る。その上、バッファオーバーフローを引き起こす関数を自動的に検出しパッチを当てることは、バッファオーバーフローを発見することからバッファオーバーフローを解消することまでの時間を削減することによって、コンピューティング装置の機能性を改善し得る。
【００１７】
本開示の実施形態は、添付の図面を参照して説明される。
【００１８】
図１は、本開示で開示される少なくとも実施形態に従って配置される環境の例であって、プログラム１０４を作動させることと、スタック１０７におけるバッファのオーバーフローが起きたかどうかを判定することと、（例えば、プログラム１０４のその後の動作中に）バッファオーバーフローを低減及び／又は阻止するようプログラム１０４にパッチを当てることとに関連した環境１００を表す。
【００１９】
環境１００は、コンピューティング装置１０３を含んでよい。コンピューティング装置１０３は、プログラム１０４、オーバーフロー判定モジュール１０６（ここでは‘ＯＤＭ１０６’）、メモリ１０５、及びパッチモジュール１０８を含んでよい。メモリ１０５は、バッファを含むメモリスタック１０７を記憶してよい。図１では単一のスタック１０７を含むものとして表されているが、メモリ１０５は、本開示で記載される動作をいくつでも個々に又は集合的に実行するか又はその実行を指示するよう構成されたスタックをいくつでも含んでよい。
【００２０】
コンピューティング装置１０３は、プロセッサ（図１では図示せず。）、メモリ１０５、及び通信機能を含むコンピュータベースのハードウェア装置を含んでよい。コンピューティング装置１０３の幾つかの例として、携帯電話機、スマートフォン、タブレットコンピュータ、ラップトップコンピュータ、デスクトップコンピュータ、セットトップボックス、仮想現実装置、又はコネクテッドデバイス、などが挙げられ得る。コンピューティング装置１０３は、プロセッサベースのコンピューティング装置を含んでよい。例えば、コンピューティング装置１０３は、ハードウェアサーバ、又はサーバとして機能するよう構成された他のプロセッサベースのコンピューティング装置を含んでよい。コンピューティング装置１０３は、メモリ及びネットワーク通信機能を含んでよい。
【００２１】
コンピューティング装置１０３は、入力データ１０２を受けるよう構成されてよい。コンピューティング装置１０３は、入力データ１０２が、プログラム１０４の１つ以上の関数に、バッファをオーバーフローさせ、スタック１０７の戻りアドレス部分に上書きさせたかどうかを判定するよう更に構成されてよい。１つ以上の関数がバッファをオーバーフローさせた場合には、コンピューティング装置１０３はパッチを生成し、そのパッチを、１つ以上の関数又はプログラム１０４の呼び出し関数のいずれかに対応するアセンブリ言語及び／又は中間表現で挿入してよい。
【００２２】
メモリ１０５は、如何なるメモリ又はデータストレージも含んでよい。いくつかの実施形態において、メモリ１０５は、コンピュータ実行可能命令又はデータ構造を搬送するか又は記憶しているコンピュータ可読記憶媒体を含んでよい。コンピュータ可読記憶媒体は、プロセッサのような汎用又は特別目的のコンピュータによってアクセスされ得る如何なる利用可能な媒体も含んでよい。例えば、メモリ１０５は、ランダムアクセスメモリ（ＲＡＭ）、リードオンリーメモリ（ＲＯＭ）、電気的消去可能なプログラム可能リードオンリーメモリ（ＥＥＰＲＯＭ）、コンパクトディスク型リードオンリーメモリ（ＣＤ−ＲＯＭ）若しくは他の光学ディスクストレージ、磁気ディスクストレージ若しくは他の磁気記憶デバイス、フラッシュメモリデバイス（例えば、固体状態メモリデバイス）、あるいは、コンピュータ実行可能命令又はデータ構造の形で所望のプログラムコードを携行又は記憶するために使用され得且つ汎用又は特別目的のコンピュータによってアクセスされ得る如何なる他の記憶媒体も含む有形な又は非一時的なコンピュータ可読記憶媒体であってよいコンピュータ可読記憶媒体を含んでよい。先に挙げられたものの組み合わせも、コンピュータ可読記憶媒体の適用範囲内に含まれてよい。コンピュータ実行可能命令は、例えば、プロセッサに特定の演算又は演算群を実行させるよう構成された命令及びデータを含んでよい。
【００２３】
プログラム１０４は、１つ以上の特定のタスクを実行するためのコード及びルーチンを含んでよい。ＯＤＭ１０６は、本開示で開示されるＯＤＭ１０６の様々な機能を実行するよう構成されたコード及びルーチンを含んでよい。その上、又は代替的に、ＯＤＭ１０６は、プログラム、マイクロプロセッサ（例えば、１つ以上の演算を実行するか又はその実行を制御するもの）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、又は特定用途向け集積回路（ＡＳＩＣ）を含むハードウェアを用いて実装されてよい。いくつかの他の場合においては、ＯＤＭ１０６は、ハードウェアとソフトウェアとの組み合わせを用いて実装されてよい。
【００２４】
パッチモジュール１０８は、本開示で開示される様々な機能を実行するよう構成されたコード及びルーチンを含んでよい。その上、又は代替的に、パッチモジュール１０８は、プロセッサ、マイクロプロセッサ（例えば、１つ以上の演算を実行するか又はその実行を制御するもの）、ＦＰＧＡ、又はＡＳＩＣを含むハードウェアを用いて実装されてよい。いくつかの他の場合においては、パッチモジュール１０８は、ハードウェアとソフトウェアとの組み合わせを用いて実装されてよい。
【００２５】
本開示において、ＯＤＭ１０６及び／又はパッチモジュール１０８によって実行されるものとして記載される動作は、ＯＤＭ１０６及び／又はパッチモジュール１０８が対応する装置又はシステムに実行するよう指示し得る動作を含んでよい。
【００２６】
プログラム１０４は、入力データ１０２を用いて１つ以上の特定のタスクを作動させ実行するよう構成されてよい。入力データ１０２は入力長さを含んでよい。入力長さは、ディジットの数、ディジットのタイプ、ディジットに関連する値、ビットの数、バイトの数、何らかの他の適切な測定単位によって測定されてよい。
【００２７】
プログラム１０４は、動作中に、スタック１０７を含むメモリ１０５に対して読み出し及び書き込みを行ってよい。メモリ１０５は、図１では単一のスタック１０７を含むものとして表されているが、メモリ１０５は、１つよりも多いスタック１０７を含んでよいことが理解される。プログラム１０４の動作中に使用及び／又は生成される一時データ及び／又は動的に割り当てられたデータは、バッファから読み出されるか、又はバッファに書き込まれてよい。
【００２８】
バッファオーバーフローが起こる可能性があるプログラムの例（ここでは‘ｓｔｒｃｐｙプログラム’）は、次を含んでよい：
【数１】
2019215847.tif 000003
バッファオーバーフローは、プログラムのｓｔｒｃｐｙ関数で起こる可能性がある。
【００２９】
例えば、アセンブリ言語におけるｓｔｒｃｐｙプログラムの一部は、次を含んでよい：
【数２】
2019215847.tif 000004
2019215847.tif 000005
アセンブリ言語において、０ｘ８０４８３４０を呼び出すことは、プログラムのｓｔｒｃｐｙプログラムを呼び出すことに対応し得る。
【００３０】
ＯＤＭ１０６は、バッファオーバーフローが起きたかどうかを判定するようバッファ及び／又はプログラム１０４をモニタしてよい。ＯＤＭ１０６は、米国特許第９５５２２８４号、米国特許第９７７２９３１号、米国特許出願第１４／７９２５０７号、及び／又は米国特許出願第１５／１９８０６４号で記載されているように、オーバーフローを検出してよい。これらの特許文献の夫々は、その全文を本開示で援用される。
【００３１】
バッファオーバーフローが起きる場合に、ＯＤＭ１０６は、プログラム１０４にバッファをオーバーフローさせない最大入力長さを決定してよい。いくつかの実施形態において、最大入力長さは、プログラム１０４にバッファをオーバーフローさせない最大入力長さが決定されるまで入力データ１０２の入力長さを漸進的に減少及び／又は増加させることによって、決定（例えば、二分探索法を用いて決定）されてよい。例えば、バッファオーバーフローを引き起こす入力データ１０２の入力長さは、８バイトに等しくてよい。入力長さは、第２の入力長さが４バイトに等しくなるように、第１の半分だけ減らされてよい。第２の入力長さもバッファオーバーフローを引き起こす場合には、第２の入力長さは、第３の入力長さが２バイトに等しくなるように、第２の半分だけ減らされてよい。第３の入力長さがバッファオーバーフローを引き起こさない場合には、第３の入力長さは、第４の入力長さが３バイトに等しくなるように、第３の半分（例えば、第２の半分のサイズの２分の１）だけ増やされてよい。第４の入力長さがバッファオーバーフローを引き起こす場合には、最大入力長さは第３の入力長さ（例えば、２バイト）に等しくなり得る。
【００３２】
ＯＤＭ１０６はまた、プログラム１０４にバッファをオーバーフローさせる最小入力長さも決定してよい。いくつかの実施形態において、最小入力長さは、最大入力長さに１測定単位を足したものに等しくてよい。例えば、測定単位がバイトの数であり、最大入力長さが２バイトに等しい場合には、最小入力長さは３バイトに等しく設定され得る。
【００３３】
ＯＤＭ１０６は、最大入力長さを含む第１入力を用いてプログラム１０４を作動させてよい。第１入力を用いてプログラム１０４の動作中に生成されるｃａｌｌ／ｒｅｔｕｒｎ対の第１の組は、収集されメモリ１０５に記憶されてよい。ＯＤＭ１０６はまた、最小入力長さを含む第２入力を用いてプログラム１０４を作動させてよい。第２入力を用いてプログラム１０４の動作中に生成されるｃａｌｌ／ｒｅｔｕｒｎ対の第２の組は、収集されメモリ１０５に記憶されてよい。ｃａｌｌ／ｒｅｔｕｒｎ対の第１の組及び第２の組はアセンブリ言語で収集及び／又は記憶されてよい。
【００３４】
ｓｔｒｃｐｙプログラムにおいて例となる第１入力及び例となる第２入力を用いて生成されるｃａｌｌ／ｒｅｔｕｒｎ対の例が、表Ｉに与えられている：
【表１】
2019215847.tif 000006
【００３５】
ＯＤＭ１０６は、バッファオーバーフローを引き起こす特定の関数を決定してよい。いくつかの実施形態において、ＯＤＭ１０６は、ｃａｌｌ／ｒｅｔｕｒｎ対の第１の組とｃａｌｌ／ｒｅｔｕｒｎ対の第２の組との間の差に基づき、特定の関数を決定してよい。例えば、表Ｉに示されるように、０ｘ８０４８３４０を呼び出すことは、ｓｔｒｃｐｙ関数を呼び出すことに対応し得る。ｒｅｔｎ０ｘ９００００４０の値は、第１入力を使用するｍａｉｎ（）関数からの戻り値に対応し得る。ｒｅｔｎ０ｘ４１４１４１４１の値は、第２入力を使用する場合に上書きされたｍａｉｎ（）関数からの戻り値に対応し得る。ｒｅｔｎ値は異なるので、ｓｔｒｃｐｙ関数が特定の関数であると決定される。他の例として、ｃａｌｌ／ｒｅｔｕｒｎ対の第１の組及び第２の組の両方が８つのｃａｌｌ／ｒｅｔｕｒｎ対を含んでよく、夫々のｃａｌｌ／ｒｅｔｕｒｎ対は、３番目のｃａｌｌ／ｒｅｔｕｒｎ対が異なり得ることを除いて、同じ又は同様であってよい。特定の関数は、３番目のｃａｌｌ／ｒｅｔｕｒｎ対に関連した関数に対応し得る。
【００３６】
その上、ＯＤＭ１０６は、第１入力及び第２入力の両方を用いて特定の関数を呼び出すに至るまでのプログラム１０４の関数呼び出しシーケンスを決定してよい。いくつかの実施形態において、ＯＤＭ１０６は、第１入力の関数呼び出しシーケンスと第２入力の関数呼び出しシーケンスとの間の差に基づき、特定の関数を決定してよい。例えば、ｃａｌｌ／ｒｅｔｕｒｎ対の第１の組及び第２の組の両方に含まれる最初の２つのｃａｌｌ／ｒｅｔｕｒｎ対は同じ又は同様であってよく、７番目の関数及び９番目の関数に夫々関連してよい。ＯＤＭ１０６は、２番目のｃａｌｌ／ｒｅｔｕｒｎ対が、２つのスタックの間で同じ又は同様である最後のｃａｌｌ／ｒｅｔｕｒｎ対であり、特定の関数を呼び出すに至るまでの関数呼び出しシーケンスが７番目の関数及び９番目の関数を含み得ると決定してよい。
【００３７】
その上、第１入力を用いてプログラム１０４を作動させることに対応する第１スタック、及び第２入力を用いてプログラム１０４を作動させることに対応する第２スタックが、収集され及び／又はメモリ１０５に記憶されてよい。例となる第１入力及び／又は第２入力を用いてｓｔｒｃｐｙプログラムにおいて生成されるスタックの例が、表ＩＩに与えられている：
【表２】
2019215847.tif 000007
【００３８】
更に、ＯＤＭ１０６は、第１スタックにおけるメモリの割り当て及び第２スタックにおけるメモリの割り当てを解析してよい。いくつかの実施形態において、ＯＤＭ１０６は、アセンブリ言語で第１スタック及び／又は第２スタックにおけるメモリの割り当てを解析してよい。ＯＤＭ１０６は、第１スタックにおけるメモリの割り当てを第２スタックにおけるメモリの割り当てと比較してよい。戻りアドレス位置に対応するスタック位置、及びバッファに対応するスタック位置は、２つのスタックの間の差に基づき決定されてよい。ＯＤＭ１０６は、第１スタック及び第２スタックにおける戻りアドレス部分に対応する様々なスタック位置を比較することによって、どの戻りアドレス部分がプログラム１０４の動作中に変造されたかを決定してよい。
【００３９】
パッチモジュール１０８は、第１入力に基づき複数のファズ入力を生成してよい。ファズ入力は、ランダムに選ばれた入力及び／又は入力長さを含んでよい。プログラム１０４は、ファズ入力の夫々を用いて作動されてよい。プログラム１０４がファズ入力を用いて作動されるたびに、パッチモジュール１０８は、特定の関数が呼び出されたかどうかを判定してよい。プログラム１０４が作動されるたびに、特定の関数が呼び出された場合には、パッチモジュール１０８は、特定の関数に対するｃａｌｌの数をインクリメントしてよい。代替的に、特定の関数が呼び出されなかった場合には、プログラム１０４は、別のファズ入力を用いて作動されてよい。このプロセスは、夫々のファズ入力について繰り返されてよい。
【００４０】
いくつかの実施形態において、ファズ入力の数は、特定の関数を呼び出すファズ入力の最小数、及び／又はファズ入力を用いてプログラム１０４を作動させる最大回数（例えば、ファズ入力の総数）に基づき、決定されてよい。例えば、特定の関数を呼び出すファズ入力の最小数は、１０以上のファズ入力であってよい。他の例として、ファズ入力を用いてプログラム１０４を作動させる合計回数は、７５０以上であってよい。より具体的には、ファズ入力を用いてプログラム１０４を作動させる合計回数は、１０００に等しくてよい。その上、又は代替的に、ファズ入力の数は、ファズ入力を用いてプログラム１０４を作動させる間に経過する時間に基づき、決定されてよい。例えば、ファズ入力の数は、プログラムがファズ入力を用いて１時間に作動され得る回数に等しくてよい。いくつかの実施形態において、ファズ入力の数は、プログラムが１時間未満に又は１時間より長く作動され得る回数に等しくてよい。
【００４１】
パッチモジュール１０８は、特定の関数に対するｃａｌｌの数がｃａｌｌ閾値を超えるかどうかを判定してよい。いくつかの実施形態において、ユーザは、パッチモジュール１０８のセットアップ／インストールの間にｃａｌｌ閾値を供給してよい。他の実施形態においては、ｃａｌｌ閾値は、ファズ入力の総数の５パーセント以上であってよい。代替的に、ｃａｌｌ閾値は、ファズ入力の総数の５パーセント未満であってよい。例えば、ファズ入力の総数が１００に等しい場合に、ｃａｌｌ閾値は５に等しくなり得る。特定の関数に対するｃａｌｌの数がｃａｌｌ閾値を超える場合には、パッチモジュール１０８は、パッチがプログラム１０４の呼び出し関数に挿入されるべきであると決定してよい。ｃａｌｌの数がｃａｌｌ閾値を超えない場合には、パッチモジュール１０８は、パッチが特定の関数に挿入されるべきであると決定してよい。
【００４２】
パッチを呼び出し関数に挿入することは、特定の関数がバッファをオーバーフローさせることなくプログラム１０４の他の関数によって呼び出され得る場合に、特定の関数が置換されないようにし得る。パッチを特定の関数に挿入することは、別の関数が特定の関数を呼び出すことに起因して特定の関数がバッファをオーバーフローさせることを防ぎ得る。
【００４３】
パッチモジュール１０８は、パッチが特定の関数又は呼び出し関数に挿入されるべきかどうかに基づき、パッチを生成してよい。パッチに含まれる境界は、第１スタック及び第２スタックの戻りアドレス部分及びバッファに対応するスタック位置に基づいてよい。いくつかの実施形態において、第１入力及び第２入力についてのスタック内の様々な部分のスタック位置間の差は、パッチに含まれる境界を決定するために使用されてよい。例えば、パッチモジュール１０８は、ｓｔｒｃｐｙプログラムにおいて、ｓｔｒｃｐｙ（）関数を置換するよう境界チェックを含むｓｔｒｃｐｙ＿１（）関数を生成してよい。
【００４４】
いくつかの実施形態において、パッチモジュール１０８は、第１スタック及び／又は第２スタックへの夫々の書き込み並びに夫々の書き込みのための対応するスタック位置をモニタすることによって、戻りアドレス部分及びバッファに対応するスタック位置を決定する。対応する位置に対して第１スタックにおいて書き込まれる値の数は、対応する位置に対して第２スタックにおいて書き込まれる値の数と比較されてよい。第１スタックと第２スタックとの間で異なるように書き込まれるスタック位置は、どこでオーバーフローが起きたかを示し得る。そのような実施形態においては、境界は、第１スタック及び第２スタックにおいて同じ情報を書き込まれる最後のスタック位置に基づいてよい。
【００４５】
パッチが呼び出し関数に挿入される場合に、関数は、特定の関数がバッファをオーバーフローさせることを防ぐよう境界を含む新しい関数として書き換えられてよい。例えば、新しい関数は、メモリ１０５の未使用部分に記憶されてよい。いくつかの実施形態において、呼び出し関数における新しいｃａｌｌは、特定の関数に対するｃａｌｌに取って代わる。例えば、特定の関数（例えば、＜ｏｌｄ＿ｆｕｎｃｔｉｏｎ＿ａｄｄｒｅｓｓ＞）のための命令ｃａｌｌは、新しい関数（例えば、＜ｎｅｗ＿ｆｕｎｃｔｉｏｎ＿ａｄｄｒｅｓｓ＞）のための新しい命令ｃａｌｌと置き換えられてよい。ｓｔｒｃｐｙプログラムにおいては、パッチモジュール１０８は、ｂａｒ（）がｓｔｒｃｐｙ＿１（）を呼び出し、ｓｔｒｃｐｙ（）を呼び出さないように、ｂａｒ（）にパッチ（例えば、ｓｔｒｃｐｙ＿１（）関数）を挿入してよい。
【００４６】
パッチが特定の関数に挿入される場合には、ジャンプ命令（例えば、ｊｍｐ）が、特定の関数の最初に挿入されてよい。ジャンプ命令は、プログラムに、特定の関数が呼び出される場合に、メモリ１０５内の新しい位置にある新しいコードにアクセスするよう指示してよい。
【００４７】
いくつかの実施形態において、パッチは、呼び出し関数又は特定の関数を表すアセンブリ言語で生成され挿入されてよい。他の実施形態においては、パッチは、呼び出し関数又は特定の関数を表す中間表現で生成されてよい。例えば、特定の関数を表すアセンブリ言語は、中間表現へ引き上げられてよい。パッチを含むアセンブリ言語及び／又は中間表現は、コンピューティング装置１０３が動作するためのマシンコードに変換されてよい。いくつかの実施形態において、アセンブリ言語でパッチを生成し挿入することは、中間表現でパッチを生成し挿入することよりも大きいプロセッシングペナルティ（例えば、コンピュータスループットの低減及び／又はレイテンシの増大）を引き起こす可能性がある。
【００４８】
図２は、プログラムを作動させ、スタックにおけるバッファのオーバーフローが起きたかどうかを判定し、プログラムにパッチを当てて（例えば、プログラムのその後の動作中に）バッファオーバーフローを低減及び／又は阻止するよう構成され得るコンピューティングシステム２１０を例示する。コンピューティングシステム２１０は、ＯＤＭ（例えば、図１のＯＤＭ１０６）、パッチモジュール（例えば、図１のパッチモジュール１０８）、及び／又はプログラム（例えば、図１のプログラム１０４）に関連した１つ以上の動作を実装又は指示するよう構成されてよい。コンピューティングシステム２１０は、プロセッサ２１２、メモリ２１４、及びデータストレージ２１６を含んでよい。プロセッサ２１２、メモリ２１４、及びデータストレージ２１６は、例えば、通信バスを介して、通信上結合されてよい。
【００４９】
一般に、プロセッサ２１２は、様々なコンピュータハードウェア又はソフトウェアモジュールを含む如何なる適切な特別目的又は汎用のコンピュータ、コンピューティングエンティティ、又はプロセッシングデバイスも含んでよく、如何なる適用可能なコンピュータ可読記憶媒体にも記憶された命令を実行するよう構成されてよい。例えば、プロセッサ２１２は、マイクロプロセッサ、マイクロコントローラ、デジタル信号プロセッサ（ＤＳＰ）、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、あるいは、プログラム命令を解釈及び／若しくは実行するよう並びに／又はデータを処理するよう構成された如何なる他のデジタル又はアナログ回路も含んでよい。図２では単一のプロセッサとして表されているが、プロセッサ２１２は、本開示で記載されている動作をいくつでも個々に又は集合的に実行するか又はその実行を指示するよう構成されたプロセッサをいくつでも含んでよい。その上、プロセッサの１つ以上は、異なるサーバのような、１つ以上の異なる電子機器において存在してよい。
【００５０】
いくつかの実施形態において、プロセッサ２１２は、メモリ２１４、データストレージ２１６、又はメモリ２１４及びデータストレージ２１６に記憶されているプログラム命令を解釈及び／若しくは実行し、並びに／又は記憶されているデータを処理するよう構成されてよい。いくつかの実施形態において、プロセッサ２１２は、データストレージ２１６からプログラム命令をフェッチし、プログラム命令をメモリ２１４にロードしてよい。プログラム命令がメモリ２１４にロードされた後、プロセッサ２１２はプログラム命令を実行してよい。
【００５１】
例えば、いくつかの実施形態において、ＯＤＭ、パッチモジュール、及び／又はプログラムは、プログラム命令としてデータストレージ２１６に含まれてよい。プロセッサ２１２は、ＯＤＭ、パッチモジュール、及び／又はプログラムのプログラム命令をデータストレージ２１６からフェッチしてよく、そして、ＯＤＭ、パッチモジュール、及び／又はプログラムのプログラム命令をメモリ２１４にロードしてよい。ＯＤＭ、パッチモジュール、及び／又はプログラムのプログラム命令がメモリ２１４にロードされた後、プロセッサ２１２は、コンピューティングシステムが、命令によって指示されるように、ＯＤＭ、パッチモジュール、及び／又はプログラムに関連した動作を実装し得るように、プログラム命令を実行してよい。
【００５２】
メモリ２１４及びデータストレージ２１６は、コンピュータ実行可能命令又はデータ構造を運ぶか又は記憶しているコンピュータ可読記憶媒体を含んでよい。そのようなコンピュータ可読記憶媒体は、プロセッサ２１２のような汎用又は特別目的のコンピュータによってアクセスされ得る如何なる利用可能な媒体も含んでよい。例として、そのようなコンピュータ可読記憶媒体は、ランダムアクセスメモリ（ＲＡＭ）、リードオンリーメモリ（ＲＯＭ）、電気的消去可能なプログラム可能リードオンリーメモリ（ＥＥＰＲＯＭ）、コンパクトディスク型リードオンリーメモリ（ＣＤ−ＲＯＭ）若しくは他の光学ディスクストレージ、磁気ディスクストレージ若しくは他の磁気記憶デバイス、フラッシュメモリデバイス（例えば、固体状態メモリデバイス）、あるいは、コンピュータ実行可能命令又はデータ構造の形で所望のプログラムコードを携行又は記憶するために使用され得且つ汎用又は特別目的のコンピュータによってアクセスされ得る如何なる他の記憶媒体も含む有形な又は非一時的なコンピュータ可読記憶媒体を含んでよい。先に挙げられたものの組み合わせも、コンピュータ可読記憶媒体の適用範囲内に含まれてよい。コンピュータ実行可能命令は、例えば、プロセッサ２１２に特定の演算又は演算群を実行させるよう構成された命令及びデータを含んでよい。
【００５３】
変更、追加、又は削除は、本開示の適用範囲から逸脱することなしに、コンピューティングシステム２１０に対して行われてよい。例えば、いくつかの実施形態において、コンピューティングシステム２１０は、明示的に図示又は記載され得ない他の構成要素をいくつでも含んでよい。
【００５４】
図３及び図４は、例となる方法のフロー図である。方法は、ハードウェア（回路、専用ロジック、など）、ソフトウェア（例えば、汎用コンピュータシステム又は専用マシンで実行されるもの）、又はそれらの組み合わせを含み得るプロセッシングロジックによって実行されてよい。プロセッシングロジックは、図１のコンピューティング装置１０３、ＯＤＭ１０６、及び／又はパッチモジュール１０８、あるいは他のコンピュータシステム又は装置に含まれてよい。しかし、他のシステム、又はシステムの組み合わせが、方法を実行するために使用されてもよい。説明の簡単のために、本開示で記載される方法は、一連の動作として表され記載される。しかし、本開示に従う動作は、様々な順序で及び／又は同時に、且つ、本開示で提示及び記載されていない他の動作を伴って、行われてよい。更には、表されている全ての動作が、開示される主題に従う方法を実装するために使用されなくてもよい。その上、当業者に明らかなように、方法は、代替的に、状態図により相互に関連した状態の連続として、又はイベントとして表されてよい。その上、本明細書で開示される方法は、コンピューティング装置へのそのような方法の輸送及び転送を容易にするよう、非一時的なコンピュータ可読媒体のような製品に記憶可能である。本開示で使用される語「製品」は、如何なるコンピュータ可読装置又は記憶媒体からもアクセス可能なコンピュータプログラムを包含するよう意図される。たとえ別個のブロックとして表されているとしても、様々なブロックは、所望の実施に依存して、更なるブロックに分けられても、より少ないブロックへとまとめられても、あるいは削除されてもよい。
【００５５】
図３は、本開示で記載される少なくとも１つの実施形態に従う方法の例であって、バッファオーバーフローを自動的に検出し、バッファオーバーフローを引き起こす関数にパッチを当てることに関連した方法３００のフロー図を表す。方法３００は、ブロック３０２（“バッファをオーバーフローさせる入力長さを決定する”）から開始してよい。ブロック３０２で、プロセッシングロジックは、バッファをオーバーフローさせる入力長さを決定してよい。入力長さは、ディジットの数、ディジットのタイプ、ディジットに関連した値、ビットの数、バイトの数、又は何らかの他の適切な測定単位によって測定されてよい。いくつかの実施形態では、ＯＤＭが、オーバーフローが起きたかどうかを判定するようバッファ及び／又はプログラム（例えば、図１のＯＤＭ１０６及び／又はプログラム１０４）をモニタしてよい。ブロック３０２の後には、ブロック３０４が続いてよい。
【００５６】
ブロック３０４（“バッファをオーバーフローさせない最大入力長さを決定する”）で、プロセッシングロジックは、バッファをオーバーフローさせない最大入力長さを決定してよい。いくつかの実施形態では、ＯＤＭが、バッファをオーバーフローさせる入力長さに対して二分探索法を実行すること、又は何らかの他の適切な方法によって、最大入力長さを決定してよい。ブロック３０４の後には、ブロック３０６が続いてよい。
【００５７】
ブロック３０６（“入力の入力長さを、最大入力長さに１測定単位を足したものに設定する”）で、プロセッシングロジックは、図１に関連して上述されたように、入力の入力長さを、最大入力長さに１測定単位を足したもの（例えば、バッファをオーバーフローさせる最小入力長さ）に設定してよい。いくつかの実施形態では、ＯＤＭが、入力の入力長さを、最大入力長さに１測定単位を足したものに設定してよい。ブロック３０６の後には、ブロック３０８が続いてよい。
【００５８】
ブロック３０８（“入力を用いてプログラムを作動させる”）で、プロセッシングロジックは、入力を用いてプログラムを作動させてよい。いくつかの実施形態では、ＯＤＭが、図１に関連して上述されたように、入力を用いてプログラムを作動させてよい。ブロック３０８の後には、ブロック３１０が続いてよい。
【００５９】
ブロック３１０（“入力について夫々のｃａｌｌ及びｒｅｔｕｒｎ対を記憶する”）で、プロセッシングロジックは、その入力について夫々のｃａｌｌ及びｒｅｔｕｒｎ対を記憶してよい。ｃａｌｌ及びｒｅｔｕｒｎ対（例えば、ｃａｌｌ／ｒｅｔｕｒｎ対）は、プログラムの動作中に生成されてよい。いくつかの実施形態では、ＯＤＭが、ｃａｌｌ／ｒｅｔｕｒｎ対の夫々を収集しメモリ（例えば、図１のメモリ１０５）に記憶してよい。ブロック３１０の後には、ブロック３１２が続いてよい。
【００６０】
ブロック３１２（“入力についてスタックを記憶する”）で、プロセッシングロジックは、その入力についてのスタックを記憶してよい。スタックは、入力に関連したメモリの割り当てを含んでよい。例えば、プログラムの動作中に生成されたデータは、バッファに格納されてよい。いくつかの実施形態では、ＯＤＭが、図１に関連して上述されたように、入力についてのスタックを収集しメモリに記憶してよい。ブロック３１２の後には、ブロック３１４が続いてよい。
【００６１】
ブロック３１４（“最大入力長さを含む入力を用いてプログラムが作動されたか？”）で、プロセッシングロジックは、最大入力長さを含む入力を用いてプログラムが作動されたかどうかを判定してよい。最大入力長さを含む入力を用いてプログラムが作動されていない場合には、ブロック３１４の後にブロック３１６が続いてよい。最大入力長さを含む入力を用いてプログラムが作動された場合には、ブロック３１４の後にブロック３１８が続いてよい。
【００６２】
ブロック３１６（“入力の入力長さを最大入力長さに設定する”）で、プロセッシングロジックは、入力の入力長さを最大入力長さに設定してよい。いくつかの実施形態では、ＯＤＭが、図１に関連して上述されたように、入力の入力長さを最大入力長さに設定してよい。ブロック３１６の後には、ブロック３０８が続いてよい。プロセッシングロジックは、最大入力長さを含む入力を用いて、ブロック３０８、３１０及び／又は３１２のプロセスを繰り返してよい。
【００６３】
ブロック３１８（“どの戻りアドレス部分が変造されているかを決定する”）で、プロセッシングロジックは、どの戻りアドレス部分が変造されているかを決定してよい。いくつかの実施形態では、ＯＤＭが、図１に関連して上述されたように、最小入力長さを含む入力に対応するスタックを、最大入力長さを含む入力に対応するスタックと比較することによって、どの戻りアドレス部分が変造されているかを決定してよい。２つのスタックの間の差は、そのような戻りアドレス部分がどこに位置するかを示し得る。ブロック３１８の後には、ブロック３２０が続いてよい。
【００６４】
ブロック３２０（“プログラムがクラッシュする前の最後のｃａｌｌを決定する”）で、プロセッシングロジックは、プログラムがクラッシュする前の最後のｃａｌｌを決定してよい。いくつかの実施形態では、ＯＤＭが、図１に関連して上述されたように、最小入力長さを含む入力に対応するｃａｌｌ及びｒｅｔｕｒｎ対を、最大入力長さを含む入力に対応するｃａｌｌ及びｒｅｔｕｒｎ対と比較することによって、最後のｃａｌｌを決定してよい。ｃａｌｌ及びｒｅｔｕｒｎ対の間の差は、どの関数（例えば、特定の関数）がバッファをオーバーフローさせたかを示し得る。ブロック３２０の後には、ブロック３２２が続いてよい。
【００６５】
ブロック３２２（“どこでバッファがオーバーフローされたかを決定する”）で、プロセッシングロジックは、どこでバッファがオーバーフローされたかを決定してよい。バッファがオーバーフローされた場所は、超えられた場合に戻りアドレス部分を変造する境界に対応し得る。いくつかの実施形態では、ＯＤＭが、図１に関連して上述されたように、２つのスタックを比較することによって、どこでバッファがオーバーフローされたかを決定してよい。ブロック３２２の後には、ブロック３２４が続いてよい。
【００６６】
ブロック３２４（“更新されたバッファインデックスについて境界を決定する”）で、プロセッシングロジックは、更新されたバッファインデックスについての境界を決定してよい。いくつかの実施形態において、２つのスタックの間の差は、戻りアドレスの第１部分に対応してよい。例えば、２つのスタックの位置０乃至１９は同じ又は同様であってよく、位置２０は異なってよい。この差に基づき、バッファは、位置１９で終了すると決定されてよく、境界は、位置１９にあってよい。いくつかの実施形態では、ＯＤＭが、図１に関連して上述されたように、更新されたバッファインデックスについての境界を決定してよい。ブロック３２４の後には、ブロック３２６が続いてよい。
【００６７】
ブロック３２６（“ファズ入力を用いて関数ｃａｌｌの数を決定する”）で、プロセッシングロジックは、ファズ入力を用いて関数ｃａｌｌの数を決定してよい。いくつかの実施形態では、パッチモジュール（例えば、図１のパッチモジュール１０８）が、図１に関連して上述されたように、ファズ入力を用いて関数ｃａｌｌの数を決定してよい。ブロック３２６の後には、ブロック３２８が続いてよい。
【００６８】
ブロック３２８（“関数ｃａｌｌの数はｃａｌｌ閾値を超えるか？”）で、プロセッシングロジックは、関数ｃａｌｌの数がｃａｌｌ閾値を超えるかどうかを判定してよい。いくつかの実施形態において、ｃａｌｌ閾値は、図１に関連して上述されたように、ユーザ入力又は計算に基づき決定されてよい。関数ｃａｌｌの数がｃａｌｌ閾値を超える場合には、ブロック３２８の後にブロック３３２が続いてよい。関数ｃａｌｌの数がｃａｌｌ閾値を超えない場合には、ブロック３２８の後にブロック３３０が続いてよい。
【００６９】
ブロック３３０（“プログラムの特定の関数にパッチを挿入する”）で、プロセッシングロジックは、プログラムの特定の関数にパッチを挿入してよい。いくつかの実施形態では、パッチモジュールが、アセンブリ言語でパッチを生成してよい。そのような及び他の実施形態で、パッチモジュールは、バッファをオーバーフローさせた特定の関数に対応するアセンブリ言語においてパッチを挿入してよい。代替的に、パッチモジュールは、中間表現においてパッチを生成してよく、パッチは、特定の関数に対応する中間表現において挿入されてよい。特定の関数にパッチを挿入することは、特定の関数が他の関数によって呼び出される場合にバッファをオーバーフローさせることを低減及び／又は防止し得る。
【００７０】
ブロック３３２（“プログラムの呼び出し関数にパッチを挿入する”）で、プロセッシングロジックは、プログラムの呼び出し関数にパッチを挿入してよい。いくつかの実施形態では、パッチモジュールが、プログラムにオーバーフローさせる特定の関数を呼び出した呼び出し関数に対応するアセンブリ言語においてパッチを挿入してよい。呼び出し関数にパッチを挿入することは、呼び出し関数によって呼び出される場合にのみ特定の関数がバッファをオーバーフローさせることを低減及び／又は防止し得る。代替的に、パッチモジュールは、中間表現においてパッチを生成してよく、パッチは、特定の関数に対応する中間表現において挿入されてよい。
【００７１】
図４は、本開示で記載される少なくとも１つの実施形態に従う方法の他の例であって、バッファオーバーフローを自動的に検出し、バッファオーバーフローを引き起こす関数にパッチを当てることに関連した方法４００のフロー図を表す。方法４００は、ブロック４０２（“バッファをオーバーフローさせる特定の入力長さを含む入力を用いてプログラムを作動させる”）から開始してよい。ブロック４０２で、プロセッシングロジックは、バッファをオーバーフローさせる特定の入力長さを含む入力を用いてプログラムを作動させてよい。入力長さは、ディジットの数、ディジットのタイプ、ディジットに関連した値、ビットの数、バイトの数、又は何らかの他の適切な測定単位によって測定されてよい。いくつかの実施形態では、ＯＤＭが、オーバーフローが起きたかどうかを判定するようバッファ及び／又はプログラム（例えば、図１のＯＤＭ１０６及び／又はプログラム１０４）をモニタしてよい。ブロック４０２の後には、ブロック４０４が続いてよい。
【００７２】
ブロック４０４（“バッファをオーバーフローさせる最小入力長さ、及びバッファをオーバーフローさせない最大入力長さを決定する”）で、プロセッシングロジックは、バッファをオーバーフローさせる最小入力長さ、及びバッファをオーバーフローさせない最大入力長さを決定してよい。いくつかの実施形態では、ＯＤＭが、バッファをオーバーフローさせる特定の入力長さに対して二分探索法を実行すること、又は何らかの他の適切な方法によって、最大入力長さを決定してよい。そのような及び他の実施形態で、ＯＤＭは、図１に関連して上述されたように、最大入力長さに１測定単位を足してインクリメントすることによって、最小入力長さを決定してよい。ブロック４０４の後には、ブロック４０６が続いてよい。
【００７３】
ブロック４０６（“最大入力長さを含む第１入力及び最小入力長さを含む第２入力を用いてプログラムを作動させる”）で、プロセッシングロジックは、最大入力長さを含む第１入力及び最小入力長さを含む第２入力を用いてプログラムを作動させてよい。ブロック４０６の後には、ブロック４０８が続いてよい。
【００７４】
ブロック４０８（“第１入力及び第２入力を用いてプログラムの各関数についてｃａｌｌ／ｒｅｔｕｒｎ対を収集する”）で、プロセッシングロジックは、第１入力及び第２入力を用いてプログラムの各関数についてｃａｌｌ／ｒｅｔｕｒｎ対を収集してよい。ｃａｌｌ／ｒｅｔｕｒｎ対は、プログラムの動作中に生成されてよい。いくつかの実施形態では、ＯＤＭが、ｃａｌｌ／ｒｅｔｕｒｎ対を収集しメモリ（例えば、図１のメモリ１０５）に記憶してよい。ブロック４０８の後には、ブロック４１０が続いてよい。
【００７５】
ブロック４１０（“バッファをオーバーフローさせる特定の関数を決定する”）で、プロセッシングロジックは、バッファをオーバーフローさせる特定の関数を決定してよい。いくつかの実施形態において、バッファをオーバーフローさせる特定の関数は、第１入力についてのｃａｌｌ／ｒｅｔｕｒｎ対と第２入力についてのｃａｌｌ／ｒｅｔｕｒｎ対との間の差に基づき、決定されてよい。ＯＤＭが、図１に関連して上述されたように、最小入力長さを含む入力に対応するｃａｌｌ及びｒｅｔｕｒｎ対を、最大入力長さを含む入力に対応するｃａｌｌ及びｒｅｔｕｒｎ対と比較することによって、特定の関数を決定してよい。ブロック４１０の後には、ブロック４１２が続いてよい。
【００７６】
ブロック４１２（“特定の関数に対するｃａｌｌの数がｃａｌｌ閾値を超えるかどうかを判定する”）で、プロセッシングロジックは、特定の関数に対するｃａｌｌの数がｃａｌｌ閾値を超えるかどうかを判定してよい。いくつかの実施形態において、ｃａｌｌ閾値は、図１に関連して上述されたように、ユーザ入力又は計算に基づき決定されてよい。関数ｃａｌｌの数がｃａｌｌ閾値を超える場合には、ブロック４１２の後にブロック４１４が続いてよい。関数ｃａｌｌの数がｃａｌｌ閾値を超えない場合には、ブロック４１４の後にブロック４１６が続いてよい。
【００７７】
ブロック４１４（“プログラムの呼び出し関数にパッチを挿入する”）で、プロセッシングロジックは、プログラムの呼び出し関数にパッチを挿入してよい。いくつかの実施形態では、パッチモジュールが、プログラムにオーバーフローさせる特定の関数を呼び出した呼び出し関数に対応するアセンブリ言語においてパッチを挿入してよい。呼び出し関数にパッチを挿入することは、呼び出し関数によって呼び出される場合にのみ特定の関数がバッファをオーバーフローさせることを低減及び／又は防止し得る。代替的に、パッチモジュールは、中間表現においてパッチを生成してよく、パッチは、特定の関数に対応する中間表現において挿入されてよい。
【００７８】
ブロック４１６（“プログラムの特定の関数にパッチを挿入する”）で、プロセッシングロジックは、プログラムの特定の関数にパッチを挿入してよい。いくつかの実施形態では、パッチモジュールが、アセンブリ言語でパッチを生成してよい。そのような及び他の実施形態で、パッチモジュールは、バッファをオーバーフローさせた特定の関数に対応するアセンブリ言語においてパッチを挿入してよい。代替的に、パッチモジュールは、中間表現においてパッチを生成してよく、パッチは、特定の関数に対応する中間表現において挿入されてよい。特定の関数にパッチを挿入することは、特定の関数が他の関数によって呼び出される場合にバッファをオーバーフローさせることを低減及び／又は防止し得る。
【００７９】
図５は、本開示の少なくとも１つの実施形態に従って、プログラムの制御フローグラフ５００を表す。制御フローグラフ５００は、複数の基本ブロックノード５１８を含んでよい。図５では、１つの基本ブロックノード５１８が番号付けされており、議論の簡単のために記載される。
【００８０】
いくつかの実施形態において、制御フローグラフ５００は、標準の技術を用いて生成されてよい。例えば、マシンコードで表現されているプログラムは、逆アセンブラを用いてアセンブリ言語へ逆アセンブリされてよい。逆アセンブラは、プログラム内の関数のパスを表すよう制御フローグラフ５００を生成してよい。基本ブロックノード５１８の夫々は、プログラムの単一の関数を表すアセンブリコードを含んでよい。プログラムの関数が他の関数を呼び出す場合に、制御フローグラフ５００は、基本ブロックノード５１８の間の接続矢印を含んでよい。矢印は、関数間のパスが存在することを示し得る。例えば、基本ブロックノード５１８は、２つの他の基本ブロックノードへ接続されてよい。図５に表されている例では、実線矢印が、基本ブロックノードからのｃａｌｌ（例えば、基本ブロックノード（関数）の実行順序）を表してよく、破線矢印が、基本ブロックノードからのｒｅｔｕｒｎ（例えば、メモリ内で配列されるコードシーケンス）を表してよい。いくつかの実施形態では、実際のプログラムの部分でないライブラリ関数に対するｃａｌｌも、破線矢印として表されてよい。そのような及び他の実施形態で、ライブラリ関数は作動（例えば、実行）されてよく、そのライブラリ関数からのｒｅｔｕｒｎは、破線からフローをレジュームしてよい。例えば、ｂａｒ（）ノードは、ｓｔｒｃｍｐ（）ノードを呼び出してよく、その後に、ｂａｒ（）ノードはレジュームしてよく、続いて、ｐｒｉｎｔｆ（）ノードを呼び出してよく、そして再び、ｂａｒ（）は、ｐｒｉｎｔｆ（）ノードの後でレジュームしてよい。
【００８１】
ここで記載される実施形態は、コンピュータ実行可能命令又はデータ構造を運ぶか又は記憶しているコンピュータ可読媒体を用いて、実装されてよい。そのようなコンピュータ可読媒体は、汎用又は特別目的のコンピュータによってアクセスされ得る如何なる利用可能な媒体であってもよい。例として、制限なしに、そのようなコンピュータ可読媒体は、ランダムアクセスメモリ（ＲＡＭ）、リードオンリーメモリ（ＲＯＭ）、電気的消去可能なプログラム可能リードオンリーメモリ（ＥＥＰＲＯＭ）、コンパクトディスク型リードオンリーメモリ（ＣＤ−ＲＯＭ）若しくは他の光学ディスクストレージ、磁気ディスクストレージ若しくは他の磁気記憶デバイス、フラッシュメモリデバイス（例えば、固体状態メモリデバイス）、あるいは、コンピュータ実行可能命令又はデータ構造の形で所望のプログラムコードを携行又は記憶するために使用され得且つ汎用又は特別目的のコンピュータによってアクセスされ得る如何なる他の記憶媒体も含む非一時的なコンピュータ可読記憶媒体を含んでよい。先に挙げられたものの組み合わせも、コンピュータ可読媒体の適用範囲内に含まれてよい。
【００８２】
コンピュータ実行可能命令は、例えば、汎用のコンピュータ、特別目的のコンピュータ、又は特別目的のプロセッシング装置（例えば、１つ以上のプロセッサ）に特定の機能又は機能群を実行させる命令及びデータを含んでよい。構造的な特徴及び／又は方法論的な動作に特有の言語で対象が記載されてきたが、添付の特許請求の範囲で定義されている対象は、必ずしも、上記の具体的な特徴又は動作に制限されないことが理解されるべきである。むしろ、上記の具体的な特徴又は動作は、特許請求の範囲を実施する形態の例として開示されている。
【００８３】
ここで使用されるように、語“モジュール”又は“コンポーネント”は、モジュール若しくはコンポーネントの動作を実行するよう構成された特定のハードウェア実施、並びに／又はコンピューティングシステムの汎用ハードウェア（例えば、コンピュータ可読媒体、プロセッシング装置、など）によって記憶及び／若しくは実行され得るソフトウェアオブジェクト若しくはソフトウェアルーチンを指し得る。いくつかの実施形態において、ここで記載される種々のコンポーネント、モジュール、エンジン、及びサービスは、コンピューティングシステムで（例えば、別個のスレッドとして）実行するオブジェクト又はプロセスとして実装されてよい。ここで記載されるシステム及び方法の一部は、概して、（汎用ハードウェアによって記憶及び／又は実行される）ソフトウェアにおいて実装されるものとして記載されているが、特定のハードウェア実施、又はソフトウェア及び特定のハードウェア実施の組み合わせも可能であり、考えられている。本明細書において、“コンピューティングエンティティ”は、ここで以前に定義されたあらゆるコンピューティングシステム、又はコンピューティングシステムで実行されるあらゆるモジュール若しくはモジュールの組み合わせであってよい。
【００８４】
ここで挙げられている全ての例及び条件付き言語は、当該技術の促進に本発明者によって寄与される概念及び本発明を読者が理解するのを助ける教育上の目的を意図され、そのような具体的に挙げられている例及び条件に制限されないと解釈されるべきである。本開示の実施形態が詳細に記載されてきたが、様々な変更、置換、及び代替が、本開示の精神及び適用範囲から逸脱することなしに行われてよいことが理解されるべきである。
【００８５】
上記の実施形態に加えて、以下の付記を開示する。
（付記１）
メモリと、
前記メモリへ動作上結合されるプロセッサと
を有し、
前記プロセッサは、
バッファをオーバーフローさせる特定の入力長さを含む入力を用いてプログラムを作動させることと、
前記バッファをオーバーフローさせる最小入力長さ、及び前記バッファをオーバーフローさせない最大入力長さを決定することと、
前記最大入力長さを含む第１入力、及び前記最小入力長さを含む第２入力を用いて、前記プログラムを作動させることと、
前記第１入力及び前記第２入力を用いて、前記プログラムの各関数についてｃａｌｌ／ｒｅｔｕｒｎ対を収集することと、
前記第１入力についてのｃａｌｌ／ｒｅｔｕｒｎ対と前記第２入力についてのｃａｌｌ／ｒｅｔｕｒｎ対との間の差に基づき、前記バッファをオーバーフローさせる特定の関数を決定することと、
前記特定の関数に対するｃａｌｌの数がｃａｌｌ閾値を超えるかどうかを判定することと、
前記特定の関数に対するｃａｌｌの数が前記ｃａｌｌ閾値を超えることに応答して、前記特定の関数が前記バッファをオーバーフローさせることを防ぐよう構成された境界を含むパッチを前記プログラムの呼び出し関数に挿入することと
を有する動作を実行するよう構成される、
システム。
（付記２）
前記特定の関数に対するｃａｌｌの数が前記ｃａｌｌ閾値を超えないことに応答して、前記特定の関数に対するｃａｌｌの数がｃａｌｌ閾値を超えるかどうかを判定する前記動作は、前記パッチを前記プログラムの前記特定の関数に挿入することを有する、
付記１に記載のシステム。
（付記３）
前記第１入力についてのｃａｌｌ／ｒｅｔｕｒｎ対と前記第２入力についてのｃａｌｌ／ｒｅｔｕｒｎ対との間の差に基づき、前記バッファをオーバーフローさせる特定の関数を決定する前記動作は、
前記第１入力に対応する前記プログラムの関数呼び出しシーケンスを決定することと、
前記第２入力に対応する前記プログラムの関数呼び出しシーケンスを決定することと
を有し、
前記特定の関数は、前記第１入力に対応する関数呼び出しシーケンスと前記第２入力に対応する関数呼び出しシーケンスとの間の差に基づき決定される、
付記１に記載のシステム。
（付記４）
前記動作は、
前記第１入力に対応する第１スタックにおけるメモリの割り当てを解析することと、
前記第２入力に対応する第２スタックにおけるメモリの割り当てを解析することと、
前記第１スタックを前記第２スタックと比較することと、
前記第１スタックと前記第２スタックとの比較に基づき、破損した戻りアドレスを決定することと
を更に有する、
付記１に記載のシステム。
（付記５）
前記動作は、
前記バッファに対応するスタック位置を決定することと、
前記戻りアドレスに対応するスタック位置を決定することと、
前記パッチを生成することと
を更に有し、
前記特定の関数が前記バッファをオーバーフローさせることを防ぐよう構成された前記境界は、前記バッファに対応するスタック位置、及び前記戻りアドレスに対応するスタック位置に基づく、
付記４に記載のシステム。
（付記６）
前記動作は、
前記第１入力に基づき複数のファズ入力を生成することと、
前記複数のファズ入力を用いて前記プログラムを作動させることと、
前記複数のファズ入力を用いて前記プログラムの前記特定の関数に対するｃａｌｌの数を決定することと
を更に有する、
付記１に記載のシステム。
（付記７）
前記動作は、前記特定の関数又は前記呼び出し関数に対応する中間表現及びアセンブリ言語のうちの少なくとも１つで前記パッチを挿入することを更に有する、
付記１に記載のシステム。
（付記８）
バッファをオーバーフローさせる特定の入力長さを含む入力を用いてプログラムを作動させることと、
前記バッファをオーバーフローさせる最小入力長さ、及び前記バッファをオーバーフローさせない最大入力長さを決定することと、
前記最大入力長さを含む第１入力、及び前記最小入力長さを含む第２入力を用いて、前記プログラムを作動させることと、
前記第１入力及び前記第２入力を用いて、前記プログラムの各関数についてｃａｌｌ／ｒｅｔｕｒｎ対を収集することと、
前記第１入力についてのｃａｌｌ／ｒｅｔｕｒｎ対と前記第２入力についてのｃａｌｌ／ｒｅｔｕｒｎ対との間の差に基づき、前記バッファをオーバーフローさせる特定の関数を決定することと、
前記特定の関数に対するｃａｌｌの数がｃａｌｌ閾値を超えるかどうかを判定することと、
前記特定の関数に対するｃａｌｌの数が前記ｃａｌｌ閾値を超えることに応答して、前記特定の関数が前記バッファをオーバーフローさせることを防ぐよう構成された境界を含むパッチを前記プログラムの呼び出し関数に挿入することと
を有する方法。
（付記９）
前記最大入力長さは、二分探索法により決定され、
前記最小入力長さは、前記最大入力長さに１測定単位を足したものに等しい、
付記８に記載の方法。
（付記１０）
前記第１入力についてのｃａｌｌ／ｒｅｔｕｒｎ対と前記第２入力についてのｃａｌｌ／ｒｅｔｕｒｎ対との間の差に基づき、前記バッファをオーバーフローさせる特定の関数を決定することは、
前記第１入力に対応する前記プログラムの関数呼び出しシーケンスを決定することと、
前記第２入力に対応する前記プログラムの関数呼び出しシーケンスを決定することと
を有し、
前記特定の関数は、前記第１入力に対応する関数呼び出しシーケンスと前記第２入力に対応する関数呼び出しシーケンスとの間の差に基づき決定される、
付記９に記載の方法。
（付記１１）
当該方法は、
前記第１入力に対応する第１スタックにおけるメモリの割り当てを解析することと、
前記第２入力に対応する第２スタックにおけるメモリの割り当てを解析することと、
前記第１スタックを前記第２スタックと比較することと、
前記第１スタックと前記第２スタックとの比較に基づき、破損した戻りアドレスを決定することと
を更に有する、
付記８に記載の方法。
（付記１２）
当該方法は、
前記バッファに対応するスタック位置を決定することと、
前記戻りアドレスに対応するスタック位置を決定することと、
前記パッチを生成することと
を更に有し、
前記特定の関数が前記バッファをオーバーフローさせることを防ぐよう構成された前記境界は、前記バッファに対応するスタック位置、及び前記戻りアドレスに対応するスタック位置に基づく、
付記１１に記載の方法。
（付記１３）
当該方法は、
前記第１入力に基づき複数のファズ入力を生成することと、
前記複数のファズ入力を用いて前記プログラムを作動させることと、
前記複数のファズ入力を用いて前記プログラムの前記特定の関数に対するｃａｌｌの数を決定することと
を更に有する、
付記８に記載の方法。
（付記１４）
パッチを前記特定の関数に挿入することは、前記特定の関数を中間表現に引き上げることを有し、
前記パッチは、前記特定の関数に対応する前記中間表現で挿入される、
付記８に記載の方法。
（付記１５）
バッファをオーバーフローさせる特定の入力長さを含む入力を用いてプログラムを作動させることと、
前記バッファをオーバーフローさせる最小入力長さ、及び前記バッファをオーバーフローさせない最大入力長さを決定することと、
前記最大入力長さを含む第１入力、及び前記最小入力長さを含む第２入力を用いて、前記プログラムを作動させることと、
前記第１入力及び前記第２入力を用いて、前記プログラムの各関数についてｃａｌｌ／ｒｅｔｕｒｎ対を収集することと、
前記第１入力についてのｃａｌｌ／ｒｅｔｕｒｎ対と前記第２入力についてのｃａｌｌ／ｒｅｔｕｒｎ対との間の差に基づき、前記バッファをオーバーフローさせる特定の関数を決定することと、
前記特定の関数に対するｃａｌｌの数がｃａｌｌ閾値を超えるかどうかを判定することと、
前記特定の関数に対するｃａｌｌの数が前記ｃａｌｌ閾値を超えることに応答して、前記特定の関数が前記バッファをオーバーフローさせることを防ぐよう構成された境界を含むパッチを前記プログラムの呼び出し関数に挿入することと、
前記特定の関数に対するｃａｌｌの数が前記ｃａｌｌ閾値を超えないことに応答して、前記パッチを前記プログラムの前記特定の関数に挿入することと
を有する動作を実行するようプロセッサによって実行可能なプログラミングコードが符号化されている非一時的なコンピュータ可読媒体。
（付記１６）
前記第１入力についてのｃａｌｌ／ｒｅｔｕｒｎ対と前記第２入力についてのｃａｌｌ／ｒｅｔｕｒｎ対との間の差に基づき、前記バッファをオーバーフローさせる特定の関数を決定することは、
前記第１入力に対応する前記プログラムの関数呼び出しシーケンスを決定することと、
前記第２入力に対応する前記プログラムの関数呼び出しシーケンスを決定することと
を有し、
前記特定の関数は、前記第１入力に対応する関数呼び出しシーケンスと前記第２入力に対応する関数呼び出しシーケンスとの間の差に基づき決定される、
付記１５に記載の非一時的なコンピュータ可読媒体。
（付記１７）
前記動作は、
前記第１入力に対応する第１スタックにおけるメモリの割り当てを解析することと、
前記第２入力に対応する第２スタックにおけるメモリの割り当てを解析することと、
前記第１スタックを前記第２スタックと比較することと、
前記第１スタックと前記第２スタックとの比較に基づき、破損した戻りアドレスを決定することと
を更に有する、
付記１５に記載の非一時的なコンピュータ可読媒体。
（付記１８）
前記動作は、
前記バッファに対応するスタック位置を決定することと、
前記戻りアドレスに対応するスタック位置を決定することと、
前記パッチを生成することと
を更に有し、
前記特定の関数が前記バッファをオーバーフローさせることを防ぐよう構成された前記境界は、前記バッファに対応するスタック位置、及び前記戻りアドレスに対応するスタック位置に基づく、
付記１７に記載の非一時的なコンピュータ可読媒体。
（付記１９）
前記動作は、
前記第１入力に基づき複数のファズ入力を生成することと、
前記複数のファズ入力を用いて前記プログラムを作動させることと、
前記複数のファズ入力を用いて前記プログラムの前記特定の関数に対するｃａｌｌの数を決定することと
を更に有する、
付記１５に記載の非一時的なコンピュータ可読媒体。
（付記２０）
パッチを前記特定の関数に挿入することは、前記特定の関数を中間表現に引き上げることを有し、
前記パッチは、前記特定の関数に対応する前記中間表現で挿入される、
付記１５に記載の非一時的なコンピュータ可読媒体。
【符号の説明】
【００８６】
１００  環境
１０２  入力データ
１０３  コンピューティング装置
１０４  プログラム
１０５  メモリ
１０６  オーバーフロー判定モジュール（ＯＤＭ）
１０７  スタック
１０８  パッチモジュール
２１０  コンピューティングシステム
２１２  プロセッサ
２１４  メモリ
２１６  データストレージ
【図１】
2019215847.tif 000008
【図２】
2019215847.tif 000009
【図３】
2019215847.tif 000010
【図４】
2019215847.tif 000011
【図５】
2019215847.tif 000012