【デジタルフォレンジック】タイムスタンプの改ざんを見破る方法(NTFS&ext4想定)

【デジタルフォレンジック】タイムスタンプの改ざんを見破る方法(NTFS&ext4想定)

改ざんされたタイムスタンプ
あーもう(タイムスタンプが)めちゃくちゃだよ

タイムスタンプを変えるのは簡単、でも(大抵の場合)証拠は残る

ある程度のITスキルを持っている人なら、たぶん当たり前のようにやっているであろうタイムスタンプの変更。
体裁を整えるためであれば問題ないのだけど、
マルウェアの動作による改ざんだったり、
勤務時間のごまかしのための改ざんだったりは問題大有り。

ただ、通常の方法での改ざんであれば、ちゃんと証拠は残る。
以下、ごく基本的な部分についてざっくりと説明。

※技術的な話はいらないという人は、一番下のまとめへGO

なお、今回の話は現在主流だと思われる
NTFS(Windows)とext4(Unix系OS)の2ファイルシステムが対象。

あとシステム時刻の変更は考慮しない(別途対策の前提)。
一般的な企業のActiveDirectory環境であれば、
時刻変更はリスクが大きすぎる(kerberos認証が通らなくなる)ため、
権限管理で変更できないようにしてる場合が多いはず。

そもそも、タイムスタンプって何?

そもそもタイムスタンプとは?というところ。
通常のファイルシステムでは、ファイルを変更した日時とかアクセスした日時とかを記録している。
これがタイムスタンプ。
タイムスタンプの情報は、各ファイルの中に記録されるわけではなく、
ちょっと離れたところにある専用の領域に記録されている。

  -NTFSならMFT(マスターファイルテーブル)
  -Unix系ファイルシステムならinode
  
と呼ばれるところ。
なお、これらの領域には他にもファイル名とか各属性とかが記録されている。

同じメタデータでも、画像ファイルのexifなんかはファイル本体に記録されているので注意。

タイムスタンプの種類 --MACtime +α

タイムスタンプとひとくちに言っても、実はいくつか種類がある。
基本はいわゆるMACtimeというやつ。

 -Modify time (更新日時) 
    ※以下 、mtime
 -Access time (アクセス日時)
    ※以下、 atime
 -Change time (変更日時)
    ※以下、ctime

これらの頭文字を取ってMACtime。

ここで一つ気になるのが、mtimeとctimeの違い。
更新時刻と変更時刻って何が違うの?という点。

ファイルの内容自体が変更された時に記録されるのがmtime、
内容を変更した時に加えMFTやinodeが変更されたときにも記録されるのがctime。

ちょっと分りづらいけど、
mtimeはファイルの中身を編集すると変わり、
ctimeはそれに加えファイル名を変更した時も変わる、
ということ。

NTFSやext4ではこれらに加え、

 -Creation time (作成日時)
    ※以下、 crtime

という情報も持っている。

Unix系のファイルシステムは作成時刻を記録しないと思われがちだけど、
ext3、ext4では拡張属性としてcrtimeを持っている。
lsコマンドやstatコマンドでは表示されないので、確認したいときはdebugfsのstatを使う。
debugfsは割と危険な操作なので注意。

debugfs
debugfsで確認するとちゃっかり存在するcrtime

ここまでは、NTFSとext4で概ね共通。

NTFSでは、ややこしいことにmtime、atime、ctime、crtimeの4つのタイムスタンプを

 -SI属性(Standard Information Attribute)
 -FN属性(File Name Attribute)

という2つの属性でそれぞれ持っている。
つまり、8種類のタイムスタンプを持っている、ということ。
エクスプローラやファイルのプロパティ等で表示される情報は、この内SI属性のもの。

ここまでの内容をまとめると次のようになる。

ext4のタイムスタンプ(4種類)

 ・mtime
 ・atime
 ・ctime
 ・crtime

