ようするに /tmp に symlink があるときに、ownerが自分じゃないときはrootであってもsymlinkたどれないようにするよ。というパッチである
背景なんですが、Unixの古典的なセキュリティーホールにrootが O_EXCL つけずに/tmp以下のファイルを開くとアタッカーに利用されて脆弱性になるというものがありまして、古典的には以下のストーリー
1.悪意のあるユーザ Bob が ln -s /etc/passwd /tmp/app-A-tmpfile とかリンクを貼る
2.root権限をもったデーモンアプリが /tmp/app-A-tmpfile を O_EXCL なしで開く(そして成功する)
3.そのアプリが今開いたtmpファイルに適当にデータを書く
4.なぜか /etc/passwdが破壊される ← イマココ
O_EXCL以外の方法、たとえばstat(2)とかで確認するのはタイミング的に穴があってだめなのだが、この手のミスが一向になくならずに毎年おんなじセキュリティーホールが量産されてるのが現状である。
なおこのsymlink traversal 脆弱性については田中哲先生の以下のの解説が詳しい
http://www.ipa.go.jp/security/fy20/reports/tech1-tg/2_05.html
で、まあ、この動作はPOSIX準拠に必要なのでどんなにクソであってもサポートしなくちゃいかんというのが頭の痛いところでしてね。Plan9だと/tmpがユーザ毎に別ネームスペースだからこういう問題がおきないんだけど、Unix系では一部のアホアプリが/tmp以下にIPC的に使うファイルを作ることがあるので勝手にisolateするとアプリが動かなくなるとかなんとか。まあ死ねという話です。
さて、世の中にはPOSIXなんか無視しちゃえばいいじゃん。アプリ壊れてもいいじゃん。セキュリティー重要とか言い出す極右というか空気が読めないというかそういう方々がいます。Keesさんもそのうちの1人。
表題の彼のパッチはなにをやっているかというと
・ sticky bitが立っていて、かつworld writableなディレクトリ(普通のシステムではtmp dirしかないはず)
に直下にsymlinkがあるときは、は通常のアクセス権チェックとは別に
symlinkのuidとプロセスのuidが一致するかを調べ、不一致の時はリンクたどる処理が失敗する
(openとかstatとかのPATHを引数にとるシステムコールに対してEACCESSが返る)
・ /proc/sys/fs/protected_sticky_symlinks に0を設定すると従来の動作に戻る
とかいう処理
パッチ全体は以下を参照。
http://lwn.net/Articles/470891/
正直あんまり筋のいい解決方法とは思えないのだが
1.全アプリが気をつけないといけない状況だと次から次へと五月雨式にアホアプリが出てきてきりがない
2.Openwall と grsecurity で以前から使われており大きな問題は起きていない
というあたりで通った。
僕はこのパッチあんまり好きじゃないんだけどLinusがこのパッチをボロクソにけなしてたときに、Linusのカウンタープロポーサルを撃沈して流れを変えちゃったんだよなあ。ちょっと後悔
だれか、いまの仕様の問題点に気がついたら教えてください。ではでは
背景なんですが、Unixの古典的なセキュリティーホールにrootが O_EXCL つけずに/tmp以下のファイルを開くとアタッカーに利用されて脆弱性になるというものがありまして、古典的には以下のストーリー
1.悪意のあるユーザ Bob が ln -s /etc/passwd /tmp/app-A-tmpfile とかリンクを貼る
2.root権限をもったデーモンアプリが /tmp/app-A-tmpfile を O_EXCL なしで開く(そして成功する)
3.そのアプリが今開いたtmpファイルに適当にデータを書く
4.なぜか /etc/passwdが破壊される ← イマココ
O_EXCL以外の方法、たとえばstat(2)とかで確認するのはタイミング的に穴があってだめなのだが、この手のミスが一向になくならずに毎年おんなじセキュリティーホールが量産されてるのが現状である。
なおこのsymlink traversal 脆弱性については田中哲先生の以下のの解説が詳しい
http://www.ipa.go.jp/security/fy20/reports/tech1-tg/2_05.html
で、まあ、この動作はPOSIX準拠に必要なのでどんなにクソであってもサポートしなくちゃいかんというのが頭の痛いところでしてね。Plan9だと/tmpがユーザ毎に別ネームスペースだからこういう問題がおきないんだけど、Unix系では一部のアホアプリが/tmp以下にIPC的に使うファイルを作ることがあるので勝手にisolateするとアプリが動かなくなるとかなんとか。まあ死ねという話です。
さて、世の中にはPOSIXなんか無視しちゃえばいいじゃん。アプリ壊れてもいいじゃん。セキュリティー重要とか言い出す極右というか空気が読めないというかそういう方々がいます。Keesさんもそのうちの1人。
表題の彼のパッチはなにをやっているかというと
・ sticky bitが立っていて、かつworld writableなディレクトリ(普通のシステムではtmp dirしかないはず)
に直下にsymlinkがあるときは、は通常のアクセス権チェックとは別に
symlinkのuidとプロセスのuidが一致するかを調べ、不一致の時はリンクたどる処理が失敗する
(openとかstatとかのPATHを引数にとるシステムコールに対してEACCESSが返る)
・ /proc/sys/fs/protected_sticky_symlinks に0を設定すると従来の動作に戻る
とかいう処理
パッチ全体は以下を参照。
http://lwn.net/Articles/470891/
正直あんまり筋のいい解決方法とは思えないのだが
1.全アプリが気をつけないといけない状況だと次から次へと五月雨式にアホアプリが出てきてきりがない
2.Openwall と grsecurity で以前から使われており大きな問題は起きていない
というあたりで通った。
僕はこのパッチあんまり好きじゃないんだけどLinusがこのパッチをボロクソにけなしてたときに、Linusのカウンタープロポーサルを撃沈して流れを変えちゃったんだよなあ。ちょっと後悔
だれか、いまの仕様の問題点に気がついたら教えてください。ではでは