> whoami➢➢➢Shota Nakajima➢➢➢Hiroaki Hara

株式会社サイバーディフェンス研究所でマルウ
ェア解析、インシデントレスポンス業務、脅威情報の収集・分析業務に従事。
国内外のカンファレンスで発表経験あり。
セキュリティ・キャンプやJSACでワークショップを実施。
技術系同人サークルAllsafeのプロデューサー。 Kohei Kawabata➢➢

トレンドマイクロ株式会社にて、サイバークライムや標的型攻撃で利用されるマルウ
ェアの解析に加え、脆弱性の研究に従事。
技術系同人サークルAllsafeの先輩。

トレンドマイクロ株式会社にて、マルウェア解析やインシデントレスポンス、スレットリサーチなどに従事。
技術系同人サークルAllsafeの澤村・スペンサー・英梨々 (アートディレクター) 。

2

TABLE OF CONTENTS
1. Introduction YARA
YARAの基本的な概要を説明

2. Make YARA rules with Ghidra
Ghidraを使用し、YARAルールを作成するハウツーをハンズオン形式で学ぶ

3. Anatomy of SpiderPig Family
JSAC2022 Day1 "Ambiguously Black"で発表されたSpiderPigファミリについて紹介

4. YARA Pretty Darby
YARAルールを開発し、検出する演習に取り組む

Announcement
講義で使用するサンプルについて■

マルウェアのコードを含むため、指定した環境以外では取り扱わないこと○

ワークショップ終了後は削除すること■

ワークショップ内で指定したファイル以外は実行はしないこと■

第三者および外部ウェブサービス（VirusTotalなど）に、提供・アップロードしないこと4Setup1.

SlackからzipファイルをDL

2. 当日に配布したパスワードで下記パスにzipの中身を展開

C:¥yara_pretty_darby

5

1
Introduction YARA

YARA
マルウェアを検知、分類するためのOSSツール■■

シグネチャ（ルール）を定義し、合致するパターンを検出
ファイルやメモリなど、さまざまな種類のデータに対して検索可能
A l l s a f e“41 6c 6c 73 61 66 65”が含まれるか？（=ルール）
スキャン

7

YARA for InfoSec具体的にどのような場面で使用するのか？
■■■

Analysis○

類似ファイルをみつけてファミリを特定する○

マルウェア内で使われている手法（暗号方式・パッカーなど）を特定する

Detection○

IR中に見つけた不正ファイルと類似するファイル・プロセスを検索する○

特定の通信先やファイルパスが含まれるファイル・プロセスを検索する

Hunting○

類似ファイルが外部サービス（VirusTotalなど）で公開されるのを監視する
8

YARA in Tools■■

サンドボックス、EDR○

e.g. Cuckoo Sandbox, CAPE○

多くの商用製品がYARAルールに対応している

メモリフォレンジックツール○e.g. Volatility

9Basics of YARA

YARA, rule them all
YARAルールは、独自の構文で記述される■文字列やバイナリパターンなどのシグネチャ (stringsセクション)と、それらの組み合わせ条件式(conditionセクション)をもとに、検出ロジックを組み立てる
ルール名•

検出対象の名前（自由記述）•

マルウェア名やテクニック名など

メタデータ•

ルールに関するメタ情報をキーバリュー形式で記述•

ルール作成者や作成日など•

完全自由記述

シグネチャ
条件式

•

検索したいデータを定義•$<任意の変数名> = <パターン>•検出のための条件式を記述•

文字列や Hexを指定可能••

正規表現も利用可能

stringsセクションで定義したデータの組み合わせ条件を指定

11

strings section
stringsセクションで指定可能なさまざまなパターン

■

■

■

HEX文字列（{}でくくる）○

ワイルドカード（?）○

可変調データ表現（[n-m]）

テキスト文字列（””でくくる）○

エンコーディング（ascii/wide）○

ケースインセンシティブ（nocase）

