ELFマルウェアの静的分析におけるYaraルールを活用したF.L.I.R.Tシグネチャ作成手法
ELFマルウェアはそのマルウェアのビルド時に、シンボル情報を削除していることが見受けられます。これにより、マルウェア分析の際、関数の名前がわからないため、各関数名を特定する作業が生じます。また、分析ツールのIDAにおいて、既存のF.L.I.R.Tシグネチャ[1](以降本記事ではFLIRTシグネチャと省略)はELFマルウェアの関数に適用されないことも多く、適切なシグネチャが見つからない場合、分析が困難であるという問題があります。
今回は、この問題について、Yaraルールを使用することで関数名を明らかにする手法について解説します。なお、本手法に用いるYaraルールを自動生成するIDAスクリプト「AutoYara4FLIRT」の使い方についても紹介します。本ツールはGitHub上で公開していますので、次のWebページからダウンロードしてご利用ください。
JPCERTCC/AutoYara4FLIRT - GitHub
https://github.com/JPCERTCC/AutoYara4FLIRT
ELFマルウェアの静的分析における問題点
Linuxプログラムのビルド時には図1のように各ライブラリをリンクし、一つのELFバイナリが生成されますが、関数名などの情報は一般的に .symtab や .strtab などのセクションに格納されます。ELFマルウェアの場合、ビルド時にstripオプションなどを使用することで本セクションを削除しているものが見受けられます。ELFマルウェアにおいてライブラリが静的リンクされている場合、シンボルが削除されてしまうと、静的リンクされた各ライブラリについても関数名がわからなくなるため、分析に多くの時間がかかってしまう点が問題としてあります。
適切なFLIRTシグネチャを見つけにくい問題
FLIRTシグネチャとは、分析ツールのIDAが既存のライブラリの識別および関数の命名を自動で行う機能のことです。FLIRTシグネチャがない場合、マルウェア分析者は図2のような複雑な関数に遭遇した際、その関数の挙動を理解するのに苦労しますが、本関数が memcpy とわかると分析する必要はありません。あらかじめ、この memcpy の関数を含んだFLIRTシグネチャを保有している場合、IDAによって関数名が memcpy と特定されるため、分析業務が省力化されます。
このFLIRTシグネチャは、IDAがデフォルトで準備しているものはほとんどの場合、マッチしません。そのため、適切なFLIRTシグネチャを見つける、または作成しないといけないという問題があります。ただし、FLIRTシグネチャはコンパイル条件やライブラリのバージョンが異なるだけで、マッチしなくなるため、適切なFLIRTシグネチャを見つける作業は非常に困難です。図3に示す従来のFLIRTシグネチャ作成方法では、ライブラリとそのバージョンの違い、コンパイラのバージョンの違い、コンパイル条件の違いが生成されるELFバイナリへ影響します。そのため、さまざまな条件におけるFLIRTシグネチャを持っていないと、適切なFLIRTシグネチャが見つかりにくいということになります。
Yaraルールを活用したFLIRTシグネチャ作成手法
本手法の概要を図4に示します。始めに分析対象のELFマルウェアからYaraルールを作成します。ここで作成するYaraルールにはシンボル情報が残っているELFバイナリを検索できるようなルールとします。次に、作成されたYaraルールを用いてVirus TotalにてRetrohunt[2]を行い、取得したELFバイナリからFLIRTシグネチャ(.sig)を作成します。生成されたFLIRTシグネチャはELFマルウェアを基にRetrohuntしたファイルから作成されているため、対象のELFマルウェアに対してFLIRTシグネチャがマッチしやすいという利点があります。
なお、シンボル情報が残っているELFバイナリを検索するには、次のような条件をYaraルールに加える必要があります。
import "elf" rule Template{ condition: for 2 i in (0 .. elf.number_of_sections) : ( ((elf.sections[i].name == ".symtab") and (elf.sections[i].type == elf.SHT_SYMTAB)) or ((elf.sections[i].name == ".strtab") and (elf.sections[i].type == elf.SHT_STRTAB)) ) and not ( for 1 i in (0 .. elf.number_of_sections) : ( ((elf.sections[i].name == ".dynamic") and (elf.sections[i].type == elf.SHT_DYNAMIC)) ) ) }
検証結果
x86とARMにおける各50個のELFマルウェアについて本手法適用させ、作成したFLIRTシグネチャによって各関数名を解決しました。結果としてx86のELFマルウェアでは平均すると約6割、ARMのELFマルウェアでは平均すると約3割の関数に対して適用するFLIRTシグネチャを作成可能なことがわかりました。x86のELFマルウェアでは、一部例外的に本手法では対応が難しくなる検体があることが分かりましたが、多くの検体が6割マッチしており、中には9割以上マッチしている検体もありました。一方、ARMのELFマルウェアでは、x86と比較するとマッチ率が低く、今後本手法を改善していく必要があることが分かりました。結果の詳細についてはAppendixの表1、表2をご参照ください。なお、ターゲット検体の全関数の数を Total functions とし、RetrohuntしたELFバイナリから作成したFLIRTシグネチャがマッチした関数の数を Matched functions としています。
検体の選定についてですが、各50検体のマルウェアはMalwareBazaar[3]に2022年11月時点で直近にアップロードされているELFマルウェア300検体を取得し、その中から該当するアーキテクチャのx86とARMに該当する50検体を使用しているため、マルウェアの種別を考慮していませんが、mirai、gafgyt、TSCookie、 Coinminer等の複数の種類のマルウェアを対象として評価を行っています。また、目的のライブラリを含んだELFバイナリがVirus Totalにアップロードされているか否かによっても結果が異なるため、これらの結果はあくまで参考値としてご参照ください。
FLIRTシグネチャ作成用のYaraルール自動生成ツール「AutoYara4FLIRT」
本手法ではELFマルウェアからYaraルールを作成する必要がありますが、「AutoYara4FLIRT」はそのYaraルールを自動生成するツールです。AutoYara4FLIRTは、分析ツールであるIDAのプラグインとして作成しています。AutoYara4FLIRTの使い方はIDAのプラグインフォルダーにAutoYara4FLIRT.pyを移動させ、IDAのプラグインメニューからAutoYara4FLIRTを選択することで実行が可能です。実行後、同一フォルダー上にYaraファイルが生成され、そのYaraファイルの結果をIDA上から確認することができます。AutoYara4FLIRTの実行例を図5に示します。
通常、Yaraルールの作成には、マルウェアに含まれている文字列や逆アセンブラ命令列を読み解きながら作成する必要があります。AutoYara4FLIRTはYaraルール作成に必要な逆アセンブラ命令列を使用してYaraルールを自動生成します。なお、抽出する逆アセンブラ命令列は、静的リンクされている複数のライブラリを対象とするため、複数のブロックに分けた中から抽出しており、コンパイラ条件等の違いを捉えるため、その中で最も長い命令列から使用しています。生成されたYaraルールを用いてRetrohuntすることで、シンボル情報が残ったELFバイナリを検索することができ、FLIRTシグネチャ作成時の負担が軽減されます。
複数のマルウェアに対して本手法を実行するCLI自動化ツール
本手法を複数のマルウェア対して行う場合、次のCLIツールを使用することでコマンドライン上で一度にYaraルールを自動生成することができます。また、YaraルールをもとにRetrohuntした複数のELFバイナリに対して、一度にFLIRTシグネチャ(.sig)を生成することが可能です。詳しくは次のリンクをご参照ください。
JPCERTCC/AutoYara4FLIRT#CLI_AutoYara - GitHub
https://github.com/JPCERTCC/AutoYara4FLIRT#CLI_AutoYara
Virus Total以外のサービスを利用する場合
本手法にはRetrohuntの利用を前提としており、Virus Totalの有償アカウントが必要になりますが、次のサービスを利用することで、Yaraルールによるファイルの検索を無料で行うこともできます。
- tria.ge yara
https://tria.ge/company/yara - Hybrid Analysis Advanced Search (YARA)
https://www.hybrid-analysis.com/yara-search - MalwareBazaar Hunting
https://bazaar.abuse.ch/hunting/
おわりに
本手法を活用することで、既存のFLIRTシグネチャが適用されずに静的分析が難しかったELFマルウェアに対しても、FLIRTシグネチャを作成し、分析が容易になる可能性があります。また、本手法の対象はx86、ARMだけでなく、x86-64やMIPSといったELFマルウェアについても使用可能なため、これまで分析が難しかったさまざまなELFマルウェアに試してみることをお勧めします。
インシデントレスポンスグループ 増渕 維摩
参考情報
[1] F.L.I.R.T
https://hex-rays.com/products/ida/tech/flirt/
[2] Retrohunt
https://support.virustotal.com/hc/en-us/articles/360001293377-Retrohunt
[3] MalwareBazaar
https://bazaar.abuse.ch/
Appendix
No | Matched functions / Total functions (x86) | Match ratio (x86) [%] |
---|---|---|
1 | 82 / 141 | 58.2 |
2 | 193 / 3267 | 5.9 |
3 | 87 / 152 | 57.2 |
4 | 79 / 138 | 57.2 |
5 | 87 / 145 | 60.0 |
6 | 84 / 148 | 56.8 |
7 | 93 / 201 | 46.3 |
8 | 168 / 273 | 61.5 |
9 | 85 / 153 | 55.6 |
10 | 82 / 155 | 52.9 |
11 | 83 / 147 | 56.5 |
12 | 1 / 183 | 0.5 |
13 | 923 / 1006 | 91.7 |
14 | 87 / 146 | 59.6 |
15 | 85 / 153 | 55.6 |
16 | 93 / 176 | 52.8 |
17 | 83 / 149 | 55.7 |
18 | 83 / 149 | 55.7 |
19 | 1 / 161 | 0.6 |
20 | 96 / 175 | 54.9 |
21 | 1 / 162 | 0.6 |
22 | 82 / 147 | 55.8 |
23 | 1 / 163 | 0.6 |
24 | 86 / 157 | 54.8 |
25 | 95 / 154 | 61.7 |
26 | 93 / 205 | 45.4 |
27 | 132 / 204 | 64.7 |
28 | 89 / 152 | 58.6 |
29 | 85 / 153 | 55.6 |
30 | 83 / 159 | 52.2 |
31 | 82 / 151 | 54.3 |
32 | 87 / 146 | 59.6 |
33 | 84 / 145 | 57.9 |
34 | 96 / 161 | 59.6 |
35 | 81 / 142 | 57.0 |
36 | 129 / 197 | 65.5 |
37 | 82 / 147 | 55.8 |
38 | 85 / 151 | 56.3 |
39 | 128 / 214 | 59.8 |
40 | 136 / 214 | 63.6 |
41 | 1 / 162 | 0.6 |
42 | 168 / 271 | 62.0 |
43 | 82 / 139 | 59.0 |
44 | 128 / 207 | 61.8 |
45 | 84 / 142 | 59.2 |
46 | 78 / 148 | 52.7 |
47 | 133 / 204 | 65.2 |
48 | 1010 / 1342 | 75.3 |
49 | 1009 / 1336 | 75.5 |
50 | 1010 / 1336 | 75.6 |
- | Average | 62.5 |
No | Matched functions / Total functions (ARM) | Match ratio (ARM) [%] |
---|---|---|
1 | 78 / 196 | 39.8 |
2 | 70 / 223 | 31.4 |
3 | 35 / 186 | 18.8 |
4 | 103 / 299 | 34.4 |
5 | 121 / 266 | 45.5 |
6 | 38 / 170 | 22.4 |
7 | 26 / 153 | 17.0 |
8 | 70 / 186 | 37.6 |
9 | 31 / 158 | 19.6 |
10 | 75 / 237 | 31.6 |
11 | 26 / 156 | 16.7 |
12 | 75 / 236 | 31.8 |
13 | 56 / 253 | 22.1 |
14 | 76 / 236 | 32.2 |
15 | 55 / 255 | 21.6 |
16 | 106 / 252 | 42.1 |
17 | 31 / 163 | 19.0 |
18 | 68 / 192 | 35.4 |
19 | 79 / 225 | 35.1 |
20 | 26 / 153 | 17.0 |
21 | 31 / 163 | 19.0 |
22 | 70 / 233 | 30.0 |
23 | 74 / 237 | 31.2 |
24 | 69 / 190 | 36.3 |
25 | 47 / 272 | 17.3 |
26 | 77 / 200 | 38.5 |
27 | 75 / 200 | 37.5 |
28 | 50 / 211 | 23.7 |
29 | 32 / 160 | 20.0 |
30 | 111 / 264 | 42.0 |
31 | 76 / 209 | 36.4 |
32 | 31 / 163 | 19.0 |
33 | 152 / 255 | 59.6 |
34 | 33 / 180 | 18.3 |
35 | 70 / 282 | 24.8 |
36 | 31 / 170 | 18.2 |
37 | 28 / 145 | 19.3 |
38 | 31 / 159 | 19.5 |
39 | 36 / 171 | 21.1 |
40 | 97 / 244 | 39.8 |
41 | 27 / 154 | 17.5 |
42 | 78 / 207 | 37.7 |
43 | 71 / 280 | 25.4 |
44 | 73 / 196 | 37.2 |
45 | 72 / 194 | 37.1 |
46 | 36 / 171 | 21.1 |
47 | 73 / 196 | 37.2 |
48 | 31 / 163 | 19.0 |
49 | 76 / 275 | 27.6 |
50 | 31 / 159 | 19.5 |
- | Average | 28.4 |