ファイルのタイムスタンプを改竄する方法

Linuxのファイルシステムの特徴

LinuxのEXT4やBrtfsやEXT3などのファイルシステムは、i-nodeとブロック領域の2つで構成されています。ファイルのデータはブロック領域に格納されます。そのブロックの管理領域には、ファイルの実データが格納されている位置やファイル・サイズ、変更時刻などの管理情報が記録されます。これがi-nodeです。

各ファイルやディレクトリのi-node番号を確認するには、ls -iコマンドを実行します。

また、各パーティションごとに使用されているi-node番号の総数は、df -iコマンドで確認できます。

ファイルのタイムスタンプ情報

ファイルブロックには、最終i-node更新時刻(ctime)、最終参照時刻(atime) 、最終ファイル更新時刻(mtime)を示すタイムスタンプが属性データとして埋め込まれています。それぞれ以下のコマンドで確認できます。

最終i-node更新時刻を確認

最終参照時刻を確認

最終ファイル更新時刻を確認

touchコマンドを使ってファイルのタイムスタンプを改竄する

touchコマンドを用いると、atime・mtimeは任意の時刻に改竄することが可能です。

これで今日(2013年8月2日)作られたはずのファイルが、2000年4月1日に作成されたことになりました。このようにtouchコマンドを使うと簡単にatime・mtimeのタイムスタンプを改竄することが可能です。しかし、最終i-node更新時を記録しているctimeはtouchコマンドでは日時修正が出来ません。このため、ctimeを見るオプションで見るとi-nodeの更新日時からファイルのi-nodeがいつ更新されているのか判明してしまいます。

ctimeのタイムスタンプを変更するには

では、ctimeを変更するにはどのようにすれば良いのでしょうか。i-nodeを直接書き換える必要があります。CentOSならば、debugfsコマンドでパーティションを書き込み可能にして、modify_inodeによって書き換えることが出来ます。その場合、Creation timeの部分で、UNIXタイムスタンプを入力します(ここでは2000年4月1日00時00分00秒の954514800を指定)。

これでctimeが2000年4月1日になります。EXT3のファイルシステムならば、ls -lcコマンドでもctimeが書き換わっていることが確認できます。しかしEXT4のファイルシステムの場合は、i-nodeにctimeの他にcrtimeという拡張情報が埋め込まれています。これはファイル作成日を示す情報で、この書き換えはdebuginfoのインターフェースではi-nodeを修正できません。

まとめ

mtime、atimeの書き換えならば容易で、これでlsコマンドで通常表示される時刻に関しては改竄が容易ですが、ctimeの書き換えになると若干複雑になります。さらにEXT4のファイルシステムではcrtimeの情報があるため、この書き換えを行うことが出来ません。ということで、セキュリティ的にはmtime、atimeの情報はあまり信用せず、ctimeないしcrtimeの情報を見た方が正確かと思います。

関連記事

この記事をシェアする