Tetsuo Handa
from-****@i-lov*****
2006年 3月 27日 (月) 20:15:05 JST
バージョン 1.1 の内容が確定したのでお知らせします。 バージョン 1.1 では以下の機能が強化されました。 バージョン 1.0.2 までは write 権限により可能になる操作の種別を 区別できませんでした。 バージョン 1.1 では write 権限は open(O_WRONLY) open(O_RDWR の WR 部分) sysctl(WRITE) だけを指すようにして、新規に allow_mkdir allow_rmdir allow_unlink allow_mksock allow_mkfifo allow_mkchar allow_mkblock allow_link allow_symlink allow_rename allow_create allow_truncate という(細分化された書き込み)権限が導入されます。 これにより、「通常のファイルを削除して同名のデバイスファイルを作成する」といった 攻撃が困難になります。 また、バージョン 1.0.2 までは自プロセスに関する情報にアクセスするためには 「/proc/\$/」というパターンで始まるアクセス許可を与える必要がありました。 これは、「/proc/self」が「/proc/自プロセスのプロセスID/」への シンボリックリンクとして実現されているためです。 そのため、自プロセスに関する情報にだけアクセスできれば良い場合であっても 他のプロセスに関する情報にもアクセスできるようなアクセス許可が与えられていました。 バージョン 1.1 では、自プロセスに関する情報にアクセスする場合は 「/proc/self/」というパターンで始まるアクセス許可を指定できるようになります。 これにより、必要が無ければ自分以外のプロセスに関する情報へのアクセスを 禁止することが可能になります。 また、 allow_read で /proc/self/ ディレクトリ以下のファイルを指定することで、 /proc/mounts 等へのアクセスを学習しきれなかったことが原因によるエラーを回避できます。 バージョン 1.1 では以下の不具合が修正されました。 ・「\*」が「次の / までまたは末尾までの0文字以上」に 対応するワイルドカードであるため、 PathMatchesToPattern("/tmp/", "/tmp/\*") が true に なっていました。しかし、ディレクトリと非ディレクトリの 比較であるため、( \* が末尾までの0文字に対応しているけれども) この比較は一致すべきではないと判断し、修正しました。 修正前の PathMatchesToPattern() では以下の誤動作が発生します。 「2 /tmp/\*」というアクセス許可が与えられている場合、 「mkdir /tmp/」および「rmdir /tmp/」が許可されてしまいます。 「file_pattern /tmp/\*」というパターンが与えられていた場合、 「mkdir /tmp/」または「rmdir /tmp/」に対して 「2 /tmp/\*」というアクセス許可が学習されてしまいます。 ・GetAbsolutePath() の中で vfsmount_lock を掛け忘れていました。 カーネル 2.6 系で SMP マシンで動作させる場合のみ影響があります。 ・Shared Subtree 用のマウントオプションを認識できるようにしました。 カーネル 2.6.15 では Shared Subtree という機能が追加されましたが、 CheckMountPermission() が Shared Subtree 用のマウントオプションを 認識できませんでした。 ・アドレス種別をチェックした上でポート番号のチェックを行うようにしました。 与えられたアドレスの種別が AF_INET または AF_INET6 の場合のみ CheckBindEntry() および CheckConnectEntry() で ポート番号をチェックするようにしました。 アドレス種別として例えば AF_UNSPEC が与えられた場合、 ポート番号をチェックするのは正しくありません。