証拠の調べ方の基礎

レッスン 4-4

消えた物ではなく、残った物から組み立て直します。

目安 60 分 トラック 4 検知と対応の 4 本目

読み終えたら自分の VM の出来事を、時系列で組み立て直せる

この頁の流れ

  1. 1なぜ通るのか
  2. 2脆いコードと直したコード
  3. 3ログでの見え方と検知
  4. 4直し方と確かめ方
  5. 5関わる事例
  6. 6確認クイズ
  7. 7説明課題
  8. 8一次資料
  9. 9次へ

デジタルフォレンジック (機器に残った記録を、証拠として使える手続きで集めて調べること) の基礎を扱います。消えやすい物から集める順番、ハッシュで証拠が変わっていないことを示す方法、機械ごとの時刻のずれをそろえて時系列を組み立て直す方法を、手元の小さなコードで比べます。

出典を確かめた日 2026年10月27日

なぜ通るのか

侵入の疑いが出た朝、担当者が気を利かせて、怪しいサーバーにログインして記録を開き、要らなそうなファイルを消し、再起動します。昼に専門の調査会社が着いた時には、メモリの中身は消え、ファイルの更新の時刻は担当者の操作で書き換わり、どれが攻撃者の跡でどれが担当者の跡かを分けられなくなっています。

調べることは、触ることです。触り方を決めないまま調べると、答えを出すための材料をこちらで壊してしまいます。このレッスンでは、何から集め、どう写し、どう並べるかを扱います。

デジタルフォレンジックとは

警察庁は、デジタル・フォレンジックを、犯罪の立証のための電磁的記録の解析技術とその手続きと説明しています。電磁的記録は大事な客観証拠になる一方で、消すのも書き換えるのも簡単なので、適正な手続きで解析し、証拠にすることが重要だとしています。

会社のインシデント対応でも考え方は同じです。NIST SP 800-86 は、調べる流れを 4 つの段に分けています。

段すること
収集記録を、元を変えないように集め、だれがいつ扱ったかを残す
検査集めた中から、関わりのある物を取り出す
分析取り出した物から、何が起きたかを組み立てる
報告分かったこと、分からなかったこと、使った手順を書く

消えやすい物から集める

RFC 3227 は、消えやすい物から順に集めるよう勧め、ふつうの機械での例を挙げています。電源を切ると消える物ほど先です。

順物
1CPU のレジスタ、キャッシュ
2経路の表、ARP の表、処理の一覧、カーネルの統計、メモリ
3一時的なファイルの置き場
4ディスク
5遠くに送った記録と見張りのデータ
6物理の構成、ネットワークの形
7控えの媒体

同じ RFC は、集める作業そのものが中身を変えうることにも注意しています。調べる側が持ち込んだ道具で読み、元の機械の道具はできるだけ使いません。

証拠の完全性と、扱いの記録

集めた物が、集めた時のままであることを示すには、ハッシュを使います。NIST SP 800-86 は、元のデータと写したデータのメッセージダイジェストを計算して比べ、写しが同じであることを確かめるよう書いています。1 ビットでも違えば、まったく違う値になるからです。

もう 1 つ要るのが、扱いの記録 (chain of custody) です。RFC 3227 は、証拠がどこで見つかり、どう扱われ、だれが触ったかを、すべて説明できるようにしておくよう求めています。

時刻はずれている前提で並べる

時系列を組み立てる時、いちばん間違えやすいのが時刻です。NIST SP 800-86 は、ファイルの時刻が正しくない理由として、機械の時計が正しい時刻と合わせられていないこと、秒や分が記録されていないこと、攻撃者が時刻を書き換えたことを挙げ、機械ごとの時刻、日付、時間帯の設定を知っておくよう勧めています。

脆いコードと直したコード

ラボの中の小さな関数で比べます。Python に付いている物だけで動き、自分の VM から持ち出した記録の写しだけを扱います。

文字のまま並べるか、協定世界時にそろえるか

脆いコード 時刻の文字列をそのまま並べる

Python

def timeline(rows):
    return sorted(rows, key=lambda r: r["time"])
直したコード 時間帯と時計のずれを直してから並べる

Python

from datetime import datetime, timedelta, timezone

