SMARTとアンチフォレンジック

少し前の話題で恐縮だが、今年の2月にGoogleからとてもおもしろいレポートがでた。内容については以下のブログなどで紹介されているが、これまでの常識に反して「HDDの故障率と温度やアクセス頻度とは関係がない」といった結果が統計データから得られている。ちょっと驚きである。

またこのレポートではSMARTの属性値とHDDの故障率の関係についても報告されている。それによると、SMARTによる故障予測は全然当てにならないが、いくつかの属性値(例えばRaw Read Error Rateなど、レポートでは Scan Errorsと表記されている)については有意な関連性があるとのこと。もっとも故障したHDDの約半分ではSMART値に異常はなかったとのことなので、HDDは何の前触れもなく突然死するものだと思っておいたほうがよさそうだ。


さてここからが本題。このSMARTだが、実はフォレンジックともおおいに関係がある。フォレンジックの解析を行う際、普通は対象機器のHDDのコピーを ddなどで取得し、コピーしたディスクイメージを調査する。問題はこの時HDDになんらかの痕跡が残るのかどうかだ。何故これが問題になるかというと、次にあげるような状況が考えられるからだ。

  1. あるユーザのPCまたはサーバが不正な侵入を受けた場合、侵入者の動きを監視したいのだが、どうやって侵入されたか調査する必要があるため、一度電源を落としてHDDのコピーを取得した。さて再起動後に侵入者が再びやってきたとして、HDDがコピーされたことを見破ることはできるだろうか?
  2. あるユーザがPCを紛失したのだが、次の日警察から連絡があり無事に戻ってきた。HDDの中身を分析したが特にタイムスタンプなど変更されておらず、紛失してから戻ってくるまでHDDにアクセスされた形跡はない。さてこのHDDの情報は漏洩していないと言えるだろうか?

まあ1.の状況はあまり想定しにくいが、2.の状況はありうるのではないだろうか。2.のケースは次のように言いかえてもいい。「PCを不正に入手した(または拾った)人はHDDのデータをコピーしているかもしれないが、それをあとから検知できるか?」

実は上記のような状況を想定して、SMARTとフォレンジックとの関係を調査したレポートが2005年5月に公開されている。このレポートでは Quantum、SeagateIBMWestern Digitalといった代表的なメーカーの7種類のHDDを調査しているのだが、この内容が先程のGoogleのレポートに負けずとてもおもしろい。(ということをGoogleのレポートを見ていて思いだした。)


いくつかポイントを紹介したい。

  • SMARTはコマンドでDisableに設定することが可能で*1、仕様では属性値の監視もデータの保存もしないことになっている。しかし調査したほとんど全てのHDDではSMART機能を無効にしたあとでも、Power_Cycle_CountやPower_On_Hoursの属性値が更新されていた。
  • Ctrl+Alt+Delまたはハードウェアリセットによりリブートした場合、Power_Cycle_Countの値は変更されない。
  • 大半のHDDは内部にクロック機構を内蔵しており、OS側でhwclock等でハードウェアクロックを設定したとしても、Power_On_Hoursの値が変更(増加)されるのを防ぐことはできない 。
  • Power_On_Hoursでは1時間未満の場合もちゃんとカウントされる。時間を細切れにしてもダメ。
  • 専用のHDD複製装置(Logicube)を使ってコピーした場合でも、Power_Cycle_Countの値は増加する。Power_On_Hoursは変化しない。
  • ライトブロッカーを使用した場合も結果は同じ。Power_Cycle_Countの値は増加する。Power_On_Hoursは変化しない。
  • SMARTの値はHDD内の特殊な領域にデータが保存されるため、同じ種類のHDDで回路基板を交換するなどしてもムダ。
  • BIOSの設定でSMARTを無効にできるPCもあるが、コマンドで直接無効にした場合と結果は同じ。


ということで、結局HDDのデータをコピーするために電源を入れるのであれば、SMARTの属性値が変更されることを防ぐことは不可能、というのがレポートの結論である。これは先程の想定される状況(2.)においてはむしろ朗報で、HDD内のデータは変更されていなくても、SMARTの値をチェックすればHDDへのアクセスがあったかどうかを検出できる。つまりデータがコピーされたかどうか、その可能性があるのかないのかを判断できることを意味している。もっともこれをやるためには、普段からSMARTの属性値(特にPower_On_HoursとPower_Cycle_Count)をどこかに記録しておかなければならないのだが。

*1:smartmontoolsを使うと簡単にできる。例えばこんな感じ。# smartctl -o off -S off /dev/hda; smartctl -s off /dev/hda