WindowsVista以降で使用できるAero、そしてAeroが有効になっていることで起こる様々な弊害(描画遅延、負荷の上昇など)
そういった理由から、Aeroを一時的に無効化したいという需要がゲームプログラマーを中心にある一定量存在する。
だが、この件について安易な実装を行ったがために、とある脆弱性を持つアプリケーションが増えていることをご存じだろうか?
最近なぜか耳にすることが多くなった「DLLハイジャック」の脆弱性だ。
簡単に説明すると、Aeroの無効化には「dwmapi.dll」というDLLが必要なのだが、このDLLはVista以降にしか存在しない。
このような場合、本来ならばまずOSを識別し、Vista以降であったらシステムのディレクトリからDLLのロードという実装を行うべきなのだが
多くのプログラマーはまずディレクトリの指定なしでDLLの読み込みを試行し、成功したらVista以降だと決めつけて処理を続行してしまうようなコードを記述しているのだ。
そのため、dwmapi.dllという名前のダミーdllを
- アプリケーションが起動されうるディレクトリ
- XPや2000のシステムディレクトリ
に設置された場合。
それら脆弱なアプリを実行するだけで、悪意のあるコードを実行してしまうことになる。
唯一の救いは、Aeroの無効化が必要なアプリケーションはファイルの関連付けから起動されることがない(=起動ディレクトリがネットワーク上など危険な場所にならない)物が多いため
前者の方法とは無関係であるアプリが多いことと
後者の方法もリモートからファイルを操作できてしまう別の脆弱性とセットでなければ脅威にはならないことだろう。
だが危険であることにはなんら変わりはない。
dwmapi.dllのDwmEnableCompositionを用いたAeroの無効化を行う場合。
Dynamic-Link Library セキュリティをよく読み、OSの特定とdll読み込み先の指定を厳格に行い
万が一にでも脆弱性を生まないよう、注意してコーディングを行うべきである。
もし脆弱性が悪用された場合、被害をこうむるのはプログラマーではなくユーザーなのだから。