『みずいろ』HDDフォーマット事件は本当だったのか検証する

f:id:castaneai:20200912181035p:plain

あるとき、ネット上でこんな事件の噂を発見した。

『みずいろ』 HDDフォーマット 事件

エロゲー業界を彩る悲惨な事件は数多あれど、威力と内容を考えて4番を張れるものといえば、やはりこれだろう。2001年、ねこねこそふとから発売された『みずいろ』初回ロット版に限り、アンインストールするとHDDの他のデータを巻き込んで吹っ飛ばす、という恐るべき不具合が発生していた。実はこの件、「インストールしたフォルダをまるごと消す」(当時は、自動で「mizuiroフォルダ」などを作らなかったので、たとえばProgram Fileフォルダに直接インストールしてしまうと、アンインストール時にProgram Filesフォルダそのものを削除していた)というものと、「インストールしたフォルダ外のデータを消すことがある」という話が出ていて、不具合な正確なところは私も把握していないのだが、とりあえずヤバいバグということは間違いなく、その後の対応を巡る問題なども相まって、大騒ぎになった。最近、オンラインゲームの「PSO2」でアップデートによってHDDのデータが削除される事件が起きたが、「みずいろテロの再来」などと言われており、歴史に残る事件として絶大な知名度を誇っている。 その華々しさや、被害の大きさは、4番サードにふさわしい大物と言えるだろう。

よい子わるい子ふつうの子2(仮) : エロゲーで起こった「悲惨なできごと」で打線組んでみた。

ソフトウェアの不備により予期しないファイルまで消されてしまう事件はこの他にもいくつか見たことがあるが、この「みずいろ」の事件はひとつ不明瞭な点がある。

「インストールしたフォルダ外のデータを消すことがある」という話が出ていて、不具合な正確なところは私も把握していない

インストールしたフォルダ外のデータを消すことがある・・・?

ファイルのチェックをせずに、フォルダまるごと消してしまう…であれば想像はつくが、外側にあるファイルまで消すという実装は本当なのだろうか?

ここが曖昧になっているため、Googleで「みずいろ HDD」等で検索すると「アンインストールするとHDDがすべて消去される」という恐ろしい噂になっていたり、「いやいや、さすがにインストールしたフォルダ外を消すことはないよ」という控えめな説もあり、どれが正しい情報なのか一見わからない。

どこまでが本当なのか、より詳しく調査

一体上の噂のどこまでが本当なのか、気になったので資料を探してみた。 すると、事件当時の2ちゃんねるのスレッドのログが見つかった。

「みずいろ」巻き添えアンインストール問題

ここを読んでいくと、勇敢にもファイルが消える問題を繰り返し検証している人がいて、 すこしずつアンインストーラーの挙動が明らかになってきた。

461 :名無しさん@初回限定:01/08/30 03:40 ID:hnFKWKIo
出来た~~~!!w
インストーラーはネットで落とした修正版。
「D:Game\mizuiro」にインスト。
んで「D:Game\ねこねこ」を作って
「D:Game\ねこねこ\mizuiro」にフォルダ移動。
インストーラー起動で「削除」をやったら・・・
なんと、「デスクトップ」にあった
ショートカットやらフォルダやらが消えた!w
(デスクトップはCドライブ上ですw)
472 :461-463=468 :01/08/30 04:46 ID:plHqinzU
検証2回目w

・DLしたインストーラー使用。
「D:Game\mizuiro」にインスト。
んで「D:Game\ねこねこ」を作って
「D:Game\ねこねこ\mizuiro」にフォルダ移動。
ココまでは一緒ね。

んで、インストーラを「D:Game\ねこねこ\mizuiro」に移動。
そうしたら、インストーラー以外の全ファイル削除された。

あと一回やってみるけど、多分

■インストール先を変更すると、
インストーラーが置いてあるフォルダ以下全て削除

だと思う。

