- 筆者は Akira ランサムウェアに感染した企業のデータを、身代金を支払わずに復旧することに成功した
- 復旧過程で使用したソースコードは GitHub で公開されている
- Akira ランサムウェアにはさまざまな亜種が存在し、これは 2023 年後半から活動している亜種である
- 以前のバージョン(2023 年半ば以前)には Avast が復号ツールを開発できるバグがあったが、この内容が公開された後に攻撃者が暗号化方式を更新した
- ランサムウェアのサンプルハッシュは GitHub で確認できる
Akira ランサムウェア(Linux/ESXI Variant 2024)のファイル復旧方法まとめ
解決アプローチ
初期分析
- ランサムウェアはナノ秒単位の現在時刻をシードとして使用する
- Linux のファイル更新時刻はナノ秒精度を持つため、シード復元の可能性が見つかった
- 変更されたファイルのタイムスタンプを基にブルートフォースを試みた
複雑な暗号化処理
- ランサムウェアは4 つのシード値(ナノ秒単位の時刻)を使用する
- 鍵生成では SHA-256 ハッシュを 1500 回反復処理する
- VMware VMFS ファイルシステムは更新時刻を秒単位でしか保存しない
- マルチスレッドベースの暗号化のため、正確なタイミングの復元が難しい
リバースエンジニアリング
- コードは C++ で書かれており分析は難しかったが、難読化はされていなかった
- エラーメッセージから Nettle ライブラリの使用を確認
- 乱数生成器は Yarrow256 アルゴリズムベースで、次のようなコードを使用している
void generate_random(char *buffer, int size)
{
uint64_t t = get_current_time_nanosecond();
char seed[32];
snprintf(seed, sizeof(seed), "%lld", t);
struct yarrow256_ctx ctx;
yarrow256_init(&ctx, 0, NULL);
yarrow256_seed(&ctx, strlen(seed), seed);
yarrow256_random(&ctx, size, buffer);
}
- 鍵生成時に
generate_random() が 4 回呼ばれる
- chacha8_key(32 バイト)
- chacha8_nonce(16 バイト)
- kcipher2_key(16 バイト)× 2
ブルートフォース可能性の検討
主な戦略
- 2 つのタイムスタンプ(t3, t4)を生成してシードに変換し、その後に乱数を生成
- 乱数を KCipher2 のキーおよび IVとして使って暗号化し、その結果を暗号化済みファイルと比較
性能分析
- 1 億個のタイムスタンプを変換するのに 3 時間かかる(CPU 基準)
- GPU 使用時は変換速度が 6 分未満に短縮
- 1 秒の範囲について可能な組み合わせは約 500 兆個
- GPU 最適化後は RTX 3090 で 1 秒あたり 15 億回の暗号化処理が可能
VMWare ファイルタイプと復旧戦略
FLAT-VMDK
- VMDK の先頭 8 バイトはブートローダから復元できる
- OS 情報を VMX ファイルで確認し、同じ OS のインストールが必要
SESPARSE
- QEMU のソースコードからファイルヘッダのパターンを確認
- ヘッダは
0x00000000cafebabe で始まる
その他のファイル
- NVRAM ファイル、VMX ファイル、ログファイルなどから初期タイムスタンプを確認できる
タイムスタンプ復元
ESXi ログ
- ESXi ログにはミリ秒単位の実行時間が記録される
- ミリ秒単位のログがなければ、秒単位の時刻から推定可能
ファイルシステム更新時刻
- ESXi では秒単位の精度しかないため、正確な時刻推定は難しい
マルチスレッド暗号化
- ファイル暗号化は CPU コア数に応じて並列処理される
- ファイルの更新時刻は暗号化完了時刻に近い
ブルートフォースツールの実装
KCipher2 アルゴリズム
- 標準の KCipher2 ではなく、修正版を使用(エンディアン処理を含む)
- CUDA を使って GPU 最適化を実施
性能改善
- 共有メモリを使って性能を改善
- メモリコピーの削除で高速化
- 並列ファイル処理を実装 → 1 秒あたり約 15 億回処理可能
RTX 3090 vs RTX 4090
- RTX 4090 は約 2.3 倍高速 → 所要時間は 7 日
- RTX 3090 → 約 16 日
復旧手順
1. タイムスタンプの抽出
stat コマンドで更新時刻を確認
- ESXi ログから実行開始時刻を抽出
2. 暗号化データの抽出
- VMDK、SESPARSE などから暗号化されたブロックを抽出
3. サーバ速度の測定
- GitHub の
timing-patch ツールを使用
4. 作業の分割
- 設定ファイルを作成して分割
- GPU で並列実行できるように設定
5. GPU のレンタルと実行
- Runpod → 7 日で約 116 ドルの費用
- Vast.ai → より安価だが、機器の状態によって速度差が出る可能性あり
6. KCipher2 ブルートフォースの実行
./akira-bruteforce run2 config.json
7. Chacha8 ブルートフォースの実行
8. 復号の実行
./decrypt filename.vmdk <t1> <t2> <t3> <t4>
性能結果
- RTX 3090 → 1 秒あたり 15 億回処理
- RTX 4090 → 1 秒あたり 35 億回処理
- RTX 4090 を 16 基使用した場合 → 10 時間以内に復旧可能
復旧可能性と限界
- ランサムウェア復旧の成功確率は 0.1% 未満
- 特定条件を満たす場合に復旧の可能性がある
- ランサムウェアの亜種によって暗号化方式が変わる可能性がある
結論
- ランサムウェアの復旧は非常に難しいが、特定の条件下では成功の可能性がある
- GPU ベースのブルートフォースが中核となる手法
- 筆者は復旧コードをオープンソースで公開したが、追加支援は難しい
追加の参考事項
- GitHub の
README.md を参照
- コードは特定クライアントの状況に合わせて作成されたもので、汎用ツールではない
- 設定ファイル作成、タイミング調整などにはシステム管理者レベルの技術が必要
1件のコメント
Hacker Newsのコメント
誰かがランサムウェアの「限られた寿命」について言及していた。これにより他の被害者には影響がないというコメントは削除したが、それに対する返答を投稿した
なぜタイムスタンプを使うのかという質問があった
この記事は読みやすく、過程への好奇心を満たすのに十分な、ちょうどよい詳細さがあった
アプリケーションがデフォルトでサンドボックス化されていれば、ランサムウェアの問題は減るだろう
「自分のミニPCのCPUで、ランダムバイトに対するタイムスタンプの計算速度を毎秒100,000件と見積もった(全コアを使用して)」
最初の65kをKCipher2で暗号化し、残りを別のもので暗号化する理由が気になる。奇妙に見える
「これを公開した後、攻撃者たちは暗号化方式を再び変更すると予想している」
「自分のインドネシア語ブログでランサムウェアについて書くたびに、多くの人がランサムウェアの助けを求めてくる」