正規表現（//でくくる）

12condition section
conditionセクションで指定可能なさまざまなパターン

■

○

■

any of them, all of them, # of ($*)

例: stringセクションで定義した変数名に対して、ワイルドカードを使用して指定することも可能

データへのアクセス○■

and, orセット○■<=, >=, <, >, ==, !=

論理式

○
■

例: MZ/PEヘッダをチェックしてから条件式を評価

比較式

uint(8|16|32), int(8|16|32), etc

キーワード○filesize

13

modules
機能拡張のためのモジュールも利用可能■

pe: PEファイルの構造に簡単にアクセスするためのモジュール■

hash: ハッシュ値を計算するためのモジュール■

dotnet: .NETファイルの属性情報にアクセスするためのモジュール

peモジュールを使用し、特定のAPIのインポートなどを検出条件にしている

14

YARA Docs■

細かい仕様は公式ドキュメントで確認する○

https://yara.readthedocs.io/en/stable/writingrules.html

15

For more detail
プロダクションレベルのルールを読むのが一番■

https://github.com/Yara-Rules/rules■

https://github.com/Neo23x0/signature-base/tree/master/yara■https://github.com/kevoreilly/CAPEv2/tree/master/data/yara■

https://github.com/eset/malware-ioc/■

https://github.com/JPCERTCC/MalConfScan/blob/master/yara/rule.yara■

https://github.com/InQuest/awesome-yara16

2Make YARA rules with GhidraWhat is Ghidra?
ソフトウェアリバースエンジニアリングツールセット■

2019年にNSAによってOpen Source Softwareとして公開○■

https://github.com/NationalSecurityAgency/ghidra

フリーでありながら、強力な機能を提供

18

Ghidra’s basic features

Disassembler/Decompiler

Ghidra Script

Ghidra Extension

多様なアーキテクチャに対応したディスアセンブラに加え、擬似C言語へ変換するデコンパイラ機能

Ghidraの各種機能をスクリプト(Java/Python)から利用可能

自作プラグインによる機能拡張をサポート

Headless Analyzer

Ghidra ServerDebugger

CLI経由での操作

複数ユーザによる共同作業をサポート

GDB/WinDBGをバックエンドとしたデバッグ機能を提供

19

Ghidra UsageSet up, Ghidra…
■

Ghidraのインストール・セットアップについては、事前に共有したURLを参考にして進めてください21

Wake up, Ghidra…
C:¥Ghidra¥ghidra_10.1.1_PUBLIC¥ghidraRun.bat 実行

22

Create Ghidra Project■■

Ghidraは解析結果をプロジェクトという単位で管理
初回起動時にはプロジェクトを新規作成する必要がある（すでに作成済みであれば不要）❶ File -> New Projectを選択❷ Non-Shared Projectにチェックボックスが入っていることを確認してNext❸ 遷移した先のSelect Project Location
画面で、以下設定でプロジェクトの作成（講義ではこのディレクトリをプロジェクトのディレクトリとして扱う）

23

import file■Ghidraでは、解析対象となるファイルをProjectに「import」して作業する○「C:¥yara_pretty_darby¥ファイル名.gzf」を使用❶ 作成したプロジェクト
画面にファイルをD&D❷ ポップアップが表示されたら「OK」❸ プロジェクト画面にファイルが表示されていればインポート完了

24

25

Code Browser
開く

Listing View

Decompile View

ディスアセンブル結果・データを表示

Listing Viewのデコンパイル結果を表示

Program Tree
セクション名などを表示

Symbol Tree
インポート/エクスポート
関数、関数名、クラス名などなどを列挙

Data Type Manager
独自構造体などのデータ型を管理

Consoleスクリプトの標準出力結果を表示

Other Window

特定のアドレスに対し、名前をつけてブックマークとして保存
HEXエディタ
ディスアセンブル結果をグラフ形式で表示

Pythonインタプリタの起動プログラムに含まれる可読文字列