この2つの書き込みを見る感じ、インストール後にフォルダを移動や削除などすると、Setup.exeの置いてあるディレクトリ以下を消してしまう挙動があるらしい。

さらに読みすすめると、次のような推測がされていた。

621 :名無しさん@初回限定:01/09/02 07:57 ID:tuirHXtA
要はカレントディレクトリをインストールフォルダに移動できなかった場合のチェックを
怠ってて、移動したつもりで、setup.exe起動時のカレントディレクトリ以下をごっそり削除に
いっちゃうって事かな。
setup.exeが削除されないのは、Windowsは実行中のファイルを削除することができない
からやね。

なるほど、確かにSetup.exeと同じ階層を消してしまうという挙動もこの推測を読むと納得感がある。

推測は本当か、確かめにいく

2ちゃんねるのスレッドに書かれた推測はいかにも正しそうだが、推測の域を出ないため本当にそうなのかは気になるところ。

というわけで、Amazonで「みずいろ 初回版」の中古品を購入して試すことにした。

f:id:castaneai:20200904003518j:plain

※注意

  • 「みずいろ」は18歳未満の方は購入できません。
  • ファイルが消えます。もし試す場合は必ず仮想環境で行ってください。
  • 試す場合は自己責任でお願いします

Windows Sandboxを利用した仮想環境の準備

アンインストーラーの挙動を安全に試すために、次のような環境を準備した。

ファイル 役割
scripts/install.reg 「みずいろ」がインストールされた状態を作り出すレジストリファイル
scripts/sandbox.wsb Windows Sandboxの構成ファイル
setup/ 「みずいろ 初回版」のインストールディスクに含まれるファイル一式

ディレクトリ構造はこのようになっている。

C:\mizuiro-setup
│
├─scripts
│      install.reg
│      sandbox.wsb
│
└─setup
    │  arc.sar
    │  AUTORUN.INF
    │  d1_w0.sar
    │  d1_w1.sar
    │  d1_w2.sar
    │  d1_w3.sar
    │  d1_w4.sar
    │  d1_w5.sar
    │  jpgplgin.dll
    │  mizu.exe
    │  nscript.dat
    │  readme.txt
    │  scrunarc.dll
    │  Setup.exe
    │
    └─なにか
            1Mizuop.mp3
            readme.txt
            みずいろ宣伝用(320).avi
            みずいろ宣伝用(320).avi
            コメントとか.txt

まず、アンインストール処理を行うためにはインストールをしないといけないのだが、インストールにはディスク挿入が必要となる。 しかし、Windows Sandboxは光学ドライブを共有する機能は見当たらなかったため、仮想的にインストール完了された状態を作り出すことにした。 今回はアンインストーラーの挙動を調べることが目的なので、本当にインストールされている必要はない。

これは該当の2ちゃんねるのスレッドに情報が載っていたため、これと同じ挙動をする .reg ファイルを用意するだけでOKだった。

740 :名無しさん@初回限定:01/09/08 15:37 ID:dFKZFDNY
>>736
あ、それいいですね。
保証外&自己責任によるインスト・アンインストをまとめておきます。

-----インストール-----
*setup.exeを使う(藁
 中断しなければ大丈夫でしょう。
*最小手動インスト(声なし)
 適当なフォルダを作って、1枚目のすべてのファイルをコピー
*最大手動インスト(声あり)
 適当なフォルダを作って、1枚目2枚目のすべてのファイルをコピー
 テキスト形式で以下の内容のファイルを作ってダブルクリック(みずいろはNT,2000は保証外です)
 mizuFullInst.REG等のファイル名でどうぞ。

 REGEDIT4
 [HKEY_CURRENT_USER\Software\Nekoneko\みずいろ]
 "INSTALL"="FULL"
 "DIRECTORY"="C:\\Windows\\Temp\\"

この情報をもとにできたのが scripts/install.reg である。

"DIRECTORY"="C:\\mizuiro" としているが、これは存在しないディレクトリであれば何でもOK。 不具合を再現するためにはインストール先が存在しない必要があるからだ。

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Nekoneko\みずいろ]
"INSTALL"="FULL"
"DIRECTORY"="C:\\mizuiro"

