The Rule for Wild Mal-Gopher Families.
NTTセキュリティ・ジャパン
野村和也
平尾早智澄

Agenda1. Introduction
2. Creating YARA Module

3. Clustering Evaluation
4. Applying to “Wild” Binaries
5. Conclusions
Appendix© 2023 NTT Security Holdings All Rights Reserved

1. Introduction
The Rule for Wild Mal-Gopher Families.

© 2023 NTT Security Holdings All Rights ReservedAbout Us
野村和也
NTTセキュリティ・ジャパンのSOCアナリスト。主な業務はIPS/IDS/EDRでのアラート監視。
NTTセキュリティ・ジャパンにおいてマルウェア解析とデータ可視化の記事を投稿。
MWS2020論文賞受賞、SecHack2020優秀修了生。

平尾早智澄
NTTセキュリティ・ジャパンのSOCアナリスト。元金融系インフラエンジニア。
SOCではNW/EDRのアラート監視の他マルウェア解析なども担当。

© 2023 NTT Security Holdings All Rights Reserved

Motivation & Goals
1. YARAモジュールの実装•

大規模な検体群に対する高速かつ簡便な分類が可能に

2. 解析済みの検体を用いた精度評価•

ファミリ分類のために最適なパラメータを検討

3. VirusTotalに投稿された検体への適用•

未解析の「野生の」検体への応用•

最新のGolangマルウェアへの応用について考察© 2023 NTT Security Holdings All Rights ReservedGolang Malware• Golangマルウェアのファミリは年々増加•

特徴的な構造による解析の複雑化•

マルチプラットフォーム向けにビルド可能

攻撃者のメリット• 多種多様な検体が今後も増加し続ける•

分類の効率化•

解析済みの検体への帰結による解析の効率化

Golangマルウェアの分類・解析の効率化© 2023 NTT Security Holdings All Rights ReservedGolang Malware• Golang向けの様々なマルウェア作成フレームワークが存在•

Coldfire

•

CHAOS

•

EGESPLOIT•ARCANUS• 開発が活発なフレームワークが多い
https://github.com/redcode-labs/Coldfire© 2023 NTT Security Holdings All Rights Reserved

https://github.com/tiagorlampert/CHAOS

gimphash• Golangバイナリ版のimphash•

Golangバイナリはプラットフォームに拠らずpclntabと呼ばれる構造を持つ•依存するパッケージ名や関数名などを復元可能•

gimphashは復元したパッケージ名/関数名のうち、一部をSHA256でハッシュ化したもの•

マルウェアが依存する機能を一意に表現可能だが、異なるハッシュの類似度比較は不可能
github.com/example/ExampleFunction

gimphashgithub.com/example/Malicious

e3b0c44298・・・

os.Getenv

Crypto/sha256/New
・・・

pclntab© 2023 NTT Security Holdings All Rights Reserved

sha256

gimpfuzzy• gimphashをファジーハッシュに•

SHA256は入力が1bitでも違えば出力は大きく変化•

Fuzzy Hashは似ている入力には似ている値を返す、“大雑把な”ハッシュを計算•

gimpfuzzyはssdeepを利用。検体間の類似度が測定可能に

gimpFuzzypclntabgithub.com/example/ExampleFunction
github.com/example/Maliciousos.Getenv
Crypto/sha256/New
・・・

3:j4dwGIVWYvgxN4dw
GIV3MNWzYKKKvTKrs:j4mGggximGCMcTjKrs
類似度の比較が可能

github.com/example/AnotherFunction
github.com/example/Maliciousos.Getenv
Crypto/sha256/New
・・・© 2023 NTT Security Holdings All Rights Reserved

3:j4dwGIV++RSXzM9xN4d
wGIV3MNWzYKKKvTKrs:j4
mGduSXg9ximGCMcTjKrs

Difference Between Previous Presentation• CODE BLUE 2022
「Who is the Mal-Gopher? - Implementation and Evaluation of “gimpfuzzy” for
Go Malware Classification」•

gimphashにFuzzy Hashを適用する手法を初めて提案•

解析済みの検体をgimphashにより分類し精度評価• JSAC2023 「The Rule for Wild Mal-Gopher Families. 」
実際のオペレーションや解析での応用に着目し実装・評価•

実施に検体の分類が可能なYARAモジュールの作成•

