製品でデータの復元をお手伝いするために、私たちはさまざまな技術を使っており、この 10 年で築いてきた工夫の多くは水面下にあります。今回は、削除されたメッセージを復元するために使っている手法の 1 つ、SQLite データのフォレンジック復元を掘り下げます。
そもそも iPhone はどのようにデータを保存しているのか
簡単に言うと、多くのアプリはデータをデータベースに保存しており、その大半が SQLite 形式を使っています。SQLite はサーバー不要の小さくて優れたデータベース形式で、Apple やアプリ開発元のニーズにうまく合っています。SQLite は独立したデータベースサーバーなしで動作するため、ほかのデータベースとはいくつかの点で異なります。特に、高速にアクセスできるようにするため、使用中に定期的な自己メンテナンスを行うことができません。たとえばインデックスの整理のような定期メンテナンスの間、アプリの動作が遅くなってほしいと思うユーザーはいないでしょう。
SQLite でもこうした整理や最適化の処理を行うことは可能ですが、実行頻度は低めです。ユーザーにとっては、それが適切なバランスです。iPhone はそれなりに快適に動き、データも堅牢に保たれます。そしてこのメンテナンス処理の頻度が低いおかげで、必要になったときには、削除した iOS データを復元できる可能性が平均より高くなります。
あまり専門的になりすぎずに言えば、仕組みはとても単純です。これらのデータベースを、大きなファイルキャビネットのようなものだと考えてみてください。
- 情報を追加するときは、中身を説明するきれいなラベルを付けたファイルを入れます。iPhone もそのように動いています。
- ところが、データを削除するときは、ファイルをキャビネットから取り出すのではなく、iPhone はラベルをはがすだけです。つまり古いデータは取り除かれず、ラベルのない状態で残されます(技術的には「孤立」と呼ぶこともあります)。そのため、データを削除するときに、キャビネットの空きを確保するという比較的遅い処理を行う必要がありません。「これはもう忘れよう」と言って、先へ進むだけです。
- さらにデータを追加するときは、空きがあれば iPhone は新しいファイルを追加します。空きがなければ、ラベルのないファイルが残っていないか探し、あれば、空きを作るために必要な部分を捨てます。
ここから分かるのは、iPhone ではデータの削除が速く、空きがあれば追加もかなり速いということです。そして、直感には反しますが、古い情報が実際に消えてしまうのは、新しいデータを追加するときなのです。
iOS の SQLite から削除された情報を復元する
iPhone を数か月使ったとしましょう。内部のデータベースは、先ほど説明したファイルキャビネットのようなものです。中には多くのファイルが入っていて、データを削除した場所にもファイルは残っていますが、2 つの注意点があります。部分的または完全に上書きされている可能性があること、そしてラベルが付いていないことです。
復元の手法は、ほぼ想像どおりです。こうした孤立したファイル(完全なものも、そうでないものも)を見つけ出し、それらがどこに収まるのか、意味を成すだけのデータが残っているのかを探ります。ご想像のとおり、どれも少し面倒な作業で、ほかにもさまざまな技術的な問題が持ち上がって作業を難しくします。特に、数メガバイトを超える大きさのデータベースや、バイナリデータを含むデータベースは、作業をはるかに難しくします。
とはいえ、一部のデータを取り戻すのはそれほど難しくありません。市場に、これができると謳うツールが数多く出回っているのはそのためです。こうしたツールは、大きく 3 つに分けられます。
- 良いもの。削除や破損の事例を数千件も使って構築、検証された、さまざまな手法を使っています。
- 悪いもの。完全な形で残っていて、どこに属するかを示すヒントが多く含まれているコンテンツしか復元できません。
- ひどいもの。孤立したコンテンツをスキャンして、文脈に合いそうに見える古いゴミを何でも拾い上げます。目を細めて見れば、の話ですが。「NSMutableArray」は、なくなった連絡先レコードの名前かもしれません。うーん。
実環境での iOS の SQLite 削除データの復元
仕組みについて少し説明したところで、実環境でどれだけ効果があるのかを見ていきましょう。結局のところ、私たちは、専門家でなくても一般のユーザーがデータを取り戻せるようにしたいと考えています。それが実現できているでしょうか。主要な SQLite 復元ツール 4 つを、iPhone Backup Extractor と比較してベンチマークします。執筆時点での、各ツールの最新バージョンは次のとおりです。
| 名前 | バージョンとリリース日 | 対応プラットフォーム | 価格 |
|---|---|---|---|
| Reincubate iPhone Backup Extractor | 7.6.1.2201、2018 年 5 月 | Windows と macOS | $34.95 |
| SQLabs の SQLite Doctor | 1.3.0、2013 年 8 月 | Windows と macOS | $49 |
| SysTools の Sqlite Database Recovery | 1.2、リリース日の記載なし | Windows のみ | $149 |
| Stellar Data Recovery の Stellar Phoenic Repair For Sqlite 1.0、リリース日の記載なし | Windows のみ | $599 | |
| GetData の Forensic Explorer (FEX) | 4.3.5.7364、2018 年 5 月 | Windows のみ | $1,695 |
| Acquire Forensics の Sqlite Forensics Explorer | 2.0、リリース日の記載なし | Windows のみ | $149 |
このテストを行うために、実環境のデータがぎっしり詰まった大きなデータベースを使います。今回は、iOS 11 が動作する iPhone から取得した、169 MB の「Messages」データベースです。見てみましょう。次のコマンドは、ファイルサイズと、メッセージが何件含まれているかを数えるクエリの結果を示しています。
$ ls -l sms.db
-rw------- 1 afitzpatrick 177565696 Oct 2 2017 sms.db
$ sqlite3 sms.db
SQLite version 3.19.3 2017-06-27 16:48:08
Enter ".help" for usage hints.
sqlite> SELECT COUNT(*) FROM message;
220261
つまり、22 万件を超えるメッセージがあります。これらは削除されていないメッセージです。では、復元ツールは削除されたメッセージをどれだけ見つけられるでしょうか。
iOS の SQLite データ復元:結果発表
上記のツールをすべて同じファイルに対して実行し、結果を下の表にまとめました。Mac を使いたかったのですが、すべてのツールが macOS に対応しているわけではないため、RAM 16 GB の PC で Windows 10 Pro(バージョン 1803、ビルド 17134.48)を実行して使用しました。
| Reincubate | Acquire Forensics | SQLabs | SysTools | Stellar Data Recovery | GetData | |
|---|---|---|---|---|---|---|
| 復元件数 | 342 | 56 件(ただしほとんどがゴミ) | 0 | 0 件(長時間のスキャンの後、220,261 件を検出しましたが、これはすでに存在していた有効なレコードの数と同じです) | 0 件(実行するたびに削除済みメッセージを 37 件までカウントしましたが、処理を終える前にエラー 0x40000015 でクラッシュしました。エクスポートも保存もできませんでした) | 0 (We reached out multiple times to purchase a license, but never heard back.) |
| 「ゴミ」データの復元 | なし。すべて、削除されていない有効なメッセージのようです。絵文字、日付、時刻、送信者・受信者の番号もすべて復元されています。 | 復元されたもののほとんどがゴミ | ROWID の最大値を手動で何度か入力し、さまざまなパラメータを試す必要がありました。どの時点でも何も復元されませんでした。 | すでに存在していたメッセージしか見つかりませんでした。 | 毎回クラッシュしたため、判断できませんでした。 | Wasn’t possible to get it running. |
| 復元したメッセージ 1 件あたりの実質コスト(この例の場合) | $0.10 | $2.66 | >$49 | >$149 | >$599 | >$1,695 |
さて、これは少し驚きでした。どのツールも少なくともいくらかのデータは復元できると思っていたからです。私たちのささやかなツールが、SQLite データ復元専用のツールではないにもかかわらず、この分野で市場をリードしていることが分かりました。(不思議に思われたかもしれませんが、私たちが自社の技術をほかの企業にライセンス提供しているのは、このためです。これは本当に難しいのです。)
iOS のバージョンごとの SQLite データ復元
iOS の新しいリリースのたびに、Apple は OS による SQLite データベースの扱い方を変更できます。これには、整理などのメンテナンス処理をどのくらいの頻度で、どのタイミングで実行するかといった最適化も含まれます。
デバイスの性能が上がるにつれ、ユーザー体験への影響が小さくなるため、こうした処理をより自由に使えるようになります。そのため、世代が新しくなるたびに SQLite データベースはより頻繁に整理される傾向があり、通常の操作でデータベースを高速に使えるという利点があります。これは、不要なデータがデバイスに残らないため、ユーザーのデータ保護とプライバシーを強化するという Apple の目標にも沿っています。ただしその代わり、SQLite の手法によるデータ復元ができなくなるという欠点があります。
iOS 11 では、SMS と iMessage のデータベースの整理が増えていることが分かってきました。復元は今でも可能で、その後に削除された比較的新しいメッセージほど復元できる可能性は高くなりますが、保証はされません。
iOS 12 では、SMS と iMessage のデータベースの整理頻度が大幅に増えました。このリリースはメンテナンスと速度の改善に重点を置いていると謳われていたため、この変更は納得できるもので、より一般的な操作の動作が滑らかになると考えられます。
iOS データを復元するときに、これを活用するには何をすればよいですか?
おそらくここが一番良い点です。この技術は Reincubate iPhone Backup Extractor に統合されており、初期の頃からずっとそうなっています。アプリを使っている間、メッセージやほかの多くの種類のデータをプレビューまたはエクスポートするときに、この技術が適用されます。表示しているデータや表示方法に応じて、どのデータが削除から復元されたもので、どれがそうでないかがアプリに示されます。すべて標準で含まれています。