そして、いちばん重要なのが scripts/sandbox.wsb である、これはWindows Sandboxの構成ファイルであり、特定のフォルダを同期しつつ安全な仮想環境を即座に作り出してくれる。

sandbox.wsbの中身はこのようになっている。scripts/以下は消されると困るので、ReadOnlyにしておいた。

<Configuration>
  <MappedFolders>
    <MappedFolder>
      <HostFolder>C:\mizuiro-setup\setup</HostFolder>
      <SandboxFolder>C:\setup</SandboxFolder>
      <ReadOnly>false</ReadOnly>
    </MappedFolder>
    <MappedFolder>
      <HostFolder>C:\mizuiro-setup\scripts</HostFolder>
      <SandboxFolder>C:\scripts</SandboxFolder>
      <ReadOnly>true</ReadOnly>
    </MappedFolder>
  </MappedFolders>
</Configuration>

アンインストーラーの起動と実行

scripts/sandbox.wsb を起動すると、仮想環境が立ち上がる。そこから scripts/install.reg を適用し setup/Setup.exe を起動すると「みずいろ」のアンインストール処理が開始できる状態となる。

f:id:castaneai:20200912181534p:plain

「削除」をクリックしてアンインストールを実行した。 すると、一瞬にして次のような画面になった。

f:id:castaneai:20200912181913p:plain

結果はこの通り。

  • setup/ 以下のファイルがほぼすべて消えた
  • ReadOnlyにしていた scripts/ 以下は残った
  • デスクトップのEdgeのショートカットまで消えた

1,2個めは想定通りの挙動である。やはりインストール先が存在しない場合、Setup.exeと同階層のフォルダを全消しするらしい。

しかし、3個めは想定外。なんとインストール先とは無関係のファイルまで消えた。 これはさすがに驚き。一体どんな処理が実行されたのか??

アンインストーラーのAPI呼び出しをトレース

インストール先、またはSetup.exeのあるフォルダとは無関係のファイルまで消える挙動をさらに追うため、 アンインストーラーがOSに対してどのような命令をしているのか詳しく調べることにした。

アンインストーラーがどのようなWindows APIを使っているかは2ちゃんねるの該当スレッドにも一部情報がある。