VTに投稿された「野生の」未解析の検体への適用と評価© 2023 NTT Security Holdings All Rights Reserved

2. Creating YARA Module
The Rule for Wild Mal-Gopher Families.

© 2023 NTT Security Holdings All Rights Reserved

YARA• VTが開発しているマルウェア分類のためのツールキット[1]•

分類のルールを書くことで、ルールを満たす検体のみを探索可能•

Cで実装されているため高速• ファイル構造に応じた様々なモジュールが存在• 以下のモジュールは存在しない•

Golangバイナリを扱うモジュール•

Fuzzy Hashingや文字列の類似度計算を行うモジュール• gimpfuzzyによる検体の分類を手軽に行えるようにするため
新たにYARAモジュールを実装[1] https://github.com/VirusTotal/yara© 2023 NTT Security Holdings All Rights Reserved

12Creating YARA Module
以下の二つを実装• goモジュール : golang製のPEバイナリを解析•

go.gimpfuzzy() : 抽出した関数名からgimpfuzzy計算•

go.function_names : 抽出した関数名の文字列配列• fuzzyモジュール : Fuzzy Hashの類似度を計算•

fuzzy.fuzzy() : 引数の文字列からファジーハッシュ計算•

fuzzy.score() :引数の文字列二つを比較し編集距離を基にしたスコア算出© 2023 NTT Security Holdings All Rights Reserved

13

Writing YARA Rule
• YARAのルール例•

gimpfuzzyを基にした検体の類似度に基づいた検索が可能に

import "go"import "fuzzy"
import "pe“
rule GoFuzzyTest{
condition:pe.is_pe andfuzzy.score(go.gimpfuzzy(),"96:O5iaa8UdGAq27F92…")>80
}
類似度の
スコア計算

© 2023 NTT Security Holdings All Rights Reserved

検体のgimpfuzzy
計算結果

比較する

類似度が80超のFuzzy Hash

検体を探索
14

Using YARA Module• gimpfuzzyの類似度をベースに検体の検索が可能に

root@1f06b9d1f716:/malwares# yara /test.yara -r .
GoFuzzyTest ./Valhalla_hktl_htran_golang/4550635143c9997d5499d1d4a4c860126ee9299311fed0f85df9bb304dca81ff
GoFuzzyTest ./Valhalla_hktl_htran_golang/645622a85906da6304315ae9444046f2310609da933f53e87b54fbb206b53e3e
GoFuzzyTest ./Valhalla_hktl_htran_golang/4e5468e36dc7bc5601384f22c032f990f2e8454d27f6b11e8e897fb0c6c5e0e5
GoFuzzyTest ./Valhalla_hktl_htran_golang/65cfa86dec6f19cdbf5f9641ab835af023d34fa23b0e31a9f9b66c93a221d7a2
GoFuzzyTest ./Valhalla_hktl_htran_golang/72549bdc9e857162603f3ce90f1bfc8eb761e7e9f399a24a2bba47468b6edfe3
GoFuzzyTest ./Valhalla_hktl_htran_golang/91bce99e792db5c3da42da3f01f50a1021f9538b78f70544bedc9ca7508ce54e
GoFuzzyTest ./Valhalla_hktl_htran_golang/d45a6f12d5956f0fb8ad17727c717b621e3be06fabf9ff27058cb86f8f108b7d
GoFuzzyTest ./Valhalla_hktl_htran_golang/e70e0c8fb2727b35b65596a6e2838abd0b5f7351cdd4031b9971b91c22f5d15c© 2023 NTT Security Holdings All Rights Reserved

15

Developing YARA Module• 下記の関数を実装する
関数

主な
実装

module_initialize

YARAモジュールの初期化処理

module_finalize

YARAモジュールの終了処理

module_load

モジュールがファイルを読み込んだ際の処理
ファイルに対する実際の解析ロジックを実装

module_unload

モジュールがファイルを読み込んだ際の後処理
ハッシュテーブルの削除、構造体の開放など© 2023 NTT Security Holdings All Rights Reserved

16Developing YARA Module• 各関数で例外が発生した場合きちんと対応したエラーを返すことが重要•場合によってはYARA側が適切に後処理する#ifndef ERROR_SUCCESS#define ERROR_SUCCESS 0#endif

