従来AVでは見逃す脅威|NGAVはどう見抜く?内部ロジックと検知の仕組み

情報システム担当者が知るべきEPP製品の特徴と「振る舞い検知」の仕組み
近年、マルウェアによるサイバー攻撃が組織に深刻な被害をもたらしています。個人情報の漏えいや業務停止、身代金要求など、被害の内容は多岐にわたります。こうしたリスクから自社を守るため、今では多くの企業が「アンチウイルス」と呼ばれるセキュリティ製品を導入しています。もはやセキュリティ製品を使わずにビジネスを行うことは、サバンナに丸裸で出ていくようなものです。それほどまでにITインフラにおけるセキュリティ対策は基本かつ必須の存在になっています。
ただし、セキュリティ製品であればどれでもよいというわけではありません。製品ごとに得意な検知の仕組みや守備範囲に違いがあります。今回は企業でよく利用されている「EPP(Endpoint Protection Platform)」と呼ばれるエンドポイント保護製品に注目し、その中でも「振る舞い検知」とは何か、 そしてそれでも防ぎきれない攻撃には何があるのか、 という視点で解説していきます。
今回は少し技術的な内容も含まれており、x64dbgなどのディスアセンブラ※を用いた内部動作の一端をご紹介します。あくまでなんとなく理解できたらOKという気軽な気持ちでご覧ください。
※機械語で書かれたプログラムをアセンブリ言語に変換すること
AV(アンチウイルス)製品の基本と2つの検知方法
EPP製品の中核的な機能として、多くの企業がAV(アンチウイルス)を導入しています。AVがマルウェアを検出する方法は、大きく分けて以下の2種類があります。
シグネチャベース検知
既知のマルウェアの特徴と一致するか、をチェックする方法です。具体的には過去に確認されたマルウェアのファイル名やハッシュ値、バイナリの断片などが「パターンファイル」としてまとめられており、PC上のファイルと照合して一致すればマルウェアと判定されます。
この方法は、既に知られているマルウェアであれば高い精度で検出できますが、「新種」や「変種」といった未知のマルウェアに対しては反応できません。
振る舞い(ビヘイビア)ベース検知
マルウェアの「動き」に注目する方式です。ファイルの見た目ではなく「実行時にどんな動きをするか」を監視して、マルウェアかどうかを判断します。
具体的にはプログラムがどんなAPIを呼び出したか、どんなメモリ操作を行ったか、他のプロセスにどう干渉したかといった情報をリアルタイムでチェックし、あらかじめ定義された怪しい動きのパターンと照らし合わせて検出する仕組みです。
このような振る舞い検知を行う製品は、一般的にNGAV(Next Generation AntiVirus:次世代型アンチウイルス)と呼ばれています。
振る舞い検知で見られている典型的なマルウェアの動き
では実際に「振る舞い」とは何なのでしょうか。詳細を理解する機会は少ない印象ですが、少し頑張ってみていきましょう。ここでは、悪意のあるコード(シェルコード)を他のプロセスに注入・実行する際の、よくある手順を紹介します。分かりやすいように実際に使われるAPI名※を交えて説明します。何となくの理解を目指してください。
※API名:アプリケーションプログラミングインターフェース(API)を識別するための名前
①メモリ確保
|VirtualAlloc|
|VirtualAllocEx|
まず、マルウェアは悪意のあるコード(シェルコード)を置くための空間を確保します。
これに使われるのがVirtualAllocやVirtualAllocExという Windows APIです。
②メモリ書込
|WriteProcessMemory|
次に、確保したメモリにシェルコードを書き込みます。
WriteProcessMemoryという関数を使って、対象のプロセスに対してコードを「注入」します。
③保護属性変更
|VirtualProtect|
|VirtualProtectEx|
書き込んだコードを実行するために、メモリの保護属性を「実行可能」に変更します。
これにはVirtualProtectやVirtualProtectExが使われます。
④スレッド作成
|CreateRemoteThread|
|NtCreateThreadEx|
最後に、書き込んだコードを「実行」するため、対象プロセス内でスレッドを作成します。
ここでCreateRemoteThreadなどの関数を使って、書き込んだコードを走らせます。
この一連の流れは、マルウェアの典型的な行動パターンとして、以下赤枠のように振る舞い検知で重点的に監視されています。

