【ファイルカービング編】壊れたデータからファイルを救出する技術|CTF思考フレームワーク #47
こんにちは、アンペンです!
今回はフォレンジック応用編の第2弾、ファイルカービング(File Carving)です。ファイルシステムの目次が壊れていたり、領域が上書きされかかっている状態でも、バイナリの中身を手がかりに元ファイルを救出する技術です。
CTFのForensicsカテゴリでは『破損したディスクイメージから画像を取り出せ』系の問題で頻出です。
最初は『目次が壊れているのに、どうやって取り出すの?』と戸惑うはずです。でも、原理を一度つかんでしまえば、あとは“手順を回すだけ”の作業ゲーに変わります。コスパよく1問もぎ取れる、おいしい分野なんですよ。

『ファイルシステムが壊れてる』のに、どうやってファイルを取り出すの?

各ファイル形式には決まった『マジックナンバー』(先頭・末尾の合言葉)があるんだ。これを手がかりに、生のバイト列から『ここからここまでがJPGだ』って切り出すんだよ。
前回のステガノグラフィが“隠されたものを探す”話なら、今回は“壊れたものを救い出す”話。テーマはファイルカービング——ファイルシステムという『目次』がぐちゃぐちゃに壊れていても、データの本体さえ残っていれば、そこから元ファイルを切り出して取り戻す技術です。『削除したはずなのに復元された』というニュースの裏側も、まさにこれ。原理はとてもシンプルなので、肩の力を抜いて読んでください。
ファイルカービングは『マジックナンバー(ヘッダ/フッタ)を頼りに生のバイト列から元ファイルを切り出す』技術です。ファイルシステムが壊れても、領域が上書きされていなければ復元できます。foremost / scalpel / photorec / bulk_extractorが4大ツール。守る側というよりは『削除しても残る前提で運用する』のが教訓です。
この記事で分かること
- カービングの原理(マジックナンバー)
- 主要4ツールの使い分け
- 断片化・上書き・SSD TRIMという限界
- 『削除しても残る』前提の運用設計
📖 はじめてのWebセキュリティ #47|ファイルカービング編
壊れたデータからファイルを救出する技術を扱います。 シリーズ一覧を見る →
⚠️ 大事なお約束
他者のディスク・媒体から無断で復元行為を行うことは、業務上の権限や法律に違反する可能性があります。CTFや自分の検証ファイルのみで確認してください。
『マジックナンバー』を頼りに切り出す
普段ファイルを開くときは、ファイルシステムが『この名前のファイルはここからここまで』という情報を持っているおかげで、OSが中身を読み出せます。これが壊れてしまうと、OSはファイルを見つけられません。
イメージしやすいたとえで言うと、ファイルシステムは本の『目次』や『ページ番号』のようなもの。これが破れてしまうと、「どの章がどこにあるか」は分からなくなります。でも——本文そのもの(紙のページ)は、まだそこに残っているんですよね。カービングは、目次を当てにせず、ページの中身を直接めくって『あ、ここから物語が始まってる』と見つけ出す作業なんです。
カービングは、ファイルシステムを完全に無視して生のバイト列(raw bytes)だけを見ます。各形式の決まったヘッダとフッタを探し、その間を1ファイルとして切り出すのが原理です。
ここで言う“ヘッダ”と“フッタ”は、ファイルの『最初のひと言』と『最後のひと言』のようなもの。たとえば手紙なら「拝啓」で始まって「敬具」で終わる、と決まっていますよね。ファイルも形式ごとに“始まりの合図”と“終わりの合図”が決まっています。だからカービングツールは、延々と続くバイトの海の中から「拝啓…敬具」のかたまりを見つけて、まるごとすくい上げてくれるわけです。
図解:代表的なファイル形式のマジックナンバー
主要なファイル形式のヘッダ/フッタを覚えておくと、hexdump で開いただけでも『この辺にJPGがある』と気付けます。
ためしに画像ファイルを hexdump -C でのぞいてみると、いちばん最初に ff d8 ff という並びが見えます。これがJPGの“始まりの合図”。慣れてくると、ディスクイメージをスクロールしているだけで「お、ここでJPGが始まって、ここで終わってるな」と目で追えるようになります。最初は呪文に見えますが、よく出てくる数個を覚えるだけで十分戦えますよ。

シュレッダーにかけた書類でも、紙片の端の色や柄を手がかりに丹念に並べると元の文書が復元できますよね。カービングも同じで、ファイルシステムという『目次』が壊れていても、データの『端っこの形』(マジックナンバー)を頼りにすれば、内容物だけは取り出せます。

