コンピュータセキュリティ において、NOPスライド、NOPスレッド、またはNOPランプとは、プログラムがスライド上の任意のメモリアドレスに分岐するたびに、CPUの命令実行フローを最終的な目的の宛先に「スライド」させることを目的としたNOP (ノーオペレーション)命令のシーケンスのことです。この手法は、ソフトウェアエクスプロイトでよく用いられ、分岐命令のターゲットが正確に不明な場合にプログラムの実行を誘導するために使用されます。その他の注目すべき応用例としては、EMC(電磁両立性)を考慮したプログラミングなどの防御的なプログラミング戦略が挙げられます。
NOP スライドは、標準的な NOP 命令のリストで構成されていれば機能しますが、そのようなコードが存在すると疑わしく、自動的に簡単に検出されます。このため、実際の NOP スライドは、非標準的な NOP 命令 (レジスタを自身に移動したり、ゼロを追加したりする[ 1 ]など) や、プログラムの状態にほとんど影響を与えない命令で構成されることが多く、識別がはるかに困難になります。
NOPスライドは、スタックバッファオーバーフローを悪用する最も古く、最も広く知られている手法です。[ 2 ]ターゲット領域のサイズを効果的に増やすことで、バッファの正確なアドレスを見つける問題を解決します。これを行うために、スタックのかなり大きなセクションが、何もしないマシン命令で破壊されます。攻撃者が提供したデータの末尾、何もしない命令の後に、シェルコードが配置されているバッファの最上位への相対ジャンプを実行する命令を配置します。この一連の何もしない命令は、「NOPスライド」と呼ばれます。なぜなら、戻りアドレスがバッファの何もしない領域内の任意のアドレスで上書きされると、実行は何もしない命令を「スライド」していき、最後にジャンプによって実際の悪意のあるコードにリダイレクトされるからです。この手法では、攻撃者は比較的小さなシェルコードではなく、スタック上のNOPスライドの位置を推測する必要があります。[ 3 ]
この手法が広く普及しているため、侵入防止システムの多くのベンダーは、使用されているシェルコードを検出するために、このパターンのno-opマシン命令を検索します。NOPスライドには、必ずしも従来のno-opマシン命令のみが含まれているわけではありません。シェルコードが実行されないほどマシン状態を破壊しない命令であれば、ハードウェア支援no-opの代わりに使用できます。その結果、エクスプロイト作成者は、シェルコードの実行に実際には影響を与えないランダムに選択された命令でNOPスライドを構成することが一般的になっています。[ 4 ]
この方法は攻撃の成功確率を大幅に向上させますが、問題がないわけではありません。この手法を使用するエクスプロイトは、スタック上のオフセットがNOPスレッド領域内にあるかどうかを推測するという、ある程度の運に頼らざるを得ません。[ 5 ]推測が間違っていると、通常はターゲットプログラムがクラッシュし、システム管理者に攻撃者の活動が知られる可能性があります。もう1つの問題は、NOPスライドが、実際に使用できるほど大きなNOPスライドを保持するために、はるかに大きなメモリを必要とすることです。これは、影響を受けるバッファの割り当てサイズが小さすぎ、スタックの現在の深さが浅い場合(つまり、現在のスタックフレームの末尾からスタックの先頭までのスペースがあまりない場合)に問題となる可能性があります。これらの問題にもかかわらず、NOPスライドは特定のプラットフォーム、環境、または状況で機能する唯一の方法であることが多く、そのため依然として重要な手法です。
NOP スライドのエントロピーは、それに課せられた制約に依存します。特定のレジスタが使用されていないことが確認できる場合(つまり、次の使用前に既知の値に設定されることが確認できる場合)、それらのレジスタを任意に操作する命令を NOP スライドで使用できます。さらに、NOP スライドと命令ポインタの両方のアライメントが確定的である場合、アライメントされていない実行の結果に関係なく、マルチバイト命令を NOP スライドで使用できます。NOPスライドとペイロードが挿入される攻撃ベクトルを提供する入力がフィルタリングされている場合(印刷可能な文字のみを受け入れるなど)、含めることができる命令の範囲は制限されます。アーキテクチャ拡張(SSEなど)の一部である命令は、プログラムの状態とは無関係な場合が多いですが、その拡張がサポートされていないコンピュータを対象とする NOP スライドでは使用できません。
メモリ内の NOP スライドの存在を検出するための技術は数多く存在する。例えば、2005 年にギリシャの研究者らは、メモリイメージに長いバイト列が含まれているかどうかをチェックすることで、シーケンス内の各開始オフセットが有効であり、実行が同じ場所に到達するかどうかを調べることで、NOP スライドを簡単に検出できることを発見した。[ 6 ]
{{cite web}}: CS1 maint: 数値名: 著者リスト (リンク){{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ){{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ){{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ)