システムやアプリケーションの脆弱性を悪用し、不正なコードと置き換えて実行させるのは典型的な攻撃手法の 1 つですが、この場合、脆弱性を足がかりに、追加のマルウェアのインストールなどが行われ、結果的にコンピューターを好きなように操作されてしまいます。脆弱性にはセキュリティ更新プログラムを適用するのが最善策ですが、必ずしもすぐに適用できなかったり、ゼロデイのようにセキュリティ パッチが作成される前に攻撃が実行される場合もあります。
そのような状況からシステムを保護するために、Windows 10 では、実効性のある攻撃コードの開発を困難にするための、より強化された機能が搭載されています。
強化された脆弱性緩和機能
脅威に対する耐性の 1 つとして、また攻撃コストを高めるため、Windows には、脆弱性を悪用した不正なコード実行を防ぐ (困難にする) いくつかの緩和機能が搭載されています。Windows のバージョンを重ねるごとに、そのときどきの悪用手法に対抗する機能が追加、強化されており、Windows 10 では、新たな機能として制御フロー ガードという緩和機能が追加されました。
Windows 2003 以前 | Windows XP SP2 | Windows Vista/7 | Windows 8 | Windows 10 | |
---|---|---|---|---|---|
追加/強化された機能 | 特になし | - DEP - /GS - SafeSEH - Heap hardening v1 | - ASLR v1 - SEHOP - Heap hardening v2 | - ASLR v2 - Kernel SMEP & DEP - Heap hardening v3 | - 制御フロー ガード |
効果 | 悪用は防御されず | - データ領域からのコード実行防止 - スタック、例外処理、ヒープの保護 | - メモリ レイアウトのランダム化 - 例外処理、ヒープ保護の強化 | - メモリ レイアウト ランダム化の改善 - ヒープ保護の改善 | - 正常な関数のみ呼び出し可能 |
表: 各バージョンの Windows で追加された主なメモリ保護機能
悪用と緩和機能の歴史
Slammer や Blaster といった世界を震撼させた攻撃が台頭した 2003 年を境に、マイクロソフトは信頼できるコンピューティング (TwC) の名の下、セキュリティ開発ライフサイクル (SDL) を開始し、Windows XP SP2 では、脆弱性の悪用を防止 (難化) するいくつかの緩和機能を搭載しました。
攻撃者が脆弱性の悪用に成功するかは、悪用コードをメモリの正確な場所に配置できるかに依ります。データ実行防止 (DEP) は、メモリ上のコード実行可能領域を限定する (データ領域での実行を防止) ことで、攻撃者が不正なコードを挿入できる領域を狭め、実行を困難にします。Vista で導入されたアドレス空間レイアウトのランダム化 (ASLR) はアプリケーションのメモリ アドレスをランダム化することで、攻撃者による悪用コードの実行を困難にしています。
DEP や ASLR は非常に有効な機能ですが、残念ながらレガシ依存やアプリケーションとの互換性などから、Windows 7 以前では Windows の一部分のみで有効に機能している状態でした。これを受け、Windows 8 では互換性まわりの問題点を解決しシステム全体を通して利用できるように改善されています。また、ASLR 2.0 では、エントロピーを増やしたり、64 ビット メモリ アドレスへの適用により、ランダム化可能なメモリ領域の対象を増大し、ブルート フォース攻撃などへの耐性を強化しています。
コード ハイジャックを検出/遮断する制御フロー ガード
Windows 10 では、制御フロー ガード (CFG) という新たな緩和機能が追加されました。これは、ASLR をバイパスしようとする手法への対策として誕生しました。前述のように、ASLR はアプリケーションが実行されるメモリ アドレスをランダム化することで、攻撃者がコードを挿入して実行することを困難にします。しかし、たとえば、“Use after Free (開放済みメモリ使用) " などの手法を使うことで、攻撃者はアプリケーションがメモリのどの位置を使用しているかを特定でき ASLR をバイパスできてしまいます。
そこで誕生したのが CFG です。CFG は、正常な関数のみを呼び出すことで、不正な関数が読み込まれることを防ぎます。文字通り、アプリケーションのコードの流れ、連続性を監視し、コード ハイジャックなど非直接的なコールが実行される前に、安全で期待されるものであるかを検証し、不正と判断した場合はアプリケーションを終了することで、不正なコードが実行されるのを防ぎます。これにより、仮に ASLR がバイパスされるなどで悪用コードを挿入された場合でも、CFG がコード ハイジャックを検出し実行を防止するため、その先の重要情報の搾取や PC の遠隔操作といった実際の被害に至らずに済みます。セキュリティ強化の観点から、アプリケーションを CFG でコンパイルするよう、開発者の皆さんにも推奨しています。
おわりに
事実として、人間がコードを書く以上、脆弱性はついて回ります。開発段階での脆弱性を減らす努力と並行して、地味かもしれませんが、プラットフォームやアプリ自身が不正なコードを検出したり、実行させないという緩和技術のさらなる向上が、今後も期待されるところです。
関連情報
- データ実行防止: よく寄せられる質問
- 第 13 回 Windows Vista のセキュリティ機能~ Address Space Layout Randomization ~
- 制御フロー ガード参考情報: Visual Studio 2015 Preview: Work-in-Progress Security Feature
Windows 10 関連ブログ
- Windows 10: 問題を起こした更新プログラムやドライバーを Windows Update で一時的にインストールされないようにするツールの紹介 (2015/07/31)
- Windows 10、Microsoft Edge、初めての月例セキュリティ リリース – 読み解き (2015/08/12)
- Windows 10: Wi-Fi センサー (Wi-Fi Sense) とは? 正しく理解して使用してみよう (2015/08/21)
- Windows 10: Windows Update の主な変更点 (2015/08/27)
- Windows 10: Microsoft Passport: パスワードのない時代の幕開け (2015/09/11)
- Windows 10: さようならパスワード、こんにちは Windows Hello (2015/9/18)