bam キー(実行痕跡?) について(2) & レジストリのトランザクションログ
前回の投稿でbamキーについて記事を書いた後、twitter宛にいくつかのメッセージを頂きました。
いつの間にか海外のフォレンジックコミュニティーにも記事の内容が共有され、様々な議論が交わされて、何名かのフォレンジッカーがこのキーについて追加の検証を行い結果を共有してくれました。
頂いたメッセージは、「良くやった!」というものから誤りを指摘してくれるものまで様々ありましたが、どれも私にはとても価値がある嬉しいものでした。
今回は、その中であった素晴らしい指摘や、それを元に行った簡単な追加検証の結果などについて共有したいと思います。
まず、bamキーに関する前回からの大きな更新点は、レジストリファイル(SYSTEM)上のbamキーの値が更新されるタイミングについてです。
私は、前回の検証において「シャットダウン時にレジストリファイルが更新される」と書きましたが、これは間違いでした。(シャットダウン時にも更新されますが、他にも条件があります)
この点に関しては、@errno_fail 氏から下記の様な指摘があり、今回再検証したところ一定の時間が経てばレジストリファイルが更新されることを確認しました。
https://twitter.com/errno_fail/status/967831155310518272
※こちらも合わせてご参照ください。非常に価値の高い資料です。
この指摘(及びこれを元に派生するtwiitter上の議論、上記の2つの記事)によると、
・Windows 8.1以降では、bamキーに関わらず全レジストリへの変更は、変更時に一度全てレジストリトランザクションファイル(レジストリファイルと同じフォルダにある"{HIVE名}.LOG*")に書き込まれ、その後ユーザが非アクティブになる、シャットダウンなどでハイブがアンロードされる、最後のレジストリファイルへの書き込み後1時間経過する、など一定の条件をトリガーにレジストリファイルへ書き込まれるため、レジストリファイルへの書き込みには遅延が発生すると書かれている様にみえます。(英語力やフォレンジック知識の不足で間違っていたらすみません。誤りをご指摘頂けたら嬉しいです)
従って、これが事実であれば、静的なレジストリファイルを解析する際は、状況に応じてこれらのトランザクションログファイルを一緒に取得・解析する必要があると考えられます。自分が普段使っているファストフォレンジック用の収集ツールがこれらを収集する仕様になっているか確認し、いざという時の収集手段を準備しておく必要がありますね。
このトランザクションログの処理を踏まえて、bamキーのレジストリファイルへの書き込みについて、簡単に追加検証をしてみました。
まず、現在bamキーにないx64dbgを起動します。
次に、regeditでbamを確認。 x64dbgの実行記録が残っています。
FTK ImagerでレジストリファイルとトランザクションログファイルをExport(※)し、Registry Explorer v1.0.0.0で確認します。
(このRegistry Explorer v1.0.0.0は、レジストリファイルに反映されてないトランザクションログの存在を検知し、更にトランザクションログファイルの内容を反映することができる優れものです。更に、bamキーの記事が話題になった翌朝にはbamキーとそれによく似た痕跡の残るとされるdamキー(Desktop Activity Moderator? でしょうか。残念な事に私の環境ではこのキーの中に有用な情報は見つかりませんでした)のプラグインを完成させるなど、作者のEric Zimmerman氏の仕事には驚愕させられます)
SYSTEMファイルをロードすると、ダーティー(まだ反映されていないレジストリトランザクションログがある状態)であることを検知し警告が出てきます。トランザクションファイルの内容を取り込むか聞かれますので、「YES」を選択します。
取り込みたいトランザクションログファイルを選択します。
次に、取り込んだトランザクションログの内容を反映した新しいレジストリファイルを保存する場所を聞かれるので、任意の場所を指定します。この例だとSYSTEM.LOG1を指定したので、保存名もSYSTEM_LOG1にしました。
保存した新しいレジストリファイルをロードするか聞かれるので「YES」を選択します。
トランザクションログを反映前のダーティーなファイルもロードするか聞かれます。今回は比較のため「YES」を選択します。
トランザクションログ反映前(上の"SYSTEM")とトランザクションログ反映後(下の"SYSTEM_LOG1")が下記のようにロードされます。
上の"SYSTEM"のbamキーを見ると先ほど実行したx64dbgの実行痕跡は反映されていませんが、下のトランザクションログを反映した"SYSTEM_LOG1"を見るとx64dbgの実行痕跡があります。
ということで、レジストリの変更(トランザクションログの内容)がレジストリファイルへ書き込まれる前にレジストリファイルを取得した場合は、Registry Explorer v1.0.0.0等を使用してトランザクションログをレジストリファイルに反映させることで、最新状態のレジストリを調査することが可能になるようです。
さて、次なる疑問は、果たして実際にこの後どのくらい時間が経ったらレジストリファイルにこのトランザクションログの内容が反映されるかという点です。
x64dbgを実行後、10分ごとにレジストリファイルのエクスポートと確認を行い、レジストリファイルに変更が適用されるまでの時間を観測してみました。(もっと楽で適切な方法があるのではないかとも思いますが、今回は原始的な方法でやりました)
VMのスナップショットでx64dbgの実行前に戻してから、再びx64dbgを実行し経過観察という流れを2回実施し、その後他のPCでも同様の検証を1回実施してみました。(なお、検証中はForensic Lunchを見るなどしてずっとPCを使用し続けました)
1回目の検証(スナップショットを戻してすぐx64dbgを実行)
10分後、、、、変更なし
20分後、、、、変更なし
30分後、、、、変更なし
40分後、、、、変更なし
50分後、、、、変更なし
1時間後、、、、変更されている!
2回目の検証(再度スナップショットを戻して1日程度放置した後)
10分後、、、、変更なし
20分後、、、、変更されている!
3回目の検証(別のPC)
10分後、、、、変更なし
20分後、、、、変更なし
30分後、、、、変更なし
40分後、、、、変更されている!
ということで、私の手元では、1回目は50分-1時間、2回目は10-20分、3回目は30-40分の間にレジストリファイルが更新されたという結果でした。環境間での差ももちろん、同じ環境でもタイミング次第で、レジストリ(bamキー)への変更内容がプライマリのレジストリファイルに反映されるまでの時間には結構差がありました。
(別途、スクリーンセイバーにしたりサインアウトしたりする検証もしましたが、これによってレジストリファイルへの更新が即時にされるわけではありませんでした。ユーザが非アクティブになった際にはトランザクションログがレジストリファイルに反映されるとのことなので、サインアウトした際には更新が行われると思ったのですが、私の手元ではそのような結果は得られませんでした。更なる検証が必要かもしれません)
従って、やはり検証の結果からも、私が前回の記事で記載した「シャットダウン時にレジストリファイルが更新されるのではないか」というのが誤りだとわかりました。
時間が経てばシャットダウンなしでもレジストリファイルに反映されます。
誤った情報を発信してしまったことを謝罪致します。しかしながら、今回の記事のようにそこから学べることもあるので、失敗を恐れずに引き続き検証などを続けていきたいと思います。これは見習いフォレンジッカーのメモですので。
なお、同様のRegistry Explorerを使用した検証は下記のブログでも行われています。
いつもながら素晴らしい内容です。
http://port139.hatenablog.com/entry/2018/03/03/110202
検証使用ツール:
・registry
→Registry Explorer v1.0.0.0
→Registry Editer(regedit)
・registryの抽出
→FTK Imager Ver.3.4.0.1
(※ 私の手元ではExportした.LOG*ファイルは属性がHSAなのでRegistry Explorerでうまく読み込むことが出来ず、同じディレクトリに2度Exportして作成された.LOG*.copy0(属性がAのみ)をリネームして.LOG*にすると読み込めました。attribコマンドを使って属性変更した方が早いかもしれません。)
・検証環境