サマリー
- 2025 年第 1 四半期に、ある無名のランサムウェアグループが急速に台頭し、世界的な脅威の状況において最もアクティブで危険な攻撃者の 1 つとなりました。それが SafePay です。MSP(マネージドサービスプロバイダー)や中小規模ビジネス(SMB)など、業界を問わず世界中で200件以上の被害者を出し、静かに、かつ積極的に勢いをつけてきました。
- Acronis 脅威リサーチ部門(TRU)は、SafePayの複数のサンプルを分析し、エンドポイントプロテクションの無効化、シャドウコピーの削除、ログの消去など、リサイクルされた、しかし非常に効率的な手口を使用して、検知と対応を抑制していることを確認しました。
- ランサムウェア・アズ・ア・サービス(RaaS)モデルでアフィリエートに依存する多くのランサムウェアグループとは異なり、SafePayは集中管理で運営し、独自のオペレーション、インフラ、交渉を管理しているようです。
- このグループは、古典的かつ効果的なテクニックを使っています。RDPやVPNを利用した侵入、資格情報の窃取、特権昇格、living-off-the-land(環境寄生型)バイナリなど、被害者のネットワーク内を静かに移動し、機密データを流出させ、ファイルを暗号化します。
- 最近では、膨大な数のパートナーやMSPと取引をしている世界的なディストリビューターIngram Micro社に甚大な被害を与えたランサムウェア攻撃にSafePayが関連していました。
SafePay ランサムウェアはLockbit のスピンオフ?
SafePay は2024 年に初めて確認されました。活動を開始した最初の 1 年間で、20 件を超える被害が発生しています。SafePayが新しいプレイヤーなのか、古いプレイヤーのリブランドなのかは不明ですが、彼らのサンプルはランサムウェアビルダーとして有名なLockBitランサムウェアファミリーと多くの共通点があります。2022 年に、SafePay の LockBit 3.0 ビルダーソースコードが流出しました。その後、さまざまな新しいランサムウェアが出現しました。ビルダーの バージョン3.0 は、BlackByte ランサムウェアと多くの点で類似しているため、LockBit Black とも呼ばれています。
SafePay ランサムウェアのサンプルは、偽装したコンパイルタイムスタンプが付加された PE32 DLL です。


概要
SafePay ランサムウェアのサンプルは、偽装したコンパイルタイムスタンプが付加された PE32 DLL です。LockBit との最初の類似点は、Windows API を何度も連続して呼び出すダミー関数の存在です。このような呼び出し方は、必要な引数が指定されていないため意味をなさず、結果としてエラーが発生します。実際には、サンプルがこのセクションに入る前にプロセスが終了するため、これらの関数が呼び出されることはありません。
LockBit とのその他の類似点
● 完全な実行にはパスワードが必要
● 文字列はすべてエンコードされる
● すべての WinAPI アドレスは実行中に解決される
● 同じ言語のシステムは回避する
● 権限昇格を目的とした CMSTPLUA COM インターフェイスを不正使用する
● 生成されたスレッドには「ThreadHideFromDebugger」フラグが付与されている
● 終了対象の処理とサービスのリストがある
このサンプルは LockBit 3.0 の完全なコピーではなく、相違点がいくつかあります。一般的に、脅威アクターはマルウェアに独自性を加えるために、そしてより重要なことは、新機能を追加し、検出回避機能を強化するためにソースコードを変更します。
配布と流出
SafePay ランサムウェアは、RDP 接続を介して被害者に配布されました。脅威アクターがどのようにして資格情報を入手したかは不明ですが、この手法により Windows Defender を無効にし、ファイルを暗号化する前に C2 サーバーにアップロードしていました。ファイルを窃取する前に、攻撃者はローカルドメイン内で利用可能なすべてのネットワーク共有を検出する「ShareFinder.ps1」スクリプトを実行しています。これはオープンソースプロジェクトから取得されたものです。
このスクリプトは、ローカルドメイン内のホスト上のネットワーク共有を検出します。この手法は、過去に Emotet 攻撃や、Conti ランサムウェアを展開するために使用された C0015 キャンペーンでも確認されています。
システム上のファイルを収集するために、以下のコマンドで WinRar プログラムが使用されました。
WinRAR.exe a -v5g -ed -r -tn1000d -m0 -mt5 -x*.rar -x*.JPEG -x*.RAW -x*.PSD -x*.TIFF -x*.BMP -x*.GIF -x*.JPG -x*.MOV -x*.pst -x*.FIT -x*.FIL -x*.mp4 -x*.avi -x*.mov -x*.mdb -x*.iso -x*.exe -x*.dll -x*.bak -x*.msg -x*.png -x*.zip -x*.ai -x*.7z -x*.DPM -x*.log -x*.dxf -x*.insp -x*.upd -x*.db -x*.dwg -x*.nc1 -x*.metadata -x*.dg -x*.inp -x*.dat -x*.TIFF -x*.tiger -x*.pcp -x*.rvt -x*.rws -x*.nwc -x*.tif -x*.frx -x*.dyf -x*.rcs -x*.diff C:\[redacted].rar \\[redacted]\C$\Users\
ファイルをアーカイブした後、FileZilla クライアントが展開され、C2 サーバーへファイルを流出させました。処理終了後、WinRar と FileZilla の両方が標的から除外されました。

