読者です 読者をやめる 読者になる 読者になる

アンタイ・フォレンジック伝道者の独り言

基本的にはデジタル・フォレンジックの技術について取り扱っていますが、記載内容には高確率で誤りが含まれる可能性があります。

雑談:ハッシュ計算の手順を考えてみる

Twitter での流れから、物理複製時のハッシュ計算について少し整理してみたいと思います。注意点ですが、下記は特定製品やツールについて言及しているわけではなく、こういった機能を持っている装置なりが存在するか確認せずに書いています。あくまで一般論ということでお願いします。

また前提として、複製先のハードディスクは事前にWipe処理により全てNULL(ゼロ埋め)されており、エラーセクターが無い事が確認されているとします。(対象HDDはATA規格)

 

複製元ハードディスク内のデジタルデータを、複製先ハードディスクへコピーする場合、まったく同一のセクタ数でない場合があります。複製元が100GB、複製先が500GBの場合に、100GB分だけコピーする事も可能ですが、HPAまたはDCOで複製元のセクタ数と一致するように、複製先のHDDでHPAを使いアクセス可能なセクタ数を制限しておくことにします。この場合、複製先はあたかも100GBのように見えます。

 

では次に、コピーを行うわけですが、一般的に物理複製と呼ばれていると複製元セクタを複製先セクタへセクタ単位でコピーする方法は下記の流れになります。
手順A:

  1. 複製元セクタのデータを読んで、複製先セクタへ書き込む
  2. 比較機能(コンペア)がある場合には、コピー時に比較され同一か確認される

この方法によりコピーされた場合、比較機能により複製元と複製先が同一かを確認されていますので、複製先ハードディスクのデータ内容は複製元と同一となるはずです。

この複製先ハードディスクを、書き込み禁止措置(ライトブロック)した状態で扱えば良いわけですが、後日、複製元と同じか?を確認したい場合には再度複製元と比較処理を行う必要が出てきます。このような時にハッシュ値が計算されていると、同一性の確認がやりやすくはなるはずです。


手順B:

  1. 複製先セクタのデータを読んで、複製先セクタへ書き込む
  2. コピー完了後、複製先ハードディスクのコピーした範囲を対象にハッシュ値を計算する

複製先ディスクのデータ内容について、後日、複製元と同じか?を確認したい場合には、コピー作成時のハッシュ値と、現在の複製先ディスクのデータ内容のハッシュ値を比較し同じであれば良いという事になります。もし違っていた場合、複製先ハードディスクの内容に変更があった、または機器故障などの影響が考えられます。

この手順Bでは、比較処理を省略しています。

装置は正しくデータを読み、複製先へコピーを行っているという前提にしています。比較処理を入れると確実であるかのように考えられますが、本当にその比較処理は必要なのでしょうか?

また、複製元ディスクのハッシュは上記では計算していません、装置が正しくデータをコピーしていれば複製先は同じはずです。では複製元のハッシュ値と複製先のハッシュ値を比較した方が良いケースはどういった場合でしょうか?

一つ考えられるのは、複製先へ書き出した時に何かしらの理由(装置やケーブル等の不具合など)により、正しく書けないケースが考えられます。

この場合、装置は正しくデータを読み取り、書き込みを行ったと考えていますが、実際に書き出したデータが破損していたという状況です。手順Bではそれが検知できないのではないでしょうか。

そこで、読み取り段階で計算されたハッシュ値と複製先ハードディスクのハッシュ値を計算し一致するかを確認することで、複製先の破損を検出する事ができます。

手順C:

  1. 複製先セクタのデータを読んで、複製先セクタへ書き込む
  2. この時、読み取ったデータのハッシュ値を計算する
  3. コピー完了後、複製先ハードディスクのコピーした範囲を対象にハッシュ値を計算する
  4. 読み取り時に計算されたハッシュ値と、複製先ハードディスクで計算したハッシュ値が一致するか確認する

