C:\ の直下にはインストールしない方がいいと思う

最近はあまり見ないが、インストール先を C:\ の直下にしようとするインストーラやインストールインストラクションがある。
C:\ の直下がゴチャゴチャするのが何となく嫌なので、この手のソフトウェアは C:\opt というディレクトリの下にインストールしている。そう、今まではただ「何となく」こうしていたのだが、先日、「実はこうしないとヤバいんじゃないの?」と思うところがあったので、日記にでも書いてみることにした。
結論から言うと、こういうことだ:

  • C:\ の直下にインストールしちゃうと、そこのバイナリとか誰でも書き換えられちゃいませんか?

Windowsパーミッション設定をよく理解できていないのかもしれないが、つい先日 32ビット版の Windows Vista Business をクリーンインストールしたばかりのこのマシン、Authenticated users グループに C:\ の直下への書き込み権*1がある。そんな設定をわざわざやった覚えはないので、多分デフォルトなんだろう。
で、Windows では、ディレクトリの中にファイルやサブディレクトリを作ると基本的には親ディレクトリの ACL が引き継がれる。だから、C:\foobar みたいなところにアプリケーションをインストールしてしまうと C:\foobar には要するに誰でもが書き込めるようになってしまう。C:\foobar\foobar.exe の内容だって変更し放題だ!!
これはもう、トロイの木馬を仕込んでくれと言っているようなものじゃないのか!? 他にも、C:\foobar\bin を PATH に加えてたりしたら「DLL インジェクション、歓迎です」ってことじゃないのか!?
C:\Program Files 以下では、もちろんそんなことはない。管理者以外には、書き込み権なんて当然無い。これこそ、誰でも書き換えられる C:\ の直下にはアプリケーションなんてインストールしてはダメってことの現れなんじゃないだろうか。
もちろん、C:\opt を作るだけではダメで、ちゃんとしたパーミッションの設定をしないといけない。ポチポチ設定するのもいいが、お手軽なのは C:\Program Files の ACL をコピーすること。これには、いったん C:\Program Files\opt を作ってからこの opt を C:\ の直下に移動すればいい。ただし、C:\Program Files の下にあるときに opt の ACL 設定で「このオブジェクトの親からの継承可能なアクセス許可を含める」を外して ACL をコピーしておくのを忘れてはならない。
「そこまでするんなら C:\Program Files にインストールすればいいのに」と思われるかもしれないが、C:\ の直下へのインストールを案内しているソフトウェアには「インストール先のパス中に空白があるとダメ」というのがあったりするのである*2

*1:Windows の場合「書き込み権」にも色々あって複雑なんだけど、まあいい。

*2:XP までの「Documents and Settings」とかいう狂気の沙汰としか思えないディレクトリ名が Vista で「Users」になったのは大変な改善だ。