実行
実行開始時に、SafePay は文字列を復号化します。各バイトに対して XOR 演算を 3 回実行するループを使用しています。各演算には異なるキーが使用されています。最初の演算では、現在のインデックス値が使用されます。2 回目の演算では、「kernel32.dll」の最初の文字(常に「M」)が使用されます。最後のキーは定数で、暗号化された文字列ごとに異なります。この復号化処理は、別個の関数として実装されているのではなく、サンプルが含むすべての文字列を復号化するために使用されています。サンプル内の文字列は、すべて暗号化された状態で含まれています。

また、サンプルにインポート関数テーブルは含まれていません。ライブラリ名を復号化し、「LoadLibrary」インポートで読み込み、「GetProcAddress」でエクスポート関数のアドレスを解決して保存します。以下は、SafePay が暗号化された形式で保存するライブラリ名のリストです。
advapi32.dll, rstrtmgr.dll, ole32.dll, shell32.dll, ntdll.dll, mpr.dll, user32.dll
追加インポートを取得した後、SafePay サンプルは、現時点の日付/時刻と Windows UI 言語を取得します。次に、システム言語 ID 番号が保存された値より大きいか小さいかを判定します。その後、サンプルは他の数値比較を行うための特定セクションへジャンプします。

「switch-case」ステートメントを使用して、取得した値が次の数値のいずれかと一致した場合、SafePay は処理を継続するか、終了関数にジャンプします。
次に、SafePay サンプルはコマンドライン引数を取得し、追加の文字列を復号化します。以下の文字列がサポートされている引数です。
引数を解析するために、SafePay サンプルは自身の実行に使用されたコマンドラインを取得し、引数配列として保存します。この配列は、ループ内であらかじめ保存されているリストと比較されます。配列の 1 つの要素が保存されたリストと比較されると、サンプルは配列のインデックス値に「1」を加算します。引数のいずれかが一致した場合、対応する値に「1」を設定します。

一部の引数は単にフラグを設定するだけですが、他の引数には追加情報を含める必要があります。たとえば、パスワード引数は、「-pass=」という部分文字列を含み、38 文字で構成されている必要があります。それ以外の場合、プログラムは終了します。パスワードは 32 バイトである必要があり、コード内の追加情報の復号に使用されます。パスワードが不明な場合、プログラムは処理を開始することができません。

暗号化レベルの引数は、「-enc=」部分文字列を含む 6 文字で構成されている必要があります。この引数には「1」から「9」までの数値を指定できます。この値は 10 倍され、ファイル暗号化率に適用されます。例えば、値「5」を指定すると、サンプルはファイルの 50% を暗号化します。

引数が解析された後、SafePay サンプルは新しいアクセス制御リスト(ACL)を作成し、アクセス拒否のアクセス制御エントリ(ACE)を追加します。このリストは「SetSecurityInfo」関数で使用されます。

次に、サンプルは「SeDebugPrivilege」の取得を試みます。

この権限を取得した後、システム内で実行中のすべてのプロセスのスナップショットを作成します。その後、それらの名前を、やはりエンコード形式で保存されている自身のリストと比較します。該当するプロセスが見つかると、そのプロセスは強制終了されます。
以下は、強制終了の対象となるプロセスのリストです。
sql, oracle, ocssd, dbsnmp, synctime, agntsvc, isqlplussvc, xfssvccon, mydesktopservice, ocautoupds, encsvc, firefox, tbirdconfig, mydesktopqos, ocomm, dbeng50, sqbcoreservice, excel, infopath, msaccess, mspub, far, onenote, outlook, powerpnt, steam, thebat, thunderbird, visio, winword, wordpad, notepad, wuauclt, onedrive, sqlmangr
プロセス以外に、いくつかのサービスも終了させます。まず、サービスマネージャーを開き、自身のリストに一致するサービス名を再び検索します。その後、サンプルは「ControlService」関数と「dwControl」引数に値「1」を指定して、サービスを終了させます。

