どさにっきクラウド 〜2009年8月上旬〜

by やまや
<< = >>

2009年8月10日(月)

setuid なスクリプト

_ perl やら ruby やら sh やらのスクリプトは、chmod u+s しても効果がない。バイナリな実行ファイルでないと、OS は setuid/gid フラグを無視してしまって意図した権限で実行してくれない。それを許すと 穴になるからしかたないというのは承知してるけどさ、どーしてもやりたいこともあるわけで、そのたびごとに C のラッパーを書くのはめんどくさい。仕事だからやるけどさ。

_ ので書いた。仕事おわり。以下余談。

_ setuid されたスクリプトを動かしたいけど動かないので、perl では suidperl という専用ラッパーを提供してこれを回避する。OS は setuid/gid フラグを無視してフラグがないときと同じように実行するけど、suidperl はスクリプトのパーミッションを調べて +s なビットが立っていたら権限をそのとおりに合わせてからスクリプトの処理をはじめる。よって、suid/gid された perl スクリプトもちゃんと動く。めでたしめでたし。

_ が、そういえば、mount にはスクリプトだけではなくバイナリな実行ファイルの setuid/gid フラグも無視するオプションがあるなー、と思いだした。mount -o nosuid でマウントしても、suidperl 自体が nosuid でないところに置いてあったら、nosuid な領域に置いてある suid なスクリプトが動いちゃうんじゃね?

_ と思って mount の man を確認してみたら、たしかに suidperl がインストールされてたらあかんでー、と書いてあった。うはー。便利なつもりで穴開けてどーする。

_ さらに perl の方を調べてみたら、どうも 5.005 でちゃんと対策されたようで、スクリプトの置いてある場所が nosuid オプションでマウントされてたらちゃんと無視するようになってた。さすがにわしでも思いつくような初歩的な穴はちゃんとふさいであるか。逆に言えば、それより古いバージョンの suidperl が入っていれば危険。

_ ただ、気になる点もいくつか。Linux の man mount には、「suidperl が入ってると nosuid はかなり危険(rather unsafe)」とある。nosuid でも suid で実行されてしまうということは、nosuid オプションがないときと同じなので「nosuid の意味がない」という表現ならわかる。が、そうではなく nosuid オプションを指定すると指定しないときより危険度が増すようかのようにも読めるんだけどどゆこと? また、10年前にすでに対策が済んでいるはずの穴がいまだに mount の man では名指しで注意喚起されているのはどういうこと? そして、suidperl は便利で(ほかに穴がなければ)無害なはずだと思うんだけど、標準でインストールされるわけではない。なんだろう。わしが気付いてない suidperl の罠がほかにもまだありそうな気がする。大丈夫かしらん。

_ ま、実際のところわしゃ perl でスクリプトを書くことなんかないから関係ないけどな。必要ならまた C でラッパー書くよ。めんどくさいけど。


<< = >>
やまや