372 :364:2001/08/25(土) 23:49 ID:SCTB494w
なんとなくDiswinかけてみたよ(´ー`)ノ
んで、見てみると>>363氏の1は予想そのまんまだね。
RegQueryValueExでレジストリから引っ張ってきたディレクトリを
そのまんまFindFirst掛けて全消ししてる。

この書き込みとこれまでの推測情報をもとにして、API Monitorを仮想環境に導入し、次のAPIをトレースする設定を入れた。

  • FindFirstFile
  • FIndNextFile
  • SetCurrentDirectory
  • DeleteFile
  • RemoveDirectory

トレースするとアンインストーラーの挙動がかなり詳細に見えてきた。

まずは、最初の処理。SetCurrentDirectoryAでカレントディレクトリを設定しようとするも、失敗している。 そしてそのまま FindFitrstFileA("*.*") → DeleteFileA で現在の階層以下をすべて消している。

f:id:castaneai:20200912184142p:plain

よって、2ちゃんねるに書かれていた「カレントディレクトリをインストールフォルダに移動できなかった場合のチェックを 怠ってて」というのはほぼ正解だろう。

しかし、これだけでは無関係のファイルまで消えるという挙動にはつながらない。 ではこのAPIトレースの続きを見ていくとどうか?

f:id:castaneai:20200912184939p:plain

少し長いが、どうやらインストール先を消したあとに、スタートメニューのプログラムのショートカットも同時に消そうとする挙動にみえる。

今回はインストール先が C:\mizuiro の想定なので

  • SetCurrentDirectoryA("..") でひとつ上の階層に移動
  • RemoveDirectoryA("C:\\mizuiro") でインストール先のフォルダ自体を削除
  • SetCurrentDirectoryA("%APPDATA%\Microsoft\Windows\Start Menu\Programs\nekoneko\みずいろ") でスタートメニューのショートカットの場所に移動
  • 同様に FindFirstFileA("*.*") → DeleteFileA(...) で同階層以下を全消しする

そう、ここでインストール先自体を消すためにひとつ上の階層に移動している部分が重要だった。

そもそもいちばん最初の SetCurrentDirectoryA が失敗しているため、現在のフォルダは Setup.exe がある位置になっている。 ここからさらにひとつ上の階層に移動したあと、次にスタートメニュー以下のフォルダに移動しようとするのだが、それも存在しないとなると…?

カレントディレクトリは、Setup.exe のひとつ上の階層になったままなので、Setup.exe のあるひとつ上のフォルダを全消ししようとしてしまう。

よって、今回の検証の場合MappedFolderのひとつ上の階層であるデスクトップに移動され、Edgeのショートカットが消えた。

推測できるアンインストーラーの挙動

今回の検証から、アンインストーラーの処理をシェルスクリプト風に書いてみるとこのようになるのではないかと推測できた。

cd "C:\mizuiro" || true
rm -rf ./
cd ../
rmdir "C:\mizuiro" || true

cd "%APPDATA%\Microsoft\Windows\Start Menu\Programs\nekoneko\みずいろ" || true
rm -rf ./
cd ../
rmdir "%APPDATA%\Microsoft\Windows\Start Menu\Programs\nekoneko\みずいろ" || true

もちろんアンインストーラーのソースコードを持っているわけではないので、確実ではないがWindows APIの呼び出しまでトレースすることでかなり実装の詳細に迫れた気はする。

実際に被害を受ける条件

アンインストーラーの挙動を細かく見ると、たしかに無関係のファイルまで消す可能性があり危険だった。 ただ想定外のファイルまで消すという挙動を再現させるには、次の条件を満たさなければならない。

  • (レジストリに書かれた)インストール先が存在しない

また、Setup.exeの配置先よりも上の階層まで巻き込んで全消去する、まで再現させるには、もうひとつの条件も満たさなければならない。

  • "%APPDATA%\Microsoft\Windows\Start Menu\Programs\nekoneko\みずいろ" が存在しない

また、Setup.exeはディスクに入っているファイルであるため、通常であればディスクから直接実行するはず。 そうなると、Setup.exeの配置先は D:\ 等になり、Cドライブへの影響はないのではないか。

…とも思ったが、2ちゃんねるの書き込みを見ているとディスクからの実行時にはTempフォルダがカレントディレクトリになるようなので、ひとつ上の階層の C:\Windows が消されるのかもしれない。(Windows Sandboxではディスクのマウントが行えないため未検証)

511 :名無しさん@初回限定:01/08/30 22:05 ID:0yuAJV8g
(前略)

setup.exeはCDなどの書きこみできない場所から起動すると、
テンポラリに自身をコピーしてそれを呼び出し起動します。
#バイナリ比較で完全に同じ。2重起動はできない
ところがインスト時に”参照”した場合に限り自動削除されません。
テンポラリフォルダは標準でc:\windows\tempです。
…やめとく。確認とれてないので。

まとめ

この検証により、「みずいろ 初回版」のアンインストーラーは条件によっては無関係のファイルまで巻き込んで消去してしまうことが判明した。 たとえば、インストール先が存在しないという条件のもとで、Setup.exeをC:\に直接配置して実行すると、Cドライブを全消去しようとする。

つまり、「みずいろのアンインストール処理でHDDまるごと吹き飛ばす」という噂は(特定の条件を満たしていれば)正しいといえる。

また、現在はすでに公式サイトで修正されたSetup.exeが配布されておりこちらを使えばおそらく安全にアンインストールができる。