区切り文字の項目でも説明したように、Mac OSのToolboxではHFSの特性にべったりと依存した「親フォルダのCNID」と「ファイル名」に基づいたアクセスが行われていた。CNIDはHFS Plusのボリュームで一意の番号のため、これにボリュームを識別するIDを加えることでMac世界でのファイルを一意に指定する方法となる。これがFSSpecという構造体だ。これはCoreServices/Files.hでリスト2のように定義されている。
struct FSSpec {
short vRefNum;
long parID;
StrFileName name; /* a Str63 on MacOS*/
};
Toolboxベースのアプリケーションのファイルアクセス機能は、FSSpecないしはそれを受け継いだFSRefという構造体に強く依存している。一方、Mac OS XではパスをベースとするBSDレイヤーのシステムコールを経由してのみファイルにアクセスできる。このギャップを埋めるため、Mac OS XのBSDレイヤーには、Carbonサポート用の抜け道が用意されている。
1つはMac OS X独自のsearchfs(2)システムコールだ。これはHFS Plusの強力な検索機能を直接呼び出すシステムコールである。使い方はかなり難儀なので、詳細はman searchfsをよく読んでみてほしい。なお、このシステムコールはHFS、HFS Plusといったファイルシステムに対してのみ有効である。
もう1つの抜け道がvolfsだ。これは通常/.volというパスにマウントされている。
実行例2の最初のコマンドの結果を見ると分かるように、数字だけのディレクトリがあり、その下には何も表示されず、一見すると空ディレクトリに見える(実行例2、2番目の実行結果)。だが、ある数値を指定するとその下にファイルが表示され、数値/ファイル名でファイルにアクセスできる。
$ ls /.vol/
234881026 ←数字だけのディレクトリがある
$ ls /.vol/234881026/ ←空ディレクトリのように見える
$ ls /.vol/234881026/5484910/ ←ある数値を指定するとファイルが表示される
Makefile nfs_boot.c nfs_socket.c nfs_vnops.c nfsproto.h
krpc.h nfs_lock.c nfs_srvcache.c nfsdiskless.h nfsrtt.h
krpc_subr.c nfs_lock.h nfs_subs.c nfsm_subs.h nfsrvcache.h
nfs.h nfs_node.c nfs_syscalls.c nfsmount.h rpcv2.h
nfs_bio.c nfs_serv.c nfs_vfsops.c nfsnode.h xdr_subs.h
そう、この数値はディレクトリに対するCNID*であり、最初の数値はボリュームに対するIDである。つまり、
/.vol/<ボリュームID>/<ディレクトリのCNID>/ファイル名
というパスを使うことで、FSRef、FSSpecをパスに写像し、Toolbox的なファイルアクセスを通常のUNIXのシステムコールで実現するのが、このvolfsの機能なのだ。
なお、通常のパスによるアクセスの場合、最終的なファイルへのアクセスのためには、そこに至るすべてのディレクトリのアクセス権限が必要になる。つまり、例えファイル自身のアクセス権限が777、world writableであっても、その上位ディレクトリのいずれかのパーミッションでアクセスを制限していれば、実質的にこのファイルは操作できない。
しかしMac OS Xでは、volfsを通じることで直上ディレクトリ以外の階層のアクセス権を無視できる(図1)。Mac OS Xのこのvolfsの特性について注意しないと、思わぬセキュリティホールが生じる可能性*があるので、くれぐれも注意してほしい。
次回は、Mac OS Xになって採用されたHFS Plus独自の機能について、またHFS PlusがどうやってUNIX的な枠組みと親和しているのか解説しよう。
ディレクトリやファイルに対するCNIDは、UNIXコマンドからはiノード番号とみることができる。具体的には、lsコマンドの場合「-i」オプションを付加することでiノード番号が表示されるが、それがCNIDだ。
アスキー発行の『BSD Magazine』 Vol.12(ISBN4-7561-4103-X)に掲載された、「volfsを経由したファイルアクセスの危険性について」を参照。なお、AppleとしてはこれはMac OS Xの仕様であり、脆弱性とは見なさないという回答をもらっている。
本記事は、オープンソースマガジン2006年3月号「Undocumented Mac OS X」を再構成したものです。
Copyright © ITmedia, Inc. All Rights Reserved.