Ghidra Scriptを管理するマネージャの起動

26

Load gdt■

解析に必要なAPIの情報を追加する❶ ▼からOpen File Achiveを選択❷ winapi_32.gdtを選択❸ winapi_32を右クリックして、Apply Function Data Typesを選択

27

関数のディスアセンブル結果を表示

Code Browser: Listing View

ラベル名

ローカル変数

ディスアセンブル結果や、データ領域のデータを表示・操作する画面■■

API呼び出しDecompile Viewでざっと流れを確認し、細かい処理をListing View で眺める

データ領域の参照

あらゆる処理をデコンパイルできるわけではなく、常に正しくデコンパイルできるわ
けでもないので、Listing Viewに頼るほかない場面も多い

関数呼び出しデータを表示
ラベル名

データ（文字列）28

Go to ...
■Gキーを押すとGo to ... ポップアップが表示される○

任意のアドレス、ラベルを入力してジャンプできる

29

30

Code Browser: Decompile View
関数のプロトタイプ定義

デコンパイル結果を表示する画面■

Ghidraは、機械語をP-CODEという中間表
現に変換後、擬似C言語にデコンパイルしている■

常にデコンパイルできるわけではないし、常にデコンパイル結果が正しいわけではな
いことに注意■データは表示できない

ローカル変数の定義（ハンガリアン記法）

データ領域の参照

Defined Strings
バイナリ内の可読文字列を表示■■「Window > Defined Strings」から開く■

コンパイラによって自動で埋め込まれた本来のコードと無関係な文字列も多いので注意■

Ghidraが文字列として認識できていない場合は現れないので注意

クリックすると、文字列が定義されているアドレスが Listing Viewに表示される

31

Symbol Tree
シンボル情報をカテゴライズして表示■

Imports○○■

ImportしているAPI一覧

APIベースで解析を進める際に参照

Exports○○○

Exportされている関数一覧
entryはプログラムのエントリーポイント

DLLの場合は、Export関数がみえる

32

Make YARA rulemeta Section■

metaセクションを記述○author: 作成者の情報を記述○

created_date: 作成日○

modified_date: 編集日○

hashn: ルールの作成に使ったファイルのハッシュ○

description: 検出ルールの説明

34

Step1: strings rule■Defined Stringsウィンドウから特徴的な文字列を選択してルールを作成

35

Step2: behavior rule■

Symbol TreeウィンドウのImportsから特徴的な挙動を実現するAPIを選択してルールを作成■

明示的な解決の場合は文字列やバイト列を利用してルールを作成する

36

How Windows APIs are resolved■■

暗黙的な解決○コンパイル時に、必要なAPIがインポートテーブルに定義され、実行時にOSが暗黙的にDLLをロードし、APIを解決する○

普通にコンパイルするとこの方法で解決される

明示的な解決（動的API解決）○

LoadLibrary / GetProcAddress を用いて実行時に動的にAPIを呼び出す■○

実行時にAPI名を復元してGetProcAddressの引数に渡すことで難読化

APIハッシュを使ったAPIのアドレス取得手法■

JSAC2021の資料で解説37

API List■

https://malapi.io/ を参考にマルウェアが利用するAPIを調査する

38

Step3: effective rule

変更しづらいコードをみつける

可変なコードは可変なままで•文字列は変更しやすい••

マルウェア固有のアルゴリズムやコードは変更しづらい

アドレスなどコンパイラによって可変なものはワイルドカードにする•

定数など攻撃者が変更する可能性がある
値もワイルドカードにする39

Effective rule Sample■

一部の定数のみが異なる、2種類の文字列の復号ルーチン

定数やレジスタなどが変わっても検出可能なパターン

40

Tool: YaraGhidraGUIScript❶ Ghidra Scriptを管理・実行するためのScript Managerを開く❸ スクリプトを選択した状態で ▶︎❷ Filterで絞り込み

