ページの先頭です
IIR Vol.54ではmacOS用フォレンジック解析フレームワークmac_aptのデモプラグインでプラグインの基本的な構造を解説しました(注1)。今回は、前回の記事で最後に触れた「~/Library/Caches/<Application Bundle ID>/Cache.db」に保存されているデータの内容と、このアーティファクトを解析するmac_ aptプラグインの実装について解説します。IIR Vol.54の記事を読んでいない方は、先にそちらを読んだ方が理解しやすいのではないかと思います。
まず、Cache.dbに記録されている情報を確認します。Cache. dbにはNSURLRequstなどのAPIを使用したHTTP/HTTPS通信のデータがキャッシュとして保存されています。Cache. dbファイルはSQLite形式のデータベースで、表-1~表-5に示すテーブルにデータが保存されています。キャッシュデータは基本的に、このデータベースに保存されますが、一定以上のサイズのデータはfsCacheDataディレクトリ以下にファイルとして保存されます(図-1)。テーブル名が「cfurl_ cache」で始まっていることから、「CFURL Cache」と呼ばれているようです。
この情報を確認することで、プログラムが通信を行った日時や通信先のURLだけではなく、サーバからのレスポンスも確認することができます。フォレンジック解析ではユーザやプログラムのアクティビティの履歴が非常に重要になります。したがって、このアーティファクトは非常に有益な情報源となります。
プラグイン作成に入る前に、アーティファクトからどのような情報を取得することができるか、もう少し詳細に確認しましょう。
表-1~表-3を見ると、通信を行ったタイムスタンプ、アクセス先のURL、クライアントからのリクエストメソッド及びヘッダ、サーバのHTTPステータス及びレスポンスヘッダ、サーバからのレスポンスボディを取得することができます。これらのテーブルはentry_IDをキーにして各データを紐づけることができます。更に、Cache.dbが保存されているファイルパスの中にある「<Application Bundle ID>」部分は通信を行ったプログラムを指しています。プラグインとしては、これらの情報を取りまとめて解析結果として保存すれば良いでしょう。
ところで、cfurl_cache_blob_dataテーブル(表-1)のresponse_ objectとrequest_objectはplist形式のBLOB(図-2)が保存されています(注2)。このデータはplist形式のまま解析結果として保存するのでなく、解析者が内容を把握しやすいようにパースした結果を保存すべきです。
DB Browser for SQLite(注3)などでrequest_objectのデータをエクスポートして、macOS標準コマンドのplutilで確認すると図-3のようになります。この中でフォレンジック解析に必要そうなデータは、「Array」の18番目と19番目のデータです。18番目はHTTPリクエストメソッドで、19番目はHTTPリクエストヘッダです。
19番目には「__hhaa__」にBase64エンコードされたデータも保存されています。このデータはバイナリフォーマットのplistであり、内容を確認すると図-4のようになります。内容的には、HTTPリクエストヘッダと同じものですので、これは解析結果に含める必要はありません。response_objectのデータについても同様に確認することができます(図-5)。こちらの場合、「Array」の3番目がHTTPステータスで、4番目がHTTPレスポンスヘッダです。
cfurl_cache_receiver_dataテーブル(表-2)のreceiver_ dataにはサーバからのレスポンスボディが保存されています。この情報もフォレンジック解析に有用であるため、解析結果に保存します。ただし、fsCacheDataディレクトリ以下にファイルとして保存されているデータは解析結果に含めるのではなく、ファイルのエクスポートをするのが良いでしょう。これにより、必要以上に解析結果のファイルサイズを大きくさせずに済みます。
次にデータの取得方法を検討します。Cache.dbはSQLiteデータベースであるため、SQLクエリで情報を取り出すことができます。上記で確認した結果から、必要な情報を取得するためのSQLクエリは図-6のようになります。
response_objectとrequest_objectに保存されているplistデータは、Pythonのplistlibモジュールを使ってパースすることができます(注4)。__hhaa__はパース結果から除外します。
取得するデータと取得方法について整理できましたので、これらを基にプラグインの実装方針を以下のように決めました。
それでは、プラグインの作成に入ります。今回、解説するプラグインは2021年7月にPull Requestを行い、マージされていますので、mac_aptのGitHubリポジトリで確認することができます(注5)。
なお、本稿ではプラグインの処理の概要を解説します。詳細については、必要に応じてソースコードを確認してください(注6)。
プロパティは図-7のように設定しました。プラグインは「CFURLCACHE」としています。また、ディスクイメージとエクスポート済みのアーティファクトを処理するため、「__Plugin_ Modes = "MACOS,ARTIFACTONLY"」としています。
Plugin_Start()はmac_apt.pyを実行した場合のプラグインのエントリーポイントです(図-8)。
「mac_info.users」はディスクイメージ内のユーザ情報がlistオブジェクトで保存されています。これを利用して、全ユーザのアーティファクトを処理することができます(179行目)。ただし、複数のアカウントに同じホームディレクトリが設定されている場合があるため、一度処理したホームディレクトリはスキップします(180 ~182行目)。
未処理のホームディレクトリの場合、mac_infoオブジェクトのIsValidFolderPath()メソッドでディスクイメージ内のホームディレクトリの存在を確認し(184行目)、ListItemsInFolder()メソッドで「~/Library/Caches/」以下のディレクトリをリストアップします(186行目)。
その後、IsValidFilePath()メソッドで各ディレクトリ以下のCache.dbファイルの存在を確認します(191行目)。存在する場合、ExtractAndReadCFURLCache()関数を呼び出し、Cache.dbの解析結果の取得及びアーティファクトファイルのエクスポートを行います(192行目)。解析結果はcfurl_ cache_artifactsにlistオブジェクトとして保存されます。
すべてのCache.dbの解析が終わったら、PrintAll()関数で解析結果を保存します(195行目)。
Plugin_Start_Standalone()はmac_apt_artifact_only.pyを実行した場合のプラグインのエントリーポイントです(図-9)。
input_files_listにコマンドラインで指定された処理対象のディレクトリ名が入ります(202行目)。その後の処理の流れは、基本的にPlugin_Start()関数と同じになりますが、このエントリーポイントでは、ExtractAndReadCFURLCache()関数ではなく、OpenAndReadCFURLCache()関数を呼び出して解析を行います(212行目)。
ディスクイメージ内のCache.dbファイルを開いて、データの解析を行い、解析結果の保存とアーティファクトファイルのエクスポートを行う関数です(図-10)。
Cache.dbはOpenDbFromImage()関数内でオープンします(147行目)。この関数ではmac_aptが提供するSqliteWrapperクラスのconnect()メソッドを使用して、SQLiteデータベースのコネクションを取得します。このクラスはPython標準のsqlite3モジュールのラッパーであるため、sqlite3のメソッドを使ってSQLクエリの実行などを行うことができます。
なお、データ解析はExtractAndReadCFURLCache()関数内では行わず、ParseCFURLEntry()関数で行います。これは後述するOpenAndReadCFURLCache()関数と処理を共通化させるためです(149行目)。
最後に、ExportFolder()メソッドでアーティファクトファイルをエクスポートします(150行目)。第1引数はエクスポートを行うフォルダパス、第2引数はエクスポート先のフォルダ名、そして、第3引数は上書きのフラグです。
第2引数で指定したエクスポート先のフォルダは、mac_aptのコマンドラインで指定した出力先のフォルダ以下に作られる「Export」フォルダの下に作られます。他のプラグインのソースコードを確認すると、基本的に「__Plugin_Name」が指定されています。しかし、CFURL Cacheはユーザごとにアーティファクトファイルが存在するため、エクスポート先のフォルダ名としてユーザ名も含めるようにしています。
エクスポート済みのCache.dbファイルを開いて、データの解析を行い、解析結果の保存を行う関数です(図-11)。アーティファクトファイルのエクスポートは行いません。
Cache.dbはOpenDb()関数内でオープンします。この関数では、mac_aptのCommonFunctionsクラスのopen_ sqlite_db_readonly()メソッドでコネクションを取得します。データ解析は上述したようにParseCFURLEntry()関数で行います。
SQLクエリを発行して、必要なデータをCache.dbから取得する関数です(図-12)。また、取得したデータのパースも行い、解析結果を保存します。
最初にテーブル名のリストを取得し、cfurl_cache_schema_ versionテーブルがある場合、スキーマバージョンを取得します(118 ~121行目)。筆者が確認した範囲ではバージョンは「202」しか確認できませんでした(注7)。
次に図-6のSQLクエリを使って、必要なデータを取得します(125 ~128行目)。なお、上記したように、request_object及びresponse_objectのデータはバイナリフォーマットのplistです。これらのデータは後述するParseRequestObject()関数とParseResponseObject()関数で解析します(130 ~131行目)。
receiver_dataのオブジェクトの型は保存されている内容によって異なります。レスポンスボディが保存されている場合は「bytes」となり、fsCacheDataディレクトリ以下のファイル名(UUID)が保存されている場合は「str」になります(132~135行目)。
最後に、取得したデータを解析結果のエントリーとして保存します(140 ~143行目)。解析結果の保存先はCfurlCacheItemクラスとして定義されており(図-13)、そのインスタンスがエントリーとなります。このクラスにはメソッドは定義されておらず、単にデータをひとまとめにするためだけの役割です。
request_object及びresponse_objectからデータを取得する関数です(図-14、図-15)。
上記の通り、request_objectのArrayの18番のデータはHTTPメソッド、19番のデータはHTTPリクエストヘッダになります(図-14:96 ~97行目)。また、__hhaa__は除外します(図-14:100行目)。同様に、response_objectのArrayの3番はHTTPステータス、4番目はHTTPレスポンスヘッダになります(図-15:106 ~107行目)。
解析結果をコマンドラインで指定されたフォーマットで保存する関数です(図-16)。cfurl_cache_infoは解析結果を保存する際のカラム名とその型を定義しています(162 ~164行目)。この定義と同じ順番で解析データをlistオブジェクトとしてまとめ、最後にWriteList()関数でファイルへの書き込みを行います(168 ~171行目)。
今回解説したプラグインによる解析結果は図-17のようになります(Received_Dataカラムより右側はスクリーンショットからカットしています)。情報が整理され、データを確認しやすくなったのではないかと思います。
前回から2号にわたって、mac_aptプラグインの作成について解説を行いました。おおよそのプラグインの構造と処理の流れは理解していただけたのではないかと思いますが、mac_aptが提供しているすべてのAPIを解説したわけではありません。他のプラグインも参考にすれば、より理解が深まるのではないかと思います。
mac_aptは強力なフォレンジック解析ツールですが、より多くのアーティファクトをサポートするにはユーザ自身がプラグインを作成するのが一番です。前号で解説したように多くのアーティファクトは、plistまたはSQLiteフォーマットであるため、データを参照すること自体は非常に簡単ですし、何より、自分が必要とするデータを好みの形式で解析することができるというメリットがあります。
なお、プラグインの作成よりも、mac_aptの解析結果をいかに読み解けば良いかという点に興味がある方もいるのではないかと思います。そのような方には、Japan Security Analyst Conference 2022(JSAC2022)で開催され たmacOSフォレンジックハンズオンワークショップで使用した資料(注8)と解析データ(注9)が参考になるのではないかと思います。このワークショップでは、mac_aptの解析結果を用いて、マルウェア侵害のフォレンジックタイムラインを作成します。動画もアーカイブとして公開されています(注10)。
執筆者プロフィール
小林 稔 (こばやし みのる)
IIJセキュリティ本部セキュリティ情報統括室フォレンジックインベスティゲーター。
IIJ-SECTメンバーで主にデジタルフォレンジックを担当し、インシデントレスポンスや社内の技術力向上に努める。
Black HatやFIRST TC、JSAC、セキュリティキャンプなどの国内外のセキュリティ関連イベントで講演やトレーニングを行う。
ページの終わりです