納得するかどうか、の話

私のノートPCでは、実行パス中でsetuid rootされている実行ファイルは(驚くことなかれ!)44個もある。ちなみにFedora(coreutils-5.0-24)ではsetuidされている実行ファイルはcolorlsで赤地に白抜きで表示される(むちゃくちゃ目立つ)。RedHat8.0(fileutils-4.1.9)とかでは普通の実行ファイルと同じ。dircolorsの設定の違いかとも思ったがどうもそうじゃないみたい。

setuid rootなんてsuとsudoとpasswdくらいで充分ではないかと思うのだがそうは問屋がおろさない。それぞれ由来を調べたくなってくる。

例えば/usr/bin/gpgはsetuid rootされている。なんぞ、暗号化ごときが! と思うのだが、落としてみたらメモリがヤバい、なんていう感じのワーニングが出る(動作はする)。そしてsetuidの理由は以下のように記されている。

GnuPG Frequently Asked Questions – GnuPG.org(gnupg.org)より。

On many systems this program should be installed as setuid(root). This is necessary to lock memory pages. Locking memory pages prevents the operating system from writing them to disk and thereby keeping your secret keys really secret. If you get no warning message about insecure memory your operating system supports locking without being root. The program drops root privileges as soon as locked memory is allocated.

要約すると、mlock()しとかないとメモリはスワップされてしまうし、スワップされたメモリに秘密鍵があった場合にヤバい、とのこと。すぐにrootの権限は落とすので問題ないよ、と主張している。straceで見てみると確かにmlock()している。(strace経由だとsetuid rootされないみたいでmlock()は失敗している。)じゃあsshやssh-agentはどうかというとこいつらはsetuid rootはされていない。し、信じるものか!(笑) でも、どっちかの態度が間違っているに違いないよね。

余談だがsetuidにも良いところがあって、もちろん利便性もそうだけど、setuidやsetgidしているとLD_PRELOADが効かなくなる、というのもある。妙なシェアードライブラリを仕込まれても勝手に使えなくしてくれるわけだ。それでもやはりこのビットはやたらに立っていないほうが安心できる。

他にもすでに遺物に近いrsh/rloginがsetuid rootされている。こいつらはsetuidビットを落としても動くし文句も言わない。ただ、strace経由で実行すると動作に失敗する。mlock()に失敗したのでないことは確かだがよくわからなかった。低いポートに(?)bind()しようとしてEACCESSをもらっているみたいな感じだ。な、なぜrshがbind()に失敗!? これもなんか信用できない(笑)。rsh/rloginについてはsetuidするべきじゃないような気がする。

こういう感じで、いろんなソフトを調べていくと納得のいかない挙動も多い。↑のように表面的なことだけではなくて、本当にちゃんと調べれば納得するのかもしれないけど、気になってしょうがないこともある。逆に、POPのパスワードみたいなものをクライアントに記憶させておくときにローカルファイル上で暗号化しておく(=セキュリティ上は全く意味がない)ように、見せかけのセキュリティで満足させてしまうようなソフトもあるので油断ができない。MacOSの(今はどうか知らないけど)パスワードチェインみたいなのがあると意味があるんだけど。

setuid rootの理由は使いたいシステムコールの制限というのも目立つような気がする。sched_setscheduler()とかsetpriority()とかmlock()とか、別にrootじゃなくても使わしてくれよ、という機能も多いんだよね。こいつらは無制限に使えたら使えたでユーザからヘボいと思われてしまうから難しい。だから、「rootかそれ以外か」じゃなくて細かい制御ができるものも出てきている。複雑になるとイヤだけど、しょうがないのかな。

rootの権限については、世の中にはpamとconsolehelper(usermodeというソフトの一部)みたいな仕組みもあって、これはなかなか便利だと思う。sudoを自動的にさせるような感じの機能として使える。もし興味があったら、このへんを参照するといいかもよ。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です