コンピューターのセキュリティでは、制御フローの整合性を確保するために多くの保護メカニズムが使用されていることがわかりました。これらのメカニズムの1つがシャドウスタックです。
プリンシパルは非常に簡単で、関数の戻りアドレスの整合性を保証します。実際、スタックにある戻りアドレスは、シャドウスタックにプッシュされたものと比較されます。
Shadowスタックにはいくつかの実装があり、そのうちの1つは 関数のエピローグとプロローグの変更 (これをShadowスタックに書き込み、チェックのためにロードするため)で構成されています。
質問は次のとおりです:ユーザー空間の関数がシャドウスタックへの書き込みを許可されている場合、攻撃者がシャドウスタックを書き込み/変更することをどのように防ぐことができますか?
完全に保護することはできませんが、シャドウスタックの目的ではありません。シャドウスタックは、任意のコードではなく、ローカル変数(スタック上の変数)のバッファオーバーフローによるスタックの変更を防止します。攻撃者がすでに任意のコードを実行できる場合、それはゲームオーバーです。
シャドウスタックの保護は非常に費用がかかります。保護はハードウェアレベルで行うことができます。あなたの質問に答えるために、ここでシャドウスタックの保護についてもっと見つけることができます:
https://people.eecs.berkeley.edu/~daw/papers/shadow-asiaccs15.pdf
T。 H. Dang、P。Maniatis、およびD. Wagner。シャドウスタックとスタックカナリアのパフォーマンスコスト。第10回情報、コンピューター、通信セキュリティに関するACMシンポジウム、ASIACCS、2015年
M。 Payer、A。Barresi、およびT. R. Gross。バイナリ強化による細粒度の制御フローの完全性。侵入とマルウェアの検出と脆弱性評価に関する第12回会議、DIMVA、2015年