それでも検知をすり抜ける攻撃とは
ただし、こうした振る舞い検知をすり抜ける手口もあります。その代表例が「ファイルレス攻撃」です。これは、マルウェアをディスクに保存せず、すべての処理をメモリ上だけで完結させる攻撃です。ファイルが存在しないため、従来のファイルスキャンやパターンマッチでは検出できず、振る舞い検知でもタイミングによっては見逃されることがあります。
巧妙な攻撃ロジックの1つとして「Thread Hijacking(スレッド乗っ取り)」という技術があります。ここから先はなんとなくのイメージしてみてください。攻撃者は、まずダミーのスレッドを作ります。これは表面上は何もしていない「おとなしい」スレッドです。セキュリティ製品はそれを見て「怪しい動きはないな」と判断します。攻撃者はその後、そのスレッドの中身をSetThreadContextというAPIで書き換え、実際の攻撃用コードを仕込みます。ResumeThreadを使ってそのスレッドを再開させると、見かけは無害だったスレッドが、実はマルウェアとして動き出すわけです。
この手法では、最初から怪しい動作をせず、後から静かに「すり替える」ため、NGAVの振る舞いを欺きやすいのです。

↑出だしは比較的静的な構造となっており、ret(アセンブリ言語:呼び出し元関数へ戻る)によって処理が即終了する構成になっています。処理の実体がほとんど存在しないことから、スレッドハイジャックなどで用いられるダミー関数として用意されたものである可能性が高いです。

↑ret後、スレッドのコンテキスト(内容)操作と思われる動作(キャプチャ全体)が始まります。

↑ResumeThreadで、武装化したペイロード※とともにスレッドが再開します。
※ペイロード:マルウェアに含まれる被害をもたらすコード
さらに進化するマルウェア - NGAVだけでは限界も
馴染みがある「ファイルレス攻撃」の1つは、Office の Word ファイルのマクロを利用した攻撃ではないでしょうか。2021年頃に再び勢いを増したEmotetもこのマクロを利用するタイプのファイルレス攻撃でした。
しかし、一口に「ファイルレス攻撃」といっても、その中にはさまざまな具体的な手法が存在します。たとえば「Process Hollowing」や「DLL Injection」などは、同じくマルウェアの実体をディスクに書き込まず、メモリ上で直接展開・実行する代表的な攻撃です。
また、前述の「Thread Hijacking」のように、プロセス内部のスレッドを操作してコードを差し替えるといった攻撃も、ファイルレス型の手法のひとつとして知られており、NGAVの検知をすり抜けるケースがあります。
一方で、「LOLBin(Living off the Land Binary)」と呼ばれる攻撃では、ファイルは使用されているものの、それが攻撃者によって持ち込まれたものではなく、もともと Windows に備わっている正規の実行ファイルが利用されます。たとえば、powershell.exeもそれに該当します。

このような正規プロセスを利用した攻撃では、NGAVなどのセキュリティ製品が「Windows の純正ツール=安全」とみなしてしまうこともあり、検知をすり抜ける恐れがあるのです。
このように、「ファイルレスかどうか」という分類だけでは攻撃の巧妙さを判断できない時代に突入しています。攻撃者にとって重要なのは、「ファイルを使うかどうか」ではなく、「いかに検知を回避できるか」であり、そのための工夫や回避技術が年々進化しているのです。
このような背景からも、「振る舞い」という言葉がカバーする範囲は非常に広く、NGAVを導入していればすべての脅威を防げるというわけではないということにご納得いただけるのではないでしょうか。
EPP製品(AVやNGAV)は今やセキュリティの基本装備ですが、それだけでは十分とは言えません。マルウェアは進化を続けており、「振る舞い検知ですら回避してくる」時代に突入しています。情報システム部門はこうした技術的背景を理解したうえで、
- 自社のEPP製品がどこまで検知可能か
- 本当にカバーしたい範囲に届いているか
- EDR製品の導入が必要か
といった観点でセキュリティ戦略を検討する必要があります。
サイバーセキュリティに不慣れな方にとっては少し難しい話もあったかもしれませんが、まずは「マルウェアの動きは巧妙である」という大まかな実態を掴んでいただけれと思います。その上で、次のセキュリティ対策へと一歩踏み出しましょう。
次回はEDRの仕組みや、EDRでさえも捉えきれない攻撃がある、という点を改めてレッドチーム視点で見ていきます。
執筆者