41

Tool: YaraGhidraGUIScript Usage 1❸ YaraルールをGUIでぽちぽち編集可能❶ パターンを作成したい箇所を選択❷ コードを選択した
状態で更新

42

Tool: YaraGhidraGUIScript Usage 2■

命令列、データをYARAルール用のHEX文字列に自動変換■

手動でマスク（=ワイルドカードに置き換え）、もしくはバイト列の属性に応じて自動マスク元に戻す（アンマスク）
データ（命令以外）をマスク
オペランド（引数）をマスク
スカラー（実数）をマスク
アドレスをマスク
43

3
Anatomy of SpiderPig Family

Overview of SpiderPig Family■

BlackTechが利用するPEローダとカスタムバックドア
特定のフォーマットを持つ暗号化されたペイロードをローカルフォルダ内から検索し復号

メモリ上で実行

SpiderPig Loader(Local)Encrypted data

SpiderPig Loader(Remote)SpiderPig RAT

外部サーバから、特定のフォーマットを持つ暗号化されたペイロードをダウンロードし復号

45

SpiderPig Loader (a.k.a. selfmake Loader)■

オンメモリPEローダ、OSSのソースコードをカスタムして悪用している○ https://github.com/abhisek/Pe-Loader-Sample/blob/master/src/PeLdr.cpp
SpiderPig Loaderのデバッグメッセージ

PeLdr.cppのデバッグメッセージ

46

47

SpiderPig Loader: Local

FUN_003029f0

FUN_00302460■

ローカルから暗号化されたペイロードを検索するタイプ○○■

gzf: SpiderPig_Loader_local.gzf
SHA256:8bdfc1ed5bfec964050a42a0f1ddd
8709fcf14fab1ede151c5a7161be90
4cd96

大まかな実行フロー →FUN_00301ee0

FUN_00301cf0

FUN_00301a10

FUN_00301c90

FUN_00301bd0

48

SpiderPig Loader: Local

FUN_003029f0

FUN_00302460
実行ファイル名から拡張子を削除
FUN_00302410に渡す

先頭4バイトを読み込んで0xe0ffd8eeと比較

FUN_00301ee0

FUN_00301cf0

FUN_00301a10

FUN_00301c90

FUN_00301bd0

49

SpiderPig Loader: Local

FUN_003029f0

FUN_00302460

先頭4バイトのシグネチャをチェック
XOR鍵取得

FUN_00301ee0

ペイロードのサイズ取得
暗号化されたペイロー
ド部分を読み込み

FUN_00301cf0

FUN_00301a10
XORで復号

FUN_00301c90

FUN_00301bd0

50

FUN_00102ab0

SpiderPig Loader: Remote

FUN_00101aa0

FUN_001025f0■

外部サーバから暗号化されたペイロードをダウンロードするタイプ○○gzf: SpiderPig_Loader_remote.gzf
SHA256:
7da969010a55919aa66ed97a2d2d6
d6a0be3d8dc6151eeb6cebc15e4f06
d4553
FUN_001027d0■

大まかな実行フロー →FUN_001023c0

FUN_00102080
FUN_00102360

FUN_00102250

51

FUN_00102ab0

SpiderPig Loader: Remote

FUN_00101aa0

FUN_001025f0
通信先情報を含むコンフィグのデコード

FUN_001027d0

FUN_001023c0

FUN_00102080
FUN_00102360

FUN_00102250

52

FUN_00102ab0

SpiderPig Loader: Remote

FUN_00101aa0

FUN_001025f0
FUN_00101aa0に通信先と保存先を渡してダウンロード

FUN_001027d0

一時ファイルに保存

FUN_001023c0

FUN_00102080
FUN_00102360

FUN_00102250

53

FUN_00102ab0

SpiderPig Loader: Remote

FUN_00101aa0

FUN_001025f0
シグネチャのチェック後、ヘッダからXOR鍵やサイズを取得しペイロードを復号
先頭4バイトのシグネチャをチェック