NTFSのタイムスタンプ(8種類)

 ・mtime(SI)
 ・atime(SI)
 ・ctime(SI)
 ・crtime(SI)

 ・mtime(FN)
 ・atime (FN)
 ・ctime(FN)
 ・crtime(FN)

※2018/5/17追記
NTFSのタイムスタンプにはこの他にそれぞれのUTC系があるけど、本題とは特に関係ないからパス

変更できるタイムスタンプ、変更できないタイムスタンプ  --本題

さて、ここからが本題。
上で一覧にしたタイムスタンプだけど、簡単に操作することができるのはこのうちの一部。
つまり、簡単には操作できないタイムスタンプの内容を確認すれば、
ファイルが操作された日時を特定できるということ。

まず、ext4の場合。
タイムスタンプの書き換えと方法として一般的なtouchコマンドで操作できるのはatimeとmtime。
ctimeはやや高度な操作を行わないと変更できないので、ある程度信頼できる。
使い道があるかは分からないけど、critimeも恐らく変更が難しい。

NTFSの場合、容易に変更できるのは
mtime(SI)、atime(SI)、critime(SI)の3つ。

  mtime(SI) ➾ FileSystemInfo.LastWriteTime
  atime(SI)  ➾ FileSystemInfo.LastAccessTime
  critime(SI) ➾ FileSystemInfo.CreationTime

と、それぞれ.NET FrameworkのFileSystemInfoクラスのプロパティが対応していて、
PowershellのSet-ItemPropertyコマンドレットを使えば簡単にいじることができる。

ここで一つ落とし穴。
FN属性はAPIを通して編集することができないので信頼できると思いきや、それは間違い。
NTFSではファイルをリネームしたり同ドライブの別の場所に移動したりすると、
FN属性のタイムスタンプをSI属性のもので上書きする、という挙動になっている。
つまり、FN属性も実質改ざんし放題。

よって、NTFSにおいてある程度信頼性のある情報は、
ctime(SI)ctime(FN)の2つということになる。

まとめると次の通り。

■■ タイムスタンプの改ざん難易度 ■■

○:容易 △:容易だけど挙動を理解している必要あり ×:難しい

ext4

 ・mtime → ○
 ・atime  → ○
 ・ctime  → ×
 ・crtime → ×

NTFS

 ・mtime(SI) → ○
 ・atime(SI) → ○
 ・ctime(SI)  → ×
 ・crtime(SI) → ○

 ・mtime(FN) → △
 ・atime (FN) → △
 ・ctime(FN)  → ×
 ・crtime(FN) → △

信頼性のあるタイムスタンプの確かめ方

ここまでで、ext4のctime、NTFSのctime(SI)とctime(FN)が
簡単には改ざんできないものだということが分かった。

では、これらはどうやって確認すればいいのか。

ext4の場合、lsコマンドに-lcオプションをつけるか、
statコマンドを使うことでctimeを確認することができる。

NTFSの場合、デフォルトの機能でctime(SI)やctime(FN)を確認するのは難しい。
そこで、何らかの外部ツールを使って確認するのが良いと思う。
私は、fteというツールを使用している。
これは非常に優れたツールで、対象ファイルをドラッグ&ドロップするだけで
8種類のタイムスタンプを全て表示することができる。

まとめ

WindowsのエクスプローラやUnix系OSの(普通の)lsコマンド等で
表示できるタイムスタンプは容易に変更することができる。
ただ、WindowsでもUnix系OSでも、ctime(変更日時)の変更は困難。

つまり、ctimeを確認すればファイルの内容が変更された本当の日時が分かる。
ctimeは、Windowsならfteのようなツール、Unix系OSならlsコマンドの-lcオプションで確認可。

ただし、ctimeも絶対に変更できないわけではない。
inodeやMFTを直接いじる等強引に変更できる。

とはいえ、inodeやMFTの編集は、危険だしそこそこの技術のいる操作。
通常のタイムスタンプ改ざんであればこの方法で見破ることができるはず。

0 件のコメント :

コメントを投稿