終了させるサービスのリスト
vss, sqlsvc, memtas, mepocs, msexchange, Sophos, Veeam, backup, GxVss, GxBlr, GxFWD, GxCVD, GxCIMgr
「SHEmptyRecycleBinW」関数を使用してごみ箱を空にした後、サンプルは「Software\Microsoft\Windows\CurrentVersion\Run」レジストリパスを読み込み、サンプル実行に使用された、すべての引数を含むコマンドで新しいキーを作成します。これにより、Windows が起動するたびに SafePay が実行されるようになります。
「-uac」フラグが渡された場合、サンプルは CMSTPLUA COM インターフェイスを悪用し、「ShellExecuteW」API 関数を使用して、昇格した権限でコマンドを実行します。
/c vssadmin delete shadows /all /quiet
/c wmic shadowcopy delete
/c bcdedit / set{default} bootstatuspolicy ignoreallfailures
/c bcdedit / set{default} recoveryenabled no
「-log」引数が指定された場合、サンプルは「C:\ProgramData\auto.log」というログファイルを作成します。PID (プロセス ID)、実行時間、実行された操作の説明が記録されています。
ファイルの暗号化
暗号化処理を開始する前に、SafePay サンプルは RSA_AES タイプのシステム既定の暗号化サービスプロバイダーへのハンドルを開きます。

各暗号化スレッドは、サスペンドモードで作成されます。スレッドを作成した後、サンプルはデバッグによる検知を回避するために、スレッドに「ThreadHideFromDebugger」フラグを立て、あらかじめ複製しておいたトークン情報をセットします。
システム上のドライブを見つけるために、このサンプルは「GetVolumePathNamesForVolumeNameW」と「GetLogicalDrives」インポートを使用しています。各ドライブのタイプが確認されます。SafePay サンプルでは、タイプが 2(DRIVE_REMOVABLE) または 3(DRIVE_FIXED)のドライブだけを暗号化します。追加のディスク情報は、制御コード「IOCTL_DISK_GET_PARTITION_INFO」を指定して、「DeviceIoControl」を使用することで取得されます。アンマウントされているドライブを検出した場合、サンプルは「SetVolumeMountPoint」関数を使って、そのドライブをマウントします。

システム上のファイルを検索するために、サンプルは見つかったドライブ名を読み込み、「FindFirstFile」および「FindNextFile」関数を使用します。各ファイルに対して、「dwFileAttributes」パラメータを確認します。パラメータがディレクトリを示す 16 と一致した場合、見つかったフォルダーパスで同じ関数を呼び出します。

サンプルは 「CreateFileW」を使用してファイルを開くと、「dwFlagsAndAttributes」の値を「0x04000000」に設定します。これは「FILE_FLAG_DELETE_ON_CLOSE」フラグです。その後、サンプルはハンドルを閉じた直後に、開いたファイルを削除します。

サンプルは、各ファイルに対して 32 バイトのランダムバイトを生成し、それを AES キーとして使用します。その後、AES キーは RSA アルゴリズムを使って暗号化されます。

ディレクトリ内の各ファイルを暗号化した後、サンプルは「CreateIOCompletionPort」と「PostQueuedCompletionStatus」API を使用して、マルチスレッドの暗号化処理を確実に制御します。最後に、サンプルはファイル名を変更し、「.safepay」拡張子を付加します。

結論
SafePay ランサムウェアは、被害者に身代金を支払わせるために二重脅迫の手法を用いています。攻撃者は、まずファイルを流出させ、マルウェアを展開し、AES と RSA を組み合わせた強力な暗号化方式でユーザーのファイルを暗号化します。SafePay サンプルは DLL ファイルであり、実行するには「regsvr32.exe」または「rundll32.dll」ユーティリティが必要になります。このサンプルは複数の引数を受け入れますが、「-pass=」引数は必須です。このパスワードは、コード中の追加情報をデコードするために使用されます。保存されたすべての文字列とインポート名は、暗号化された形式で格納されているため、SafePay が実行される前に検出することは困難です。
アクロニスによる検出

IoC
ファイル
SHA256
a0dc80a37eb7e2716c02a94adc8df9baedec192a77bde31669faed228d9ff526