この流れは、装置ではなくソフトウェア(ツール)を利用する場合の流れと基本的には同じになるかと思います。装置が読み取り段階でハッシュを計算できない場合には、コピー後に複製元のハッシュ値も計算する必要が出てきます。

エラーセクターが存在する場合、複製元と複製先のハッシュ値は一致しないケースがほとんどです。複製元のエラー範囲が広がる危険性もあるので、コピー段階でエラーセクタが検出されている場合には、複製元のハッシュ計算を別途もう一度行うのは避けるべきだと考えます。エラーセクタの位置や数などの記録を残す必要があります。

 手順D:

  1. 複製先セクタのデータを読んで、複製先セクタへ書き込む
  2. この時、比較処理を行い同一かを確認すると共に読み出し時点でのハッシュ値を計算しておく
  3. コピー完了後、読み取り時に計算されたハッシュ値を記録として残す

比較処理を入れてみました、この場合にはコピー段階で比較処理がされているので正しく書けている事は確認できていますので、ハッシュ値を記録しておけば良いように見えます。

手順Dは、後から複製先のハッシュ値を計算する必要がなく、時間のロスが一番無いのではないでしょうか。残念ながらこの実装がある装置が存在しているか私には分かりません。

 

ハッシュ値の計算には、時間がかかります。100GBをコピーした場合、複製先100GBのデータを全て読み取り、ハッシュ値を計算する必要があります。

計算しやすくする為、10GB/分 として考えた場合でも、100GB は 10分かかる計算になります。(実際には読み取りと計算なので現実はもっと早いかもしれません、ハッシュ計算に専用チップを割り当て計算速度を上げる工夫をしている装置などもあります)

1TB が対象になると、更に10倍かかり 100分(1時間40分)必要になる計算ですが、これがコピー時間にプラスされる事になると、かなりの待ち時間が発生する事になります。かつ、これがディスク1本毎に発生しますから、複数のディスクを対象に行うとなると、装置なりの数もそれなりに必要になってきます。

最近では、1T より大きい 2T や3T、4Tといったサイズのディスクも存在しています、仮に 4T のディスクであれば4倍して 400分(6時間)が必要になる計算です。ディスクの速度も上がっているので、現実にはもっと早く終わる可能性もあるとは思いますが、いずれにしてもかなり時間がかかる作業だと個人的には感じています。

手順Cの場合、コピーしてからハッシュ計算になるので、コピー⇒ハッシュ計算の完了までに4Tでは12時間かかる計算になりますが、最新の装置であっても4Tを12時間で完了できる気が私はちょっとしません。(カタログ上のスペック値だけで計算すると、かなり余裕なんですが。。。実際の速度は複製元や使う装置に依存しますね)

1対2でコピーを行い、コピーの片方を使いハッシュ値のベリファイを解析作業と並行して進める案もあるかもしれません。

 

ハッシュ計算はレガシー・フォレンジックでは長らく使われている手法の一つですが、この部分も数年後には量に対して現実的でなくなる可能性があるのではないでしょうか。(逆もありSSDなど高速化されているものは従来より短い時間で対応できるケースもありえます)

また、物理コピーには、コピー速度が速いという高い利点があり、短い時間で解析に入る事ができるというメリットがあります。もし、コピー作業に時間がかかるようになると、解析に使える時間が圧迫される可能性があります。

 

 

<脱線>

最近は、トリアージ的な考えでまず必要なものだけ取り出して作業を開始する考え方もありますが、組織やケースによっては手続き又は手順の変更が必要なケースもあるのかもしれません。(トリアージで取得したデータサイズは小さいものが多いでしょうから、ハッシュ計算するコストはそれほど高くないはずです)

ここでは複製元が死んでいる、動いていない状況を想定していますが、Live での対応は更に別の視点になるはずです。今後、即応性が更に求められてくるようなる場合に、正しい手順や方法を再確認した方がよいのかもしれません。(部分的なコピーは昔からあると思いますので、改めてイチカラのお話ではないとは思いますが)