成功処理#define ERROR_INSUFFICIENT_MEMORY#define ERROR_COULD_NOT_ATTACH_TO_PROCESS#define ERROR_COULD_NOT_OPEN_FILE#define ERROR_COULD_NOT_MAP_FILE#define ERROR_INVALID_FILE#define ERROR_CORRUPT_FILE© 2023 NTT Security Holdings All Rights Reserved

1
2
3
4
6
7

エラー処理

17

デモ : YARAモジュール
Demonstration© 2023 NTT Security Holdings All Rights Reserved

3. Clustering Evaluation
The Rule for Wild Mal-Gopher Families.

© 2023 NTT Security Holdings All Rights ReservedClustering Evaluation• 実際に観測された「野生の」検体を用いたクラスタリング評価

解析済みの検体を用いた評価•

マルウェアと判明した検体のみを分類•

クラスタリングの妥当性と精度を評価© 2023 NTT Security Holdings All Rights Reserved

未解析の最新の検体を用いた評価•

マルウェアと判明していない検体も含む•

実際のオペレーションでの利用を評価

20

Overview of Clustering Methods• gimpfuzzyの類似度に基づくクラスタリング
1.

クラスタリングを行う検体のgimpfuzzyを計算

2.

クラスタリングを行う検体どうしでgimpfuzzyの類似度を計算

3.

閾値以上の類似度を持つ検体をエッジで接続4.

接続された検体どうしをクラスタとみなす
50

A

30

80

クラスタ3

F

10

B
クラスタ1

E

20

60
60

70

C

10
閾値≧70の検体を接続した場合

D

100

クラスタ2
© 2023 NTT Security Holdings All Rights Reserved

21

Scoring Matrix• 検体のすべての組み合わせに対してスコア を計算•

編集距離をベースに、文字列の類似度を0~100までスコアリング•「隣接行列」を作成し、無向グラフを考える
色はファミリに対応

A

B

C

D

E

F

A

0

80

0

0

30

50

B

80

0

0

10

20

0

C

0

0

0

100

60

60

D

0

10

100

0

70

10

50

A

F

30

80

10

B

20

E

60
60

70

C

10

E
F

30
50

20
00

60
60

70
10

© 2023 NTT Security Holdings All Rights Reserved

0
0

0
0

D

100
22

How to Evaluate Clustering• 閾値の切り方：何をもってよいクラスタリングとするか？
•

閾値が低い場合：大きな少数のクラスタができる•

閾値が高い場合：小さな多数のクラスタができる
50

A

F

クラスタ2

30

80

20

E

D

10

B

60

クラスタ1

C
100

クラスタ1

F

30

60

70

10

クラスタ5

80

10

B

50

A

20 クラスタ3

E

60
60

70

C

10

D

100

クラスタ4

閾値≧30
閾値≧90
◎多くの検体を紐づけられる (完全性↑)◎クラスタ内の分類精度が高い (同質性↑)△クラスタ内の分類精度が低下 (同質性↓) △クラスタが分かれすぎるので意味がなくなる (完全性↓)© 2023 NTT Security Holdings All Rights Reserved

23How to Evaluate Clustering• 両者のトレードオフで調和平均を考慮• scikit-learnに実装されているV-measure[2]を評価に使用•

同質性スコア ℎ : あるクラスタ内で単一の正解グループが占める割合が多いほど高い•

完全性スコア 𝑐 :ある正解グループが単一のクラスタに分類されるほど高いℎ⋅𝑐𝑉𝛽 = 1 + 𝛽 ⋅ℎ+𝑐[2] https://www.researchgate.net/publication/221012656_V-Measure_A_Conditional_Entropy-Based_External_Cluster_Evaluation_Measure© 2023 NTT Security Holdings All Rights Reserved

24Evaluation• そもそも何を分類の正解とするか？
•

マルウェアファミリの細かい亜種やバージョン違い•

マルウェアファミリ•

大雑把なマルウェアの機能• paloaltoデータセット[3]による評価•

YARAでファミリを分類した解析済みの検体•

ファミリ名のつかなかった検体を除外•分類した結果とファミリ名をV-measureで評価
検体の

マッチした

SHA256

YARAルール[3]https://github.com/pan-unit42/iocs/blob/master/golang_malware_results.csv© 2023 NTT Security Holdings All Rights Reserved25Evaluation• paloaltoデータセット•

検体数：10,700•

うちVTからダウンロード可能な検体数：7,088•

うちファミリ名の表記あり、解析可能な検体 : 5,808• V-measureによる評価•

