スタックが実行可能であるのはなぜですか? システムが強制的にスタックを実行不可にし、テキストを書き込み不可にした場合、コード インジェクション攻撃を完全に阻止できますか?
3 に答える
実行可能スタックの主な歴史的理由は、「ネストされた関数」と呼ばれるほとんど知られていない、めったに使用されない GCC 機能との互換性です。これは、自動保存期間を持つクロージャと同等です。ネストされた関数のアドレスを取得する場合、実際の関数が使用するデータを指す隠し引数をロードするために、プログラムはトランポリンと呼ばれるコードを実際に生成する必要があります。このコードはスタックにあります。
ネストされた関数は C 言語の一部ではなく、C 言語ではスタックを実行可能にする理由がないことに注意してください。C では、コードとデータが共通のアドレス空間に存在する必要さえありません。そのため、ネストされた関数のような非標準の拡張機能をサポートすることを目的としない実装は、実行可能なスタックを提供するべきではありません。これは、プログラムに存在する可能性のあるセキュリティ上の欠陥の危険性を悪化させるためです。
スタックが実行可能であるのはなぜですか? 古い x86 MMU (メモリ管理ユニット) はページごとに 1 つのアクセス ビットしかなかったからです。値は read-execute または read-write-execute でした。DEP と NX を備えた新しいチップでは、ページごとに別のビットが追加され、実行許可をきめ細かく制御できるようになりました。