XOR鍵取得

ペイロードのサイズ取得

暗号化されたペイロード部分を読み込み

FUN_001027d0
XORで復号

FUN_001023c0

FUN_00102080
復号後のデータがvalidなPEファイルかチェック

FUN_00102360

FUN_00102250

54

FUN_00102ab0

SpiderPig Loader: Remote

FUN_00101aa0

FUN_001025f0
復号したペイロードに埋め込まれた“fixmeconfig”というシグネチャを検索し、そこに暗号化コンフィグをコピー”fixmeconfig”を検索

FUN_001027d0

暗号化されたコンフィグをコピー

FUN_001023c0

FUN_00102080
FUN_00102360

FUN_00102250

Tips for Detection■

まずは検知ロジックに組み込みやすい文字列からYARAを作成してみる■

次に、SpiderPig Loaderには存在していてOSSのPeLdrには存在しないコードや文字列部分を特定して、ロジックに組み込む■

変更されにくそうな部分をロジックに組み込む

55

4
YARA Pretty Darby我々が用意した約1万ファイルの中から13のSpiderPigファミリを見つけ出す「いい」YARAルールを書いてもらう、全員参加型ダービー戦！
57

Darby

58

Flow
1.

Ghidraを使ってYARAルールを作成

2. ローカルテスト○

正しくルールが動作するか検証する

3. Webサーバのデータセットでテスト○指定されたハッシュがすべて含まれるか (False Negative)○指定されたハッシュ以外が含まれないか (False Positive)

59

Test YARA rule(Local Testing)What is ghidra_yara.py ?
■Ghidra にインポート済みのファイルに対してスキャン可能なYARA(yara_scanner.exe)を利用するGhidraScript○ 通常のYARA ではGhidra Project 内に含まれている解析対象のファイル本体をスキャンできない○

解析対象のファイル (マルウェア) を直接取り扱うのは危険が伴う
ExecuteImportedFileghidra_yara.py

Ghidra Project

Result+YARA Rule

Scanyara_scanner.exe

61

Step1 : How to use ghidra_yara.py■

Script Managerからghidra_yara.pyを選択して実行❶ Ghidra Scriptを管理・実行するためのScript Managerを開く❸ スクリプトを選択した状態で ▶︎❷ Filterで絞り込み

62

Step2 : How to use ghidra_yara.py■

YARAルールのファイル選択ダイアログが表示されたら、スキャンしたいYARAルールのファイルパスを選択○ C:¥ghidra_scripts¥rule.yaraを設置すると省略可能

63

Step3 : How to use ghidra_yara.py■

Consoleウィンドウにスキャン結果が表示される○ マッチした場合は、そのルール名が表示される

64

Step4 : How to use ghidra_yara.py■

Bookmarksウィンドウで検知結果の詳細を確認○ [Window] -> [Bookmarks]から起動○ "ghidra_yara"でフィルタして確認○ Locationをダブルクリックすることで、マッチしたアドレスに移動可能

65

Evaluation YARA rule
(Test Dataset)mquery■■

CERT PLが開発したOSSのYARA検索用のWebサービス○

https://github.com/CERT-Polska/mquery○

大量のデータを高速に検索することができる演習ではAllsafeが用意した環境を利用する○

アクセス方法はslackで共有

67

mquery Usage
構文の検証

YARAルールを入力

検索を実行

メタセクションのauthorの情報が投稿者を識別するのに利用される

68

Parse■

構文エラーをチェック○

基本的にはローカルでチェックするため利用しない

69

Query■

検索結果を表示■

正解のハッシュしか含まれないかを確認する■

ルールをトライアンドエラーで修正する

70

Query (Show query)■

左上のShow queryから実行したクエリを確認できる

71

Recent jobs■

過去のqueryを確認できる○

ユーザ毎に分離はされていないのでAuthorを目印に自分の投稿を探す