ファミリによる分類を正解とした場合の評価•

閾値70~80程度で分類精度が最も良い© 2023 NTT Security Holdings All Rights Reserved26

Advantages of Our Methods• 機械学習と比較したgimpfuzzyの類似度に基づくクラスタリングのメリット•

計算量が少ない•

時間変化の影響を受けにくい

新たな検体が増えた場合

gimpfuzzyによる分類
過去の計算結果を再利用可能でスケールが容易

過去の検体と類似度計算

ファジーハッシュ
計算
検体の入手

分類完了
新たに出現したパッケージ名を示す
特徴量の計算新たな分類器で新たな分類器で分類機の再学習

全検体を再分類

機械学習による分類
検体追加のたびに全検体に対して膨大な計算を行う可能性© 2023 NTT Security Holdings All Rights Reserved27

4. Applying to “Wild” Binaries
The Rule for Wild Mal-Gopher Families.

© 2023 NTT Security Holdings All Rights Reserved

Applying to ”Wild” Binaries• 実際に観測された「野生の」検体を用いたクラスタリング評価

解析済みの検体を用いた評価•

マルウェアと判明した検体のみを分類•

クラスタリングの妥当性と精度を評価© 2023 NTT Security Holdings All Rights Reserved

未解析の最新の検体を用いた評価•

マルウェアと判明していない検体も含む•

実際のオペレーションでの利用を評価

29

Collecting Wild Binaries• VTのRetrohuntで以下のYARAにマッチングしたものをダウンロード•

golang製のwindowsバイナリにマッチする検体
rule go_language_pe{
strings:$go1 = "go.buildid" ascii wide$go2 = "go.buildi¥¥" ascii wide$go3 = "Go build ID:" ascii wide$go4 = "Go buildinf:"$go5 = "runtime.cgo"$go6 = "runtime.go"$go7 = "GOMAXPRO"$str1 = "kernel32.dll" nocase
condition:
uint16(0) == 0x5A4D and uint32(uint32(0x3C)) == 0x00004550 and 2 of ($go*) and all of ($str*)}© 2023 NTT Security Holdings All Rights Reserved30Collecting Wild Binaries• 検体の収集結果
RetroHunt
9999検体VTからダウンロード
9016検体• Retrohuntによって収集された検体(2022/12からおよそ過去3か月分)• Subfileなどの重複を除いてダウンロードした検体
ssdeep入力のバイト数不足の場合
TLSH等を用いることで改善可能

gimpfuzzy計算
2876検体© 2023 NTT Security Holdings All Rights Reserved• pclntabの解析+gimpfuzzy計算が可能だった検体• UPXはアンパックし解析
31

Clustering Result• 2867件の検体に対し1093件のクラスタを作成© 2023 NTT Security Holdings All Rights ReservedClustering Result• クラスタの可視化•

Pythonのbokeh.ioで実装•

インタラクティブに「動かせる」グラフを作成•

グラフの赤色のノードはVTでの悪性判定数
10以上の検体を示す© 2023 NTT Security Holdings All Rights Reservedデモ : クラスタの可視化
Demonstration© 2023 NTT Security Holdings All Rights Reserved

Case Study① : GitHub Packages• Golangはパッケージにgithubのリポジトリを指定可能• 悪性判定10件以上の検体に注目、705件のリポジトリ名を復元•

プライベートと思われるリポジトリも含む• 復元された興味深いリポジトリ名•

ランダムなUAを生成するパッケージ (corpix/uarand等)•

Process Invokingを行うパッケージ (inconshreveable/mousetrap等)•

マルウェア作成フレームワーク (tiagorlampert/CHAOS等)•

マルチホッププロキシ (Dliv3/Venom等)•

Post-Exploitationフレームワーク (Ne0nd0g/merlin等)© 2023 NTT Security Holdings All Rights Reserved35

Case Study① : GitHub Packages
悪性検体に出現したgithubのリポジトリTop20© 2023 NTT Security Holdings All Rights Reserved

Case Study② : マルウェアの機能追加を検出• 悪性検体クラスタでGimpFuzzy値のわずかな変化を検出し時間的変化を観測•

768:KZZ99PdnRrLXT3UbhHPBj/RqJgvm+HHyScP0OhZlXCPlNvxtWrX7G/VAmWeEX:iZXJRrLXT3
iNGKlNvxtWrX7G/VAmWeEX•

