個人的なメモ

Tomohiro Suzuki @hiro128_777 のブログです。Microsoft MVP for Developer Technologies 2017- 本ブログと所属組織の公式見解は関係ございません。

.NET 6 の新機能 - ランタイムのセキュリティ脆弱性の緩和策

.NET 6 の新機能 の情報の目次は以下をご覧ください。
hiro128.hatenablog.jp 
 

ランタイムのセキュリティ脆弱性の緩和策

2021年の初頭に、.NET ランタイムのセキュリティ対策のロードマップが発表されています。

これらのセキュリティ対策は単なるセキュリティパッチではなく、ランタイムの構造に手を入れる根本的な対策を含んでおり、それらは .NET 6 以降にのみ実装されることとなっています。.NET Framework のセキュリティパッチでは実装されません。
github.com
なお、.NET 6 RC 1 では、以下の2つの重要なセキュリティ対策がプレビューとなりました。なお、.NET 7ではこれらはデフォルトで有効になる予定です。
 

Hardware-enforced Stack Protection(ハードウェア強制型スタック保護)

ハードウェア強制型スタック保護は、Intel の第11世代 Tiger Lake プロセッサに および、AMD Zen 3 プロセッサに Control-flowEnforcement Technology (CET)として搭載されているセキュリティ機能です。

x64 CPU のハードウェアに依存した機能ですので当然ながら、x64 プラットフォームでのみ有効にできる機能となります。

CET はシャドウスタック(コールスタックの「影(シャドウ)」となる第2の別のスタック)を使ってすべてのリターンアドレスを記録しておく技術です。x64 のアセンブリ言語で、CALL 命令ごとにリターンアドレスがコールスタックとシャドースタックの両方にプッシュされ、RET 命令ではコールスタックとシャドースタックの両方からリターンアドレスをロードします。

2つのアドレスが一致しない場合、プロセッサは制御保護例外(#CP—Control-Protection Exception)を発行します。これがカーネルにトラップされ、セキュリティを保証するためにプロセスを終了させます。

シャドウスタックはリターンアドレスのみを格納するため、追加のメモリオーバーヘッドを最小限に抑えることができます。
 
公式情報:
CET
Understanding Hardware-enforced Stack Protection
.NET 6 compatibility with Intel CET shadow stacks (early preview on Windows) 
 
 

W^X(write xor execute:書き込みと実行の排他)

W^X は、プロセスやカーネルのアドレス空間内のすべてのページが、書き込み可能か実行可能かのいずれかであり、両方はできないというメモリ保護ポリシーです。この保護機能がないと、プログラムはデータ用のメモリ領域にCPU命令を書き込み(データ「W」として)、その命令を実行(実行可能「X」、または読み取り-実行「RX」として)することができてしまいます。

W^X は、最も単純な攻撃経路を遮断します。この機能がない場合、その他のより高度な対策はバイパスされる可能性があるため、その他の対策の意味がない結果となってしまいます。W^X を導入したことで前提条件がそろったため、今後 CET のような他の補完的な対策を追加される予定となっています。

Apple は「macOS」の将来のバージョンで W^X を必須としています。W^X は、.NET 6 を搭載したすべての OS で利用可能ですが、デフォルトで有効化されているのは、Apple Silicon 上で動く macOS のみとなっています。.NET 7 ではすべての OS で有効になる予定となっています。

公式情報:W^X