def to_utc(text, tz_hours, skew_sec=0):
    t = datetime.fromisoformat(text)
    if t.tzinfo is None:
        t = t.replace(tzinfo=timezone(timedelta(hours=tz_hours)))
    return t.astimezone(timezone.utc) - timedelta(seconds=skew_sec)

def timeline(rows):
    return sorted(rows, key=lambda r: to_utc(
        r["time"], r["tz"], r.get("skew", 0)))

脆い方は、日本時間で書く Web サーバーの記録と、協定世界時で書く VM の記録を、文字のまま並べます。書式も時間帯も違うので、9 時間ずれた順番になります。直した方は、時間帯の無い時刻にその機械の時間帯を付け、確かめた時計のずれ (skew、進んでいれば正の秒) を引いてから、協定世界時で並べます。

写すだけか、写したことを示せるか

脆いコード 写して、そのまま調べる

Python

import shutil

def collect(src, dst):
    shutil.copy(src, dst)
直したコード ハッシュで同じことを確かめ、扱いを記録する

Python

import hashlib, json, shutil
from datetime import datetime, timezone

def sha256(path):
    with open(path, "rb") as f:
        return hashlib.sha256(f.read()).hexdigest()

def collect(src, dst, who, ledger):
    before = sha256(src)
    shutil.copy2(src, dst)
    after = sha256(dst)
    if before != after:
        raise ValueError("写しが元と違う")
    with open(ledger, "a") as f:
        f.write(json.dumps({
            "ts": datetime.now(timezone.utc).isoformat(),
            "who": who, "src": str(src), "sha256": after,
        }, ensure_ascii=False) + "\n")
    return after

脆い方では、写しが元と同じだと、あとで誰にも示せません。shutil.copy は更新の時刻も写さないので、写しの時刻は写した瞬間に変わります。直した方は、写す前と後のハッシュを比べ、更新の時刻ごと写す shutil.copy2 を使い、だれがいつ何を写したかを扱いの記録に足します。

これはラボの最小の形です。本物の調べでは、ファイル単位ではなく、ディスク全体をビット単位で写し (NIST はファイルの時刻を保つにはこの方法を使うよう勧めています)、書き込みを止める装置を通します。

ログでの見え方と検知

自分の VM で、ある晩に起きたことを 2 つの記録から並べます。Web サーバーは日本時間、VM は協定世界時で書き、VM の時計は 3 分進んでいたとします。脆い並べ方では、次のように見えます。

文字のまま並べたとき

記録

2026-10-27 10:05:00 web /admin へのログイン成功
2026-10-27T01:06:00Z vm 新しい利用者 backup2 を作成
2026-10-27T01:09:00Z vm cron に新しい行を追加

これでは、ログインのあとに利用者が作られたように見えます。時間帯と時計のずれを直すと、順番が入れ替わります。

協定世界時にそろえて並べたとき

記録

01:03:00 vm 新しい利用者 backup2 を作成
01:05:00 web /admin へのログイン成功
01:06:00 vm cron に新しい行を追加

利用者は、Web の管理画面へのログインより前に作られていました。入口は管理画面ではなく、別にあったことになります。並べ方 1 つで、塞ぐべき入口が変わります。

見る物なぜ効くか
機械ごとの時間帯と、時計のずれずれを直さないと、出来事の前後を取り違える
写しのハッシュが元と合うか合わなければ、写しから出した結論を使えない
記録の途切れや、時刻の巻き戻り攻撃者が記録や時刻を消したり書き換えたりした跡
調べる側の操作の時刻自分たちの操作を、攻撃者の跡と取り違えないため

直し方と、直ったことの確かめ方

自分の PC の中の VM だけで行います。会社や他人の機械には向けません。

  1. 練習用の VM を 1 台作り、ログインし、利用者を 1 人足し、cron に 1 行足す。それぞれの操作の時刻を手元のメモに書いておく
  2. VM の時計を date で読み、手元の正しい時刻との差を秒で控える
  3. 直した collect で、VM の認証の記録と cron の設定を写し、ハッシュと扱いの記録が残ることを確かめる
  4. 写しから行を抜き出し、時間帯と時計のずれを付けて、直した timeline で並べる
  5. 並んだ順番が、手元のメモと同じかを確かめる。違えば、どこで時刻を取り違えたかを書く
  6. 下の試験を足して通し、終わったら VM と作業用のフォルダごと消す