768:KZZ99PdnRrLXT3UbhHPBj/RqJgvm+HHyScP0OhZlXCPlNvxtWrX7G/V3mWeEX:iZXJRrLXT3
iNGKlNvxtWrX7G/V3mWeEX

25
20
15
10
5
0

© 2023 NTT Security Holdings All Rights Reserved37

Case Study② :マルウェアの機能追加を検出• 変更された関数はロジックも変更されていた•変更されていた関数名•

768:~VAmWeEX→ application/pesignaturetest/wincert.GetPostalCode•768:~V3mWeEX→ application/pesignaturetest/wincert.Extract

wincert.GetPostarCode© 2023 NTT Security Holdings All Rights Reserved

wincert.Extract38

Case Study② :マルウェアの機能追加を検出• 関数名が変更されていない関数の中にもロジックが変更されているものがある•

main_reportInstllFailureは通信機能の追加が行われている© 2023 NTT Security Holdings All Rights Reserved

39Case Study③ : Legitimate Files• 現実では正規ファイルが圧倒的に多い•

VTに投稿された検体においても同様•

正規ファイルのクラスタリングも可能なのか？

多

検
体
数

少
少

悪性判定

© 2023 NTT Security Holdings All Rights Reserved

多40Case Study③ : Legitimate Files• 正規ファイルと思しき検体でもクラスタができる•

VTに投稿されている検体は悪性ファイルのみであるとは限らない© 2023 NTT Security Holdings All Rights Reserved

41

Case Study④ : Floxif• 悪性 / 良性判定が混合するクラスタ•

gimpfuzzyが類似しているものの悪性判定がクラスタ内で大きく異なる

58/71© 2023 NTT Security Holdings All Rights Reserved42Case Study④ : Floxif• 正規ファイルクラスタの中に潜む悪性度の高い検体•

以下のプログラムに擬態した悪性度の高いFloxifの検体を発見•

psiphone-tunnel-core•

Acronis Cyber Protect•

教師なしでのクラスタリングのみでは悪性/良性判定は難しい検体が存在•

検体のプロファイリングとしては正しい結果© 2023 NTT Security Holdings All Rights Reserved

43

Limitations• gimpfuzzyを計算できない検体の存在•

ssdeepの入力サイズの下限が存在 (>4KB)›•

TLSHなどで置き換えが可能

パッキング、難読化などによる解析妨害• 「教師なし」での分類の限界•

悪性 / 良性判定は難しい•

クラスタによりある程度は分かれるが、混ざってしまうものも存在© 2023 NTT Security Holdings All Rights Reserved44

5. Conclusions
The Rule for Wild Mal-Gopher Families.

© 2023 NTT Security Holdings All Rights Reserved

Conclusions• gimpfuzzyを実際のオペレーションに応用するために以下の内容について発表•

YARAモジュールの実装•

解析済みの検体を用いた精度評価•

VirusTotalに投稿された検体への適用• YARAモジュール及び可視化スクリプトを公開予定© 2023 NTT Security Holdings All Rights Reserved

46Appendix
The Rule for Wild Mal-Gopher Families.

© 2023 NTT Security Holdings All Rights Reserved

Appendix 1• VTで収集した検体の悪性判定数•

圧倒的に悪性判定の少ないファイルが多い

解析済み検体 :2835検体© 2023 NTT Security Holdings All Rights Reserved

未解析の検体 :9999検体48

Appendix 2• 編集距離（レーベンシュタイン距離）•

文字列の類似度を示す原始的な手法•

1文字の挿入・削除・置換によって一方の文字列をもう片方の文字列に変換できる最小の回数

Security①y削除

Securit②u削除

Secrit③i→e置換© 2023 NTT Security Holdings All Rights Reserved

編集距離3

Secret49

Appendix 3• ssdeep (Context Triggered Piecewise Hashing)•

Piecewise Hashing : 分割した部分データのハッシュ•

Rolling Hash : 固定長の部分データに対するハッシュ

入力データ

Piecewise Hashinga b c d e f g h i j k l
Rolling Hash•

Rolling Hashが一定の値になった時に、そこで分割してPiecewise Hashingを行う•

トリガーとなる値は入力データ長に応じて計算

入力データ

a b c d e f g h i j k l© 2022 NTT Security Holdings All Rights Reserved

入力の類似度をよく反映できる
50