永続化とラテラルムーブメントの両方を可能にする手法が、Microsoft Windowsで再び確認された。アクセシビリティツールであるNarratorに存在する、長年知られてきたDLLハイジャックの脆弱性が悪用されている。
この問題は2013年に初めて指摘されたもので、Windows 10と11にも残っている。ローカル管理者権限を持つ攻撃者は、任意のコードを実行し、発見されにくい形で永続化を維持し、ネットワーク内を横方向に移動できる可能性がある。
TrustedSecの研究者は指摘した。この攻撃手法には「操作対象のシステムへのローカル管理者アクセスが必要となる」としている。
ヘルプツールからバックドアへ
Narratorなどのアクセシビリティツールは高い権限で動作し、ユーザーのログオン前に起動するよう設定できる。そのため、読み込み動作を悪用すれば、攻撃者は高権限の実行コンテキストを得られる。
これは、リモート管理やRDPアクセスを許可している組織にとって特に懸念される。システムパスへの書き込みやレジストリ値の編集が可能な攻撃者は、無害な支援技術を、一般的なエンドポイント防御を回避する永続的なインプラントへと変えられるためだ。
TrustedSecが最近実施したテストでは、2013年にHexacornが行った調査を踏まえ、現在のWindowsビルドでもシステムディレクトリから特定の音声エンジンDLLを読み込もうとすることが確認された。
Narratorの実行ファイルは、次のパスにある音声エンジンDLLを探す:%windir%\system32\speech_onecore\engines\tts。期待されるファイル名の悪意あるDLLに置き換えれば、攻撃者はNarratorの起動時にコードを実行できる。
アクセシビリティDLLによる気づかれにくい永続化
この手法は典型的なDLLハイジャックであり、信頼されたアプリケーションが予測可能な場所から名前でライブラリを読み込む。そこにあるファイルを悪意あるDLLに置き換えると、システムは攻撃者のコードを実行する。
このケースでは、NarratorがDLLの初期化ルーチン内に配置されたコードを実行するため、ペイロードの実行にエクスポート関数は必要ない。
研究者は、注入したDLLによってNarratorのメインスレッドを一時停止させることで、さらにステルス性を高めた。これにより、ペイロードが見えない状態で実行されている間、ユーザーに警告を与えるはずの音声出力や画面上の手がかりが表示されなくなる。
永続化はレジストリ設定によって実現できる。
configurationというREG_SZ値をHKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Accessibilityの下に作成し、Narratorを値として設定すると、ユーザーのログオン時にアクセシビリティツールが起動し、悪意あるDLLが読み込まれる。
同じレジストリ変更をHKEY_LOCAL_MACHINEの下で行うと、SYSTEMレベルの永続化が確立され、ログイン画面でNarratorが高い権限で起動する。
リモートレジストリへのアクセス権があれば、攻撃者はRDP設定(たとえばSecurityLayerの保護を無効化する設定)も変更できる。また、Ctrl+Win+Enterキーシーケンスを使ってログイン画面からNarratorを起動し、RDPログイン中にSYSTEMとしてペイロードを実行できる。
研究者は「Bring Your Own Accessibility」という手法も実証した。レジストリにカスタムのアクセシビリティツールを作成し、任意のバイナリ(ネットワークUNCパスを含む)を指定したうえで、それらのツールを同じ設定機構に組み込み、ログオン時またはシステム起動時に実行させるというものだ。
ハイジャックからWindowsを守る
Windowsのアクセシビリティツールを介したDLLハイジャックと永続化のリスクを低減するには、組織はシステムのハードニングと監視の体制を強化すべきだ。
- 最小権限を徹底する:ローカル管理者アカウントを制限し、システムディレクトリへの予期しない書き込みアクセスを監視する。
- レジストリの変更を監視する:HKCUとHKLMの双方にあるWindowsアクセシビリティ関連のレジストリキーで、新規または変更された値を検知して警告する。
- DLL読み込みパスへの書き込みアクセスを制限する:次のパスと%windir%\system32\speech_onecore\engines\tts関連ディレクトリに書き込めるのは管理者だけになるようにする。
- アプリケーションの許可リストを適用する:許可リスト方式のソリューションを使い、承認されていないDLLや実行ファイルをブロックする。
- リモート管理を強化:リモートレジストリへのアクセスを制限し、RDP設定の変更や通常とは異なるRDPログオンの挙動を監視する。
- プロセスインジェクションとスレッドの一時停止を検知する:未知のコードが実行されている間に、アプリケーションの主要スレッドを一時停止する手法をホストレベルで検知できるようにする。
これらの対策を実施することで、攻撃者がアクセシビリティ機能を永続化や権限昇格に悪用する能力を制限できる。厳格なアクセス制御、継続的な監視、許可リストを組み合わせれば、一般的なDLLハイジャックの経路を遮断し、エンドポイント全体のセキュリティを強化できる。
古い機能、新たなリスク
今回、古い手法が再び注目されたことは、サイバーセキュリティにおける変わらぬ事実を浮き彫りにしている。レガシー機能や利便性を高める機能は、当初想定されたセキュリティ前提を超えて使われ続けることが多い。
脅威アクターは、アクセシビリティツール、スケジュールタスク、一般的なDLLパスなど、信頼されたシステムコンポーネントを再利用し続け、検知を回避して永続化を維持している。
これに対抗するには、防御側はレガシー機能を新しいコードと同じ厳しさで精査し、最小権限、継続的な監視、そしてあらゆる機能がいつか悪用される可能性を前提とした安全な設計原則を徹底しなければならない。
この変化する脅威環境はゼロトラストツールを必要としており、ユーザー、デバイス、プロセスのいずれも継続的な検証なしに本質的に信頼すべきではないという原則に基づいて動作する。

