Rustで作成されたバイナリのリバースエンジニアリング調査レポートの公開
Rustは、CやC++を代替する言語として期待されている言語であり、メモリ安全性や高速性に優れていることから近年注目されています。 Rustがプログラミング言語として普及していく反面、SysJokerのRust亜種やBlackCatランサムウェアなどRustを用いて開発されたマルウェア(以下、「Rustマルウェア」という。)が近年増加傾向にあります。 しかしながら、Rustマルウェアに対するリバースエンジニアリング手法に関する知見は、古典的なC・C++マルウェアのリバースエンジニアリング手法と比較して十分ではありません。 そのため、JPCERT/CCでは、Rustで作成されたバイナリ(以下、「Rustバイナリ」という。)に対するリバースエンジニアリングに関して検証した結果をまとめた「Rustで作成されたバイナリのリバースエンジニアリング調査レポート」を本日公開しました。
Rustで作成されたバイナリのリバースエンジニアリング調査レポート
今回はこのレポートについて紹介したいと思います。
レポートの内容
本レポートは、Rustバイナリのリバースエンジニアリングに関する調査項目を選定し、調査・検証を行った結果をまとめたものです。 レポートの詳細な調査項目については Appendix Aをご覧ください。 また、本調査で使用したツールのバージョンは以下のとおりです。 加えて、バイナリのコンパイルは Windows MSVC環境を使用して調査・検証を実施しました。
cargo: 1.82.0
rustc: 1.82.0
IDA Pro v8.3.230608
活用イメージ
本レポートは、調査項目ごとに独立しているため、全体を通読するのではなく、気になる調査項目のみを参照できます。 一部の調査項目にはサンプルプログラムも記載しています。 そのため、関心のある項目を確認した上で、サンプルプログラムを実際にコンパイルし、レポートとあわせてRustバイナリを確認することを推奨します。
おわりに
Rustは急速に普及している言語であり、リバースエンジニアリングが比較的困難とされることから、攻撃者による悪用が増加すると考えられます。 本レポートがRustマルウェアのリバースエンジニアリングに少しでも役立てば幸いです。 記載内容に不備やご意見がございましたら、ぜひお寄せください。
インシデントレスポンスグループ 亀井 智矢
Appendix A: 調査項目
No. | 項番 | 概要 |
1 | CargoのProfile設定の変更に伴うバイナリの差分 | 公開情報から得られるcargoを用いたバイナリサイズ削減手法が、どの程度サイズ削減可能なのか、残留する情報はどのようなものか調査 |
2 | バイナリサイズ削減 | 公開情報から得られるrustcを用いたバイナリサイズ削減手法が、どの程度サイズ削減可能なのか、残留する情報はどのようなものか調査 |
3 | Rustバイナリの識別 | Rustからコンパイルされたバイナリか否かを識別する方法の調査 |
4 | Exception Directory | Exception Directoryの構造から得られる情報の調査 |
5 | TLS Directory | TLS Directoryの構造とTLS Callbackの内容から得られる情報の調査 |
6 | main関数の特定と初期化処理 | ユーザー定義のmain関数の特定方法 |
7 | 文字列 | 文字列の取り扱い方法 |
8 | 関数名のマングリング | マングリングされた関数名の構造およびデマングリング方法 |
9 | クロージャ | クロージャの動作や使用されるメモリレイアウト |
10 | 列挙型 | Rustにおける列挙型の動作がアセンブリにてどのように実装されるかの調査 |
11 | match文 | Rustにおけるmatch文の動作がアセンブリにてどのように実装されるかの調査 |
12 | Panic文 | パニック時の挙動であるunwindとabortのアセンブリの差分 |
13 | イテレータ | イテレータやnext関数を使用したコードがアセンブリにてどのように実装されるかの調査 |
14 | トレイト | トレイトを実装した関数呼び出しと通常の関数呼び出しとの差異 |
15 | 代表的なトレイトの識別 | #\[derive\]属性で用いられるトレイトのアセンブリ上で識別方法 |
16 | 動的ディスパッチ参照 | アセンブリの特徴および動的/静的ディスパッチを用いた呼び出しの差異 |
17 | コレクション | 使用されるメモリレイアウト |
18 | 同一ジェネリクスから生成された関数の識別 | 生成元となった関数を特定方法の調査 |
19 | スマートポインター | スマートポインターの特徴やメモリレイアウト |
20 | インラインアセンブリ | 特徴的なコードパターン |
21 | link属性 | ライブラリのリンク方法の差異 |
22 | repr属性 | 指定可能なオプションにおいてメモリレイアウトがどのように変化するかの調査 |
23 | 標準・サードパーティライブラリの判別方法 | 静的リンクされた標準ライブラリ・サードパーティライブラリ関数の識別の方法 |