Beep

ほぼこもセキュリティニュース By Terilogy Worx

Beepはいわゆるビープ音のbeepです。
それをイメージさせる機構を持つマルウェアです。
それぞれのマルウェアにはいろいろな特徴がありますが、このBeepは回避機構を多く搭載しているという特徴があります。
どういった機構を搭載しているのでしょうか。

  • 多段感染
    最近のマルウェアの多くがとる手法と同じく、Beepも多段のステップを経て感染します。
    その途中段階で、レジストリキーに値を書き込み、その値として感染活動の途中段階で使用するPowerShellを書き込むようなことも実施します。

     

  • Process Hollowing
    攻撃者は標的システムにおいて、休止状態のプロセスを新たに作成します。
    この休止プロセスのメモリを開放し、空いた領域に悪意のあるコードを挿入します。
    悪意のあるコードを埋め込まれたプロセス自体は開始時には通常のプロセスだったため、攻撃検知が難しくなるという手法です。
    この手法も使用します。
    また生成したプロセスの親プロセスにはexplorer.exeを設定します。
    これも怪しさが減る工夫の一つと考えられます。

     

  • 感染環境の情報の送信
    感染環境でユーザ名などのいくつかの感染環境の情報を収集しC2に送信します。
    現時点では特別な効能は想定できませんが、将来的にはこの機能もなんらかの回避機構として使用される可能性があります。

     

  • Dynamic string deobfuscation
    動的文字列解読です。
    転送段階ではそのままでは意味をなさない16進数のデータですが、これをxor/sub/add/notアセンブリ命令を使用することで復号化し使用可能な状態に変換します。

     

  • デフォルト言語チェック
    動作環境の標準言語をチェックします。
    ロシア語、ウクライナ語などかどうかをチェックし、その後の処理の継続を判断します。

     

  • IsDebuggerPresent API
    プロセス環境ブロックのBeingDebuggedフラグをチェックします。
    これがtrueの場合、対象のプロセスがユーザーモードデバッガーによってデバッグされていることが判定できます。
    ちなみにプロセス環境ブロックはカーネルの中にあるプロセスの状態を記録している領域です。
    プロセスの状態を把握できる台帳のようなものです。

     

  • NtGlobalFlag
    このフラグを見ることで、プロセスがデバッガーによって作成されたかを判定できます。

     

  • RDTSC instruction
    RDTSCはread time stamp counterです。
    実行した瞬間の時刻カウンターの値を返す命令です。
    これをマルウェアの実行のなかで複数回実行し、その間隔が十分に短い時間以下であるかを確認します。
    もし研究者がステップ実行などを実行している場合、この間隔は長くなります。この機構をアンチデバッグとして利用します。
    この機能は値を戻す際にレジスタを使用するため、VM環境であるかの判定にも使用できます。

     

  • スタックセグメントレジスタ
    プログラムがトレースされているかどうかを検出できます。
    デバッガーでステップ実行している場合、これを読むことで判定できます。

     

  • CPUID
    CPUIDを読み取って判定します。
    たとえば戻ってくる値にVMwareなどの文字列が含まれていないかを判定します。

     

  • VBOXレジストリキー
    VirtualBox環境の場合、特定のレジストリキーが設定されます。
    「HKLM\HARDWARE\ACPI\DSDT\VBOX__」というキーです。
    これが存在するかどうかを見ることでVM環境であることを判定します。

     

  • Beep API
    名前の由来にもなっている機能です。
    Beepはスピーカーで警告音を発します。この機能は同期的機能のため音の再生が終了するまで呼び出し元のプロセスは待機させられます。
    似た効能を期待して他のマルウェアではSleep命令が利用されることもあります。

     

  • INT 3 アセンブリ命令
    デバッガーが存在するかを判定できます。

     

  • INT 2D アセンブリ命令
    デバッガーが存在するかを判定できます。

     

  • CheckRemoteDebuggerPresent() API
    デバッガーが接続しているかを判定できます。

     

  • IsDebuggerPresent() API
    ユーザー モード デバッガーによってデバッグされているかを判定できます。

     

  • ProcessDebugPort
    デバッガーのポート番号を読み出します。
    デバッグされていることを判定できます。

     

  • VirtualAlloc() / GetWriteWatch()
    デバッガーを使用しているかを判定できます。

     

  • OutputDebugString()
    デバッガーの使用を検出できます。

     

  • QueryPerformanceCounter() / GetTickCount64()
    前述のRDTSC instructionの使用と同じ効能を実施します。

実装された回避手法が多すぎます。
回避手法を実装したマルウェアは多く観測されていますが、ここまで多数の回避機構を実装した例はあまりないのではないでしょうか。

ここまで周到に環境を確認しマルウェアの動作を継続するとなった場合、BeepはDLLを実行することもできますしexeを実行することもできます。
Beepには実装中の機能もいくつか存在することが確認されています。
Beepはまだ開発段階で今後も拡張されていくということが考えられます。
こういったマルウェアが出てしまうと同じ機構を持つものが他にも出てきてしまうかもしれません。

参考記事(外部リンク):Beepin’ Out of the Sandbox: Analyzing a New, Extremely
Evasive Malware

minerva-labs.com/blog/beepin-out-of-the-sandbox-analyzing-a-new-extremely-evasive-malware/