ここで覚える用語:マジックナンバー(Magic Number)
ファイル形式を識別するために、ファイルの先頭・末尾に置かれる固定バイト列です。JPGは FF D8 FF で始まり FF D9 で終わる、PNGは 89 50 4E 47 で始まる、など。Linuxの file コマンドはこの情報で『拡張子に依存せず』ファイル種別を判定しています。
主要4ツールの使い分け
foremost / scalpel / photorec / bulk_extractor
- foremost:ヘッダ/フッタベースの定番。設定簡単で初心者向け
- scalpel:foremostの後継。
scalpel.confで署名をカスタマイズ可能 - photorec:画像中心だが対応形式が広い。破損ディスクからも頑張る
- bulk_extractor:ファイル抽出+メアド/IP/カード番号などの『特徴抽出』
CTFでは『まず foremost、出てこなかったら photorec』が定石。実務では bulk_extractor が情報漏洩調査で威力を発揮します。
もう少しかみ砕くと、使い分けのコツは“二段構え”です。foremostは設定いらずで速い反面、対応形式は控えめ。だからまず一発、軽く当ててみる。出てこなければ、少し設定は要るけれどヘッダが多少欠けていても拾ってくれる粘り強い photorec に切り替える。そして実務で『誰が何を持ち出したのか』までたどりたいときは、メアドやカード番号といった“特徴”ごと拾い上げる bulk_extractor の出番、という具合です。
カービングの限界:『断片化・上書き・TRIM』
カービングは万能ではありません。3つの典型的な限界を知っておきましょう。
ここが大事なところ。カービングは魔法ではありません。『本文が残っていれば取り出せる』のであって、本文そのものが消えていたり、バラバラに散らばっていたりすると、とたんに苦しくなります。なぜそうなるのか、3つの“天敵”を押さえておきましょう。
- 断片化(Fragmentation):1ファイルが非連続な領域に保存されていると、単純なヘッダ→フッタ抽出では繋がらない
- 上書き(Overwrite):削除後に他のファイルで上書きされた領域は復元不可
- SSD TRIM:SSDのTRIM機能が動くと、削除と同時にゼロクリアされる
『何でも復元できる』ではなく、『運が良ければ復元できる』が正しい理解です。
この『運が良ければ』という感覚はとても大切です。攻める側(CTFプレイヤーや調査員)にとっては『ダメ元でも一度はかけてみる価値がある』を意味し、守る側にとっては『削除しただけでは安心できない、でも上書きやSecure Eraseまでやれば守れる』を意味する。同じ事実が、立場によって希望にも教訓にもなるわけです。

CTFでやってみよう:イメージから画像を抽出
自作イメージで foremost を体験する
目的は『生バイトからファイルが取り出せる』を体感することです。
- 適当な画像数枚を1つの
.imgファイルに連結(またはddでディスクを丸ごと取得) foremost -i input.img -o out_dirを実行- out_dir/ 配下にファイル形式ごとのディレクトリが作られ、抽出物が並ぶ
file out_dir/jpg/*.jpgで本当にJPGとして読めるか確認- 余裕があれば
photorecやbulk_extractorも同じイメージに当てて比較
ここまでは“救い出す”側の話でしたが、コインの裏側も見ておきましょう。『削除しても残る』という事実は、復元したい人には朗報でも、情報をきれいに消したい人にとっては悪夢です。だからこそ守る側は、この性質を前提に設計する必要があります。
守る側の教訓:『削除しても残る』前提
カービングは攻撃技術ではなく救出技術ですが、裏を返せば『削除しただけでは残る』という現実を示しています。守る側はこれを前提に運用設計しましょう。
- 機密データの保存は専用領域 / 暗号化ボリュームに限定
- 廃棄時は完全消去(shred / cryptographic erase / SED)
- SSDはSecure Eraseまたは暗号鍵廃棄で実質完全消去
- クラウドのスナップショット・バックアップの保管期間と削除手順を明文化
- 『ゴミ箱を空にした=安心』ではないことを社員教育

『目次が壊れても本体は残ってる』だから取り出せるんだね。

そう。だから廃棄するときは『完全消去』が必要。次回はマルウェア解析入門。サンプルの正体を静的・動的に暴く手法を扱うよ。
ここまでをひと言でまとめると、カービングは『目次を捨てて、本体を直接読む』技術です。だから目次(ファイルシステム)が壊れても平気な反面、本体(生バイト)が壊れていたらお手上げ、という性質を持ちます。この“何ができて、何ができないか”の線引きが、そのまま守る側の対策(完全消去)にもつながっていくんです。
まとめ:『ヘッダ/フッタ→切り出し→検証』
- カービングはマジックナンバーを頼りに生バイトから抽出
- 4大ツール:foremost / scalpel / photorec / bulk_extractor
- 限界は断片化・上書き・SSD TRIMの3つ
- 守る側は完全消去を運用に組み込む
今日の持ち帰りは『削除=消滅、ではない』。ゴミ箱を空にしても、上書きされていない限り本体は残り続けます。だからこそ、攻める側は“ダメ元で一度かけてみる”、守る側は“完全消去まで踏み込む”。この非対称さを覚えておくだけで、データの扱い方がぐっと丁寧になります。
次回はフォレンジック応用編の第3弾、マルウェア解析入門です。怪しいサンプルを静的・動的に解析して、何をするプログラムなのかを暴く手法を扱います。
