パスワードを忘れた? アカウント作成
13460803 submission
Windows

Windows 8以降で必須ASLRを有効にしただけでは適切なランダム化が行われない

タレコミ by headless
headless 曰く、
Windows 8以降でEMETを使用する場合や、Windows 10 Fall Creators UpdateのWindows Defender Exploit Protectionを使用する場合、「必須ASLR」を有効にしても適切なランダム化が行われないとして、CERT/CCが問題の詳細と緩和策を公開している(Vulnerability Notes Database VU#817544BetaNewsの記事BleepingComputerの記事Will Dormann氏のツイート)。

モジュールに割り当てるメモリーアドレスをランダム化して攻撃者によるデータの悪用を困難にするASRLだが、Windowsの既定では「/DYNAMICBASE」オプションを使用してコンパイルされた(ASLRの適用をオプトインした)モジュールにのみ適用される。必須ASLRを有効にするとオプトインしていないモジュールにもASLRを強制することが可能となるが、エントロピーを確保するにはボトムアップ型のメモリー割り当てでベースアドレスをランダム化する「ボトムアップASLR」も重要だ。

Windows 8以降では必須ASLR/ボトムアップASLRがOSの機能に組み込まれているため、EMET/Exploit Protectionはオプションをレジストリに設定する機能のみを提供する。設定が格納されるレジストリ値は「HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel」の「MitigationOptions」という値なのだが、EMET/Exploit Protectionともにデフォルトではこの値が作成されない。

Exploit Protectionのデフォルトでは必須ASLRが「既定でオフにする」、ボトムアップASLRが「既定でオンにする」に設定されている。必須ASLRはMitigationOptionsが存在しなければオフになるため問題ないが、ボトムアップASLRはUI上の表示に反してオフになっている。CERT/CCでは有効な設定を含む.regファイルの内容を公開しているが、Exploit ProtectionでボトムアップASLRをいったんオフにし、再度オンにすることで有効なレジストリ値をセットすることも可能だ。なお、「既定値を使用する(<オン>)」を選択した場合は有効なレジストリ値がセットされないので注意が必要だ。

EMETのデフォルトではWindowsの既定値と同じ、オプトインのみASLR有効のオプションが選択されているため、レジストリでMitigationOptionsが設定されていなくても表示と設定の不一致は発生しない。グローバルな必須ASLRのオプションはレジストリ設定を追加することで選択可能になるが、ボトムアップASLRをグローバル設定することはできず、アプリケーションごとの設定が必要になる。

この場合もCERT/CCが公開しているレジストリ設定を適用することでボトムアップASLRがグローバルで有効になる。ただし、レジストリ設定はExploit Protection用のものでMitigationOptionsがバイナリ値になっている。EMETのMitigationOptionsはQWORD値になっており、他のオプションを変更するとボトムアップASLRの設定が失われるので注意が必要だ。これを回避するにはMitigationOptionsをQWORD値で作成し、0x10000を設定してから他のオプションをEMETで設定すればいい。
この議論は、 ログインユーザだけとして作成されたが、今となっては 新たにコメントを付けることはできません。
typodupeerror

開いた括弧は必ず閉じる -- あるプログラマー

読み込み中...