高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先


テクニカル Q&A

FL11 - Macintosh パーティションを対象とする安全な消去、アクセス、およびアンマウント
(1999 年 1 月 11 日)


Q: 消去したボリュームのデータは容易に回復できるという話を聞きました。現在、ディスク上のデータの機密性に関心を持っていて、Macintosh ディスクパーティションの内容を安全に消去する (そして、Mac OS ボリュームとしてそのパーティションを自動的に再初期化する) コードを書こうとしています。データに繰り返しゼロを書き込もうとしたのですが、終始何らかの絶対的な方法でパーティションへの書き込みアクセスを得る方法がわかりません。どうすればこの処理を実現できますか。

A: まず第 1 のアドバイスは、データの機密性を保証する最善の方法はクリアテキストのデータを絶対にディスクに書き込まないということです。このためには、PGPdisk などを使って情報をディスクに書き込む前に自動的に暗号化します。

他に検討すべき問題があるとすれば、それは、ゼロと 1 が交替するパターンを単純にディスクに書き込んでも、ドライブを "安全に消去" するためにはもはや十分ではないということです。磁気メディア記録の消去バンドの動作や、磁気メディアを分析するための磁力マイクロスコピーの実用化に関する最近の研究は、消去されたデータを不法に回復することが容易に実行できることを示唆しています。さらに、メディア消去のガイドラインが最近のディスクドライブで使用されている磁気エンコーディング方式にとっては不十分ではないかという指摘もあります。このため、どんなパターンを書き込むかを考えることが科学そのものといえます。この問題の詳細については、Peter Gutmann の「Secure Deletion of Data from Magnetic and Solid-State Memory」という論文を読むことをお勧めします。

パターンを書き込むということが前提であれば、Mac OS ボリュームを消去する最善の方法はディスクドライバを介してパーティションそのものにアクセスすることです。ディスクドライバの refnum とボリュームの長さがわかれば、ディスクドライバに対するローレベルの PBWrite を呼び出して、簡単にパターンを書き込むことができます。

このための第 1 段階は、Mac OS ファイルシステムで使用されているデータ構造に習熟することです。この問題の詳細は、すべて「Inside Macintosh: Files」および「Inside Macintosh: Devices」で説明されています。

また、MacsBug を使って 'vol' および 'drive' コマンドを入力し、筆者の説明したことを確認してもかまいません。'vol' を使ってボリュームテーブルをダンプし、さらに VCB アドレス (xxxxxxxx) を取得して、'DM xxxxxxxx VCB' と入力してそのアドレスをダンプします。

コードで必要とされる処理は以下のとおりです。

  1. 対象となるボリュームについて PBHGetVInfo を実行し、ioVDRefNum および ioVDrvInfo の値を記録します。これらの値はあとでディスクドライバに送る必要があります (「Inside Macintosh: Files」の2-145 ページ以下を参照してください)。この処理を簡単に行うには、DTS developer CD に用意されている MoreFiles サンプルコードの一部を再利用します。特に、MoreFilesExtras.c の FindDrive 関数を使用してください。この関数は vRefNum と DrvQElPtr を返します。

  2. 次に必要になるのは、ボリュームのサイズを計算して記録することです。この処理を簡単に行うには、ボリュームの vRefNum を渡して、MoreFiles のコード GetDiskBlocks (MoreFilesExtras.c に含まれる) を利用します。

  3. 次のタスクは Mac OS ファイルシステムからボリュームをアンマウントすることです。このためには、ioVRefNum を渡した PBUnmountVol を呼び出します。一部のファイルがオープンされているためにアンマウントに失敗するという場合もあります。PBUnmountVol 呼び出しが fBusyErr を返すかどうかでこのことがわかります。この時点で、ユーザはオープンファイルをクローズするか、それらのファイルをオープンしているアプリケーションを終了する必要があります。

    プログラムを使ってこの操作を実行する場合は、ボリュームの vRefnum と開始インデックス 1 (ioFCBIndx で) を渡した PBGetFCBInfo を呼び出して、オープンファイルのテーブルを構築します。さらに、ファイルをオープンしている可能性のあるアプリケーションのリストをユーザに提示する必要があります (ファイルタイプ 'APPL' を見て、アプリケーション名を解決します)。

    もちろん、Appleイベントを使ってボリュームのアンマウントを Finder に要求するという方法もあります (むしろ、この方法をお勧めします)。

  4. ボリュームがファイルシステムからアンマウントされた後は、ローレベルの PBWrite 関数を呼び出してパーティションにアクセスすることができます (「Inside Mac: Devices」の1-73 ページ以下に説明されている方法で)。

    なお、PBWrite 関数には、ioVRefNum フィールドでドライブ番号 (PBHGetVInfo 関数の ioVDrvInfo フィールドの値) を渡すだけでなく、ioRefNum フォールドでドライブ参照番号 (PBHGetVInfo 関数の ioVFRefNum フィールドの値) も渡す必要があります。

  5. 独自のフォーマットパターンを書き込んだ後は、PBMount を使ってボリュームの再マウントを試みることができます。PBMount により、ファイルシステムはパーティションを Mac ボリュームとして再初期化するかどうかをユーザに問い合わせます。
以上の説明から、デバイスマネージャを使ったパーティションへのアクセスが非常に容易であることはわかると思います。しかし、これまでの経験から、この種のコードを書くことがかなり危険であることも警告しておきます。この種のコードの開発は必ず日常業務に使用していないコンピュータで行ってください。そうでないと、重要なファイルを失ってしまう危険があります。十分に注意してください。

-- Vinnie Moscaritolo
Worldwide Developer Technical Support