72

Cancel■

想定以上に検知されてしまうルールは右上の停止ボタンからキャンセルする○

サーバの負荷軽減にご協力お願いします73

YARA Pretty Darby Play BookDO✓DO NOT
フォーマットに従って書く

••
•
✓
✓
✓

Meta情報を埋める✓✓

公式の構文に従う✓検出の目的を加味し、誤検知の許容範囲を意識してルールをつくる
可能であればバイト列を含めたルールを作成する

特徴的でない文字列を避ける••

ルール名を統一する

なぜ・なにを検知しようとしたのかわかるコメントを書く

4文字未満の短すぎる文字列を避ける

正規プログラムでも利用されるユーザエー
ジェントなどの文字列正規表現を利用する場合はパフォーマンスに気をつける•✓

PEに必ず含まれる文字列

文字数を制限しない正規表現を使わない

同一ファイル内でマッチしすぎるルールを避ける

74

Good Rule vs Bad RuleGoodBad75

Dataset
■

■

ターゲット
○

SpiderPig Loader: 9○

SpiderPig Rat: 4 (+ 1)

PEマルウェア
○9772

76

Sample■■■SpiderPig Loader Remote○

7da969010a55919aa66ed97a2d2d6d6a0be3d8dc6151eeb6cebc15e4f06d4553

SpiderPig Loader Local○

8bdfc1ed5bfec964050a42a0f1ddd8709fcf14fab1ede151c5a7161be904cd96

SpiderPig RAT○d196969b35966462fa03ef857e375e9d6172b34053b115df04cefa3d673b9d85

77

Ground Truth■■■

SpiderPig Loader Remote

○
○
○
○
○
○
○

7da969010a55919aa66ed97a2d2d6d6a0be3d8dc6151eeb6cebc15e4f06d4553
1e25116f33f7248e4549cb15fb20bd5d9f87cc7424e6592e565d66095ec2b647
2321690bb6cab49c9eb828c4b65182ceb05653479fe900b9e6dbd93a0b9a672f
90406d0fc975f342f0e20b49e7946e891392eb06bfc8cc5f3b9b8c86b7c1b17a

3891fb7b3d1e5fc2d028ed3d0debe868189971b20eb8edb295e2b8d2d0c1a02a
5a57c9d19c7fb42832085f88d92f9f57d64b1bca8f2a19b0533a4caee1a792cc
2657ca121a3df198635fcc53efb573eb069ff2535dcf3ba899f68430caa2ffce

SpiderPig Loader Local○○

8bdfc1ed5bfec964050a42a0f1ddd8709fcf14fab1ede151c5a7161be904cd96

92c75df382218e7743359aa83b403e443550e766c8474a59c9dcbd4903a4bf02

SpiderPig RAT

○
○
○
○
○

8c3df0e4d7ff0578d143785342a8033fb6e76ce9f61c2ea14c402f45a76ab118
c2b23689ca1c57f7b7b0c2fd95bfef326d6a22c15089d35d31119b104978038bd196969b35966462fa03ef857e375e9d6172b34053b115df04cefa3d673b9d85

733b4d5174669caab2bbcc9bfe51606a13346b70af59fccea4f479d1fde7b5d7
Dced553a6f835162f0515a41a330404466f3ca44bc43a2f8b5675ca28609c905 (x86) //実装が異なるため検知できなくてもよい

78

出走！

Solutions■

別途配布するPDFを参照

80

Summary■

単に検出できるかどうかだけではなく、検出の目的や効率を考慮した「いい」YARAルールを書くように心がけましょう■「いい」YARAルールは、反復検証の結果として出来上がるので、仮説→検証を繰り返しましょう■

書いたYARAルールをコミュニティに共有してみましょう

81

THANKS!

CREDITS: This presentation template wascreated by Slidesgo, including icons by Flaticon,
and infographics & images by Freepik
Please keep this slide for attribution