本サイトは、快適にご利用いただくためにクッキー(Cookie)を使用しております。
Cookieの使用に同意いただける場合は「同意する」ボタンを押してください。
なお本サイトのCookie使用については、「個人情報保護方針」をご覧ください。
弊社マルウェア解析チームでは日々多くのランサムウェアを収集・分析していますが、今年9月上旬に確認された「HkCrypt」と呼ばれるランサムウェアが複数のUAC回避テクニックを使用し権限昇格を実現していることを確認しました。
■表面上は一般的なランサムウェアと変わらない「HkCrypt」
「HkCrypt」は、英語、トルコ語、イタリア語、スペイン語の4か国語の脅迫メッセージを用意しており、感染すると最終的に、端末内の暗号化対象となるファイルに「.hacked」という拡張子を付け暗号化した上で、以下のような壁紙と画面を表示します。
図1 「HkCrypt」が表示する画面(GUI)
図2 「HkCrypt」が変更する壁紙
図3 「HkCrypt」に含まれる4か国語のテキストファイル
一見これらの挙動を見る限り、一般的なランサムウェアと変わりがないように見受けられます。
しかし、我々が挙動を詳しく追っていた最中、調査時点(2017/10/6)で最新状態であるWindows10の環境において、UACの警告を表示することなく管理者権限へ権限昇格を行っていることに気が付きました。見た目には大きな変化は現れないため、気づきにくいですが、下記の図を見る通り「HkCrypt」を起動して間もなく、「HkCrypt」のプロセスの(プロセス調査ツール:ProcessHackerにおける)Elevationの項目欄がLimitedからFullに変化していることがわかります。つまりここから、「HkCrypt」は何らかの手法でUACを回避していることがうかがい知れます。
図4 起動後間もなく権限が昇格している様子
■UAC回避の仕組み
その後の調査の結果、「HkCrypt」が実装していたUACバイパスの手法は、今年になり海外のウイルス対策ソフトウェアベンダーのセキュリティ情報サイトで言及(※)されたUACバイパスの手法と同一であることが判明しました。
(※参考:Fileless UAC Bypass Uses Windows Backup and Restore Utility / https://threatpost.com/fileless-uac-bypass-uses-windows-backup-and-restore-utility/124579/)
これは、WindowsOSにデフォルトで存在するいくつかのMicrosoft社製の正規プログラムにおいて、一般的にはUACが必要となるような権限昇格時にユーザーに確認することなく権限昇格(自動昇格)を行うことが可能な設定がなされており(後述のマニフェストと呼ばれる設定ファイルがEXEファイルに埋め込まれている)、そうしたいくつかの正規プログラムの挙動の仕様を悪用し権限昇格をおこなう手法です。
すでにGitHubやインターネット上ではいくらかのUAC回避テクニックが公開されており、「HkCrypt」は感染環境のWindowsOSのバージョンによって、既知のそうしたUACの回避テクニックを巧妙に使い分けていることがわかりました。
「HkCrypt」が利用するUAC回避テクニックはOSごとに以下のようにわけられます。
- Windows95~XPの場合:(UACが存在しないためUAC回避は不要)
- Windows Vista、7の場合:「イベントビューワ」(eventvwr.exe)を利用したUAC回避手法
- Windows 8~10の場合:「バックアップと復元」(sdclt.exe)を利用したUAC回避手法
以下は、感染環境のWindowsバージョンによって挙動を変化させる「HkCrypt」の該当コード部分ですが、Windows95からWindows10まで細かく考慮されていることがわかります。
図5 感染環境のWindowsバージョンによって挙動を変化させる「HkCrypt」
それでは「HkCrypt」は「eventvwr.exe」と「sdclt.exe」をどのように使い分けてUACを回避しているのか、それぞれについて見ていきます。
■eventvwr.exeを利用したUAC回避手法
「HkCrypt」は感染環境がWindowsVistaまたは7の場合、「eventvwr.exe」を利用してUACを回避します。
「eventvwr.exe」はイベントビューワの本体であり、Windowsにデフォルトで存在する自動昇格が有効な正規プログラムです。以下は「eventvwr.exe」のバイナリのマニフェスト部分を表示した様子ですが、「requestedExecutionLevel」に「highestAvailable」(使用可能な最高アクセス許可レベル)が設定されており、「autoElevate」(自動昇格)が「true」に設定されていることがわかります。
図6 「eventvwr.exe」のマニフェスト部分(テキストエディタで表示)
「eventvwr.exe」は実行されると、以下図のレジストリパスにある規定値を参照し実行する挙動があります。この値には図の通り本来特定の値がデフォルトで存在します。
図7 eventvwr.exeが実行時に参照するレジストリ値
上記レジストリ値の値を参照する際、自動昇格した状態で行うため、この既定値を任意のプログラムパスに書き換えられると、既定値に登録されたプログラムを管理者権限で実行してしまいます。ここで重要な点は、(管理者権限で実行されるパスが格納されている)上記レジストリ値が、管理者権限を必要とせずに書き換えられる場所であることです。( HKCRというハイブは、実際はHKLM\Software \ Classes とHKCU\Software \ Classesの組み合わせであり、HKCRは結果的に管理者権限を必要とせずに書き込みが可能となります)
つまり、「HkCrypt」が「eventvwr.exe」を悪用する手順は以下となります。
1)「HkCrypt」は実行されると感染環境がWindows Vistaまたは7である場合、上記のレジストリの既定値を自身のパスに一時的に書き換えます。
2)次に、「HkCrypt」は「eventvwr.exe」を実行し、管理者権限でない自身のプロセスを終了させます。
3)その後、自動昇格した「eventvwr.exe」により「HkCrypt」がUACを表示することなく管理者権限で起動します。
4)管理者権限となった「HkCrypt」は一時的に変更した上記のレジストリを元のレジストリ値に戻すことで証拠を隠蔽します。
以下は、レジストリ値を変更する挙動に該当する「HkCrypt」のコードです。
図8 レジストリ値を変更する挙動に該当するコード部分
以下は、自身のパスをレジストリ値として登録する様子を実際にデバッガで動作させて確認した様子です。
図9 レジストリ値に自身のパスを設定する挙動(デバッガで確認)
■sdclt.exeを利用したUAC回避手法
「HkCrypt」は感染環境がWindows8~10の場合、「sdclt.exe」を利用してUACを回避します。
「sdclt.exe」は「バックアップと復元」機能の本体であり、Windowsにデフォルトで存在する自動昇格が有効な正規プログラムです。以下は「sdclt.exe」のバイナリのマニフェスト部分を表示した様子ですが、「requestedExecutionLevel」に「requireAdministrator」(管理者権限のアクセス許可レベル)が設定されており、「autoElevate」(自動昇格)が「true」に設定されていることがわかります。
図10 「sdclt.exe」のマニフェスト部分(テキストエディタで表示)
「sdclt.exe」は実行されると、以下のレジストリパスにある規定値を参照し実行する挙動がありますが、この値には通常では値が存在しません。
HKCU\Software\Microsoft\Windows\CurrentVersion\App Paths\control.exe
「sdclt.exe」は上記レジストリ値の値を参照する際、自動昇格した状態で行うため、この既定値に任意のプログラムパスを設定されると、既定値に登録されたプログラムを管理者権限で実行してしまいます。なお、イベントビューワと同様に、上記既定値も管理者権限を必要とせずに変更可能な範囲に存在するレジストリ値です。
つまり、「HkCrypt」が「sdclt.exe」を悪用する手順は以下となります。
1)「HkCrypt」は実行されると感染環境がWindows8~10である場合、上記のレジストリの既定値に自身のパスを設定します。
2)次に、「HkCrypt」は「sdclt.exe」を実行し、管理者権限でない自身のプロセスを終了させます。
3)その後、自動昇格した「sdclt.exe」により「HkCrypt」がUACを表示することなく管理者権限で起動します。
4)管理者権限となった「HkCrypt」は一時的に変更した上記のレジストリを元のレジストリ値に戻すことで証拠を隠蔽します。
以下は、「HkCrypt」が該当レジストリの既定値に自身のパスを設定し、「sdclt.exe」を実行するまでの挙動に関するコード部分です。
図11 「HkCrypt」が自身のパスを設定し「sdclt.exe」を実行するコード部分
以下は「HkCrypt」を実際に動作させ、ProcMonによりレジストリ値の設定が行われていることを確認した様子です。
図12 「HkCrypt」がレジストリ値に自身のパスを設定する挙動確認の様子
■その他
解析の結果、「HkCrypt」はランサムウェアとしてはめずらしくDelphiで開発されており、Web上でかなり以前から公開されているDelphi用のAntiDebugコードをそのまま流用していることがわかりました。
また、2005年前後に開発されたDelphi開発環境におけるメモリ分析に関わる拡張ソフトウェアを開発環境で利用していることもわかりました。WindowsのOSのバージョンチェックをWindows95から考慮している点なども総合的に加味すると、「HkCrypt」の開発者はそれなりに経歴の長い開発経験を持っている背景がうかがい知れます。
図13 Delphi用のAntiDebugコードの比較
※本記事における検体のハッシュ値は以下となります。
SHA256: ed5653170b8a8b65e9d3e6ba355a4ffd76903c84cb0dbd63e7700e4ce9dc0651
おすすめ記事