$Date:: 2010-01-08 11:50:37 +0900 #$ UNIX ドメインソケットのパーミッション このメモの目的 -------------- 2010 年の時点において、UNIX ドメインソケットのパーミッションを アクセス制御に使って安全だと言えるかを判断するための材料を記録。 自分がソフトウェアを書くときに ソケット自体のモードに依存するかどうかが興味の対象であり、 モードを無視する動作をセキュリティホールと呼ぶかどうかは問題にしない。 背景 ---- 昔の BSD ソケット API の実装では、 UNIX ドメインソケットのパーミッションは無視されていたらしい。 そのため、ソケットに対してアクセス制御したい場合は、 親ディレクトリを作ってそのモードで制御るすのがポータブルだと昔教わった。 現在の状況を知りたい。 事実関係 -------- 現在の実装はどうなっているか。 NetBSD 5.0 作成時: umask に従う。 アクセス時: write がチェックされる。 Debian/GNU Linux 5.0.3 (Linux 2.6.26) 作成時: umask に従う。 アクセス時: unix(7) には read/write と書いてあるが、 実際には write 権限のみチェックされる。 規格にはどう書かれているか。 SUSv4, XSH, connect() より引用: The connect() function may fail if: [EACCES] Search permission is denied for a component of the path prefix; or write access to the named socket is denied. "shall fail" ではなく、"may fail" である。 チェックするのは "write access" と書いてある。 なんと、そもそも上位ディレクトリの search チェック自体が "may" と読める。 Bugtraq 界隈 CVE に登録されているので、ここからリンクをたどった。 [1] http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-1999-1402 bugtraq 上のポストによると、本家 BSD は 4.4BSD でモードを見るようになった。 [2] http://marc.info/?l=bugtraq&m=87602167418368&w=2 [3] http://www.securityfocus.com/bid/456 によると、 FreeBSD 3.1 や Solaris 2.6 は "vulnerable" だが、 FreeBSD 3.2 や Solaris 7.0 は "not vulnerable" と書かれている。 しかし、FreeBSD の sys/kern/uipc_usrreq.c を見ると、rev1.1 の時点で すでに write をチェックしている。ただし、作成時に umask を見ない。 今公開されているリポジトリはライセンス問題後のものであり、 4.4BSD-Lite ベースなので、[2] の記述からしても順当。 rev1.23 や rev1.15.4.2 で umask を見るようになった。 リリース番号で言うと、2.2.4 は umask を見ないが 3.0 や 2.2.5 は見る。 これは [3] の FreeBSD の記述と合わない。そもそも 1997 年には FreeBSD 3.1 はまだ出ていないので、[3] は何か誤解しているだろう。 Solaris 2.5 はモードに従わない。モード 000 に変更してもアクセスできる。 親ディレクトリの search ビットを落とせばアクセスできない。 [4] http://marc.info/?l=bugtraq&m=87606769924198&w=2 Sun の人 (おそらく) によると、Solaris は互換性のためにモードは見ない ままだったが、xnet ライブラリではモードに従うようになった。 [5] http://marc.info/?l=bugtraq&m=87615352402535&w=2 Linux は 1997 年に bugtraq で話題になった時点で、モードに従っていた。 [6] http://marc.info/?l=bugtraq&m=87602167418365&w=2 # umask は未調査。 まとめ ------ umask に従うかどうかと、アクセスするときにモードに従うかどうかの 2 種類の問題が混ざっている。 実装状況: 太古の BSD (4.3BSD?), Solaris 2.5 umask、モードともに無視する。 4.4BSD, FreeBSD 2.2.4, NetBSD 3.0 umask を無視する。モードに従う。 FreeBSD 2.2.5, Solaris 7.0, OpenBSD 2.0, NetBSD 3.1 umask、モードともにに従う。 Linux (すくなくとも 1997 年までには) モードに従う。 SUSv4 はアクセス制御を強制していないように読める。 Solaris 以外の商用 UNIX の状況に関する情報は見つからなかった。