一次ソース
standa-note.blogspot.jp
元記事
www.techrepublic.com
概要
- Windows 10 にセキュリティ機能を提供する API であるところの「アンチ マルウェア スキャン インタフェース (AMSI)」に、「対象コードにヌル文字が含まれているとその文字以降のコードが AMSI からセキュリティソフトウェアに渡されずスキャンがバイパスされる問題」が確認された
- Microsoft は当該問題を修正し、2 月のセキュリティ更新で配布したが、パッチを適用していない環境を狙って今後の攻撃に悪用されるだろう
AMSI とは
- 「アンチ マルウェア スキャン インタフェース (AMSI) 」は Windows 10 で提供されているセキュリティ メカニズム
- AMSI はシステム上の特定イベントを検出し、検出結果をマルウェアのスキャンを行うセキュリティソフトウェアに通知する
- 通知されたセキュリティソフトウェアは、受け取ったイベントの内容に応じ、コンテンツをスキャンしてブロックするなどの処理を行う
- 中でも利用頻度の高いイベントは PowerShell (System.Management.Automation.dll) や Windows Script Host (例えば jscript.dll) などのスクリプト実行前に当該スクリプトの内容をセキュリティソフトウェアに渡してスキャンさせる機能
AMSI に確認された問題
- PowerShell コードにはヌル文字 (\0) を含めることができるが、AMSI がこの点を考慮していない
- System.Management.Automation.dll が AmsiScanString API を呼び出すと、AMSI (amsi.dll) の AmsiScanString API は渡された内容を LPCWSTR 型として受け取ってしまう(下記コードの string がそれ)
- このさい、コンテンツにヌル文字が含まれていると、最初のヌル文字がコンテンツの終端とみなされる
- したがってヌル文字以降のコンテンツがセキュリティソフトウェアに渡されず、スキャンされない
- これを悪用し、ヌル文字以降に悪意のあるコードを格納しておけば、AMSI 経由でのイベント検出を回避できる
HRESULT WINAPI AmsiScanString(
_In_ HAMSICONTEXT amsiContext,
_In_ LPCWSTR string, // ★最初のヌル文字で終端される
_In_ LPCWSTR contentName,
_In_opt_ HAMSISESSION session,
_Out_ AMSI_RESULT *result
);
- System.Management.Automation.dll は AmsiScanString API のかわりに AmsiScanBuffer API を呼び出ように修正
- AmsiScanBuffer API はコンテンツを LPCWSTR 型ではなく PVOID 型のバイトシーケンスとして受け取り、コンテンツにヌル文字が含まれていても終端とみなさない
- これにより AMSI からセキュリティソフトウェアにコンテンツの内容が正しく渡されるようになる
HRESULT WINAPI AmsiScanBuffer(
_In_ HAMSICONTEXT amsiContext,
_In_ PVOID buffer, // ★ヌル文字があっても終端とみなさない
_In_ ULONG length,
_In_ LPCWSTR contentName,
_In_opt_ HAMSISESSION session,
_Out_ AMSI_RESULT *result
);
Windows 10 の一般ユーザー、セキュリティソフトウェアのベンダー、リサーチャーがとるべき対策
セキュリティソフトウェアのベンダー
- PowerShell からコンテンツを ASMI 経由で受け取ってスキャンしている製品は、ヌル文字が含まれている場合に正常に動作するかどうか確認する
セキュリティソフトウェアの利用者
- 使用中の製品のベンダに本事象による影響の有無を確認する
セキュリティセキュリティリサーチャー
- 利用中の AMSI を利用するセキュリティソフトウェアがヌル文字を含むコンテンツをスキャンしたさい、問題なく動作するかどうか確認する