時間帯、時計のずれ、写しを固める試験

Python

def test_order_across_timezones():
    rows = [
        {"src": "web", "time": "2026-10-27 10:05:00", "tz": 9},
        {"src": "vm", "time": "2026-10-27T01:06:00+00:00",
         "tz": 0, "skew": 180},
    ]
    assert [r["src"] for r in timeline(rows)] == ["vm", "web"]

def test_copy_is_verified(tmp_path):
    src = tmp_path / "auth.log"
    src.write_text("login ok\n")
    ledger = tmp_path / "custody.jsonl"
    h = collect(src, tmp_path / "copy.log", "analyst-1", ledger)
    assert h == sha256(src)
    assert len(ledger.read_text().splitlines()) == 1

1 つ目の試験は、文字のまま並べる書き方に戻すと落ちます。2 つ目の試験は、写しのハッシュが元と同じで、扱いの記録が 1 行増えたことを確かめます。

調べの記録を 1 枚にまとめる

報告には、分かったことだけでなく、どう調べ、何が分からなかったかを書きます。

調べの記録の例

記録

対象   練習用 VM 1 台、Web サーバーの記録 1 日分
集めた物 認証の記録、cron の設定 (sha256 と扱いの記録あり)
時刻   VM は協定世界時で 180 秒進み、Web は日本時間
分かった 利用者の作成が、管理画面へのログインより 2 分早い
分からず 利用者を作った操作の送り元 (記録が無い)
次の手  VM の外への記録の送り出しを足す

関わる事例

記録が残っていたか、消されていたかで、分かることの範囲が変わった例が並びます。三菱電機は、一部の端末で、送り出されたファイルを特定するための記録が攻撃者に消されていたため、調査に時間を要したと公表しました。DMM Bitcoin について関東財務局は、行政処分の中で、流出の時の証拠保全のための記録の保存期間を検討しておらず、調査と原因の分析に要る証拠保全を適切に行っていなかったと指摘しています。

KADOKAWA は、2024年6月8日の未明に複数のサーバーにつながらなくなり、データを守るために関わるサーバーを急いで止めました。根本原因について、社外の専門の会社の調べでは、経路と方法は分からないものの、フィッシングなどで従業員のアカウントの情報を盗まれたことが原因と推測されるとしています。原因が「推測」にとどまることも、残った物から組み立て直す調べの限界を示しています。

止めるか動かしたままにするかは、守る物と失う物の比べです。前のレッスンで扱ったとおり、電源を切ればメモリの中の跡は消えます。止める前に、何を先に集めるかを決めておきます。

確認クイズ

1 問目

侵入の疑いのあるサーバーがまだ動いています。ネットワークからは切り離しました。最初に集める物として合うのはどれですか。

答えだと思う選択肢を押すと、その場で正誤と理由が開きます。

2 問目

Web サーバーの記録は日本時間、データベースの記録は協定世界時で書かれています。時系列を作る前にすることはどれですか。

答えだと思う選択肢を押すと、その場で正誤と理由が開きます。

説明課題

次のことを、自分の言葉で 3 行にまとめてください。書けたら、このレッスンは修了です。

  • 自分の VM で起きたことを時系列で組み立て直す時、集める順番、写した物が元と同じことの示し方、時刻のそろえ方
模範解答を見る

メモリや処理の一覧のように電源を切ると消える物から先に集め、ディスクや記録の写しはあとにする。写す前と後で sha256 を比べ、だれがいつ何を写したかを扱いの記録に残す。各機械の時間帯と時計のずれを控え、全部の時刻を協定世界時に直してから並べる。

一次資料

どれも 2026年10月27日に開いて、題と中身を確かめました。

次へ

次のレッスンは「机上の演習」です。ここまでの検知、対応、証拠の調べを、本番の前に机の上で通して、体制の穴を見つける方法を扱います。

次のレッスン 4-5 机上の演習

トラック 4 検知と対応の中で

前のレッスン 4-3 インシデント対応

ゆめさくセキュリティは、攻撃の仕組みを知り、自分の PC の中で壊して直し、守る側の判断を身につけるための学びの場です。

ラボはすべて自分の PC の中 (127.0.0.1) で閉じます。自分が管理していない相手に試すことは扱いません。