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マルウェアにおいてライブラリが静的リンクされている場合、シンボルが削除されてしまうと、静的リンクされた各ライブラリについても関数名がわからなくなるため、分析に多くの時間がかかってしまう点が問題としてあります。

図1: ELFバイナリにおける静的リンクとシンボル情報

適切なFLIRTシグネチャを見つけにくい問題

FLIRTシグネチャとは、分析ツールのIDAが既存のライブラリの識別および関数の命名を自動で行う機能のことです。FLIRTシグネチャがない場合、マルウェア分析者は図2のような複雑な関数に遭遇した際、その関数の挙動を理解するのに苦労しますが、本関数が memcpy とわかると分析する必要はありません。あらかじめ、この memcpy の関数を含んだFLIRTシグネチャを保有している場合、IDAによって関数名が memcpy と特定されるため、分析業務が省力化されます。

図2: memcpy関数


このFLIRTシグネチャは、IDAがデフォルトで準備しているものはほとんどの場合、マッチしません。そのため、適切なFLIRTシグネチャを見つける、または作成しないといけないという問題があります。ただし、FLIRTシグネチャはコンパイル条件やライブラリのバージョンが異なるだけで、マッチしなくなるため、適切なFLIRTシグネチャを見つける作業は非常に困難です。図3に示す従来のFLIRTシグネチャ作成方法では、ライブラリとそのバージョンの違い、コンパイラのバージョンの違い、コンパイル条件の違いが生成されるELFバイナリへ影響します。そのため、さまざまな条件におけるFLIRTシグネチャを持っていないと、適切なFLIRTシグネチャが見つかりにくいということになります。

図3: IDAにおける従来のFLIRTシグネチャ作成方法

Yaraルールを活用したFLIRTシグネチャ作成手法

本手法の概要を図4に示します。始めに分析対象のELFマルウェアからYaraルールを作成します。ここで作成するYaraルールにはシンボル情報が残っているELFバイナリを検索できるようなルールとします。次に、作成されたYaraルールを用いてVirus TotalにてRetrohunt[2]を行い、取得したELFバイナリからFLIRTシグネチャ(.sig)を作成します。生成されたFLIRTシグネチャはELFマルウェアを基にRetrohuntしたファイルから作成されているため、対象のELFマルウェアに対してFLIRTシグネチャがマッチしやすいという利点があります。

図4: Yaraルールを活用したIDAのシグネチャ作成手法の概要


なお、シンボル情報が残っている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に示します。

図5: AutoYara4FLIRTの実行結果


通常、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ルールによるファイルの検索を無料で行うこともできます。

おわりに

本手法を活用することで、既存の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

表1: 本手法の検証結果(x86)
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
表2: 本手法の検証結果(ARM)
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
≪ 前へ
